当前位置:首页 > 工业控制 > 工业控制
[导读]6轴机械臂同步不是“6个轴各自走到目标角”就完事。真同步是:同一时刻发指令、同一控制周期更新、各轴按轨迹比例协同到位,末端轨迹不扭、不抖、不超前滞后。 多轴联动的本质是插补+时间同步,伺服闭环只解决单轴跟踪,轴间协同靠上层轨迹规划和同步补偿。


6轴机械臂同步不是“6个轴各自走到目标角”就完事。真同步是:同一时刻发指令、同一控制周期更新、各轴按轨迹比例协同到位,末端轨迹不扭、不抖、不超前滞后。 多轴联动的本质是插补+时间同步,伺服闭环只解决单轴跟踪,轴间协同靠上层轨迹规划和同步补偿。

一、架构:上层规划+底层轴控分离

硬实时别全压Linux:

上层(SoC/PLC):逆解、轨迹规划、插补、HMI,周期10~50ms

运动控制器/MCU:接收各轴目标,周期1ms

伺服驱动器:位置/速度/电流环,总线周期125μs~1ms

EtherCAT分布式时钟把各从站对齐到1μs内,否则高速段末端会偏。

二、虚拟主轴统一节拍

6轴别互相盯,建一个虚拟轴当“节拍器”:

typedef struct {

   float pos;      // 虚拟轴位置 0~1 表示段进度

   float vel;

   float acc;

} virt_axis_t;


typedef struct {

   float kp[6];        // 各轴位移系数

   float fb[6];        // 实际关节角

   float cmd[6];      // 输出指令

   float sync_err[6]; // 轴间偏差

} axis_group_t;

虚拟轴走S型速度曲线,各关节目标 = 起点 + (终点-起点)*虚拟轴pos。

三、插补:直线/圆弧按周期出点

1ms周期里算一次各轴目标增量:

void interp_1ms(axis_group_t*g, traj_t*t, virt_axis_t*v){

   v->pos += v->vel * 0.001f;

   for(int i=0;i<6;i++){

       float target = t->j_start[i] + (t->j_end[i]-t->j_start[i]) * v->pos;

       g->cmd[i] = target;

   }

}

X/Y/Z直线是这样,圆弧走圆心参数化,逆解后同样灌进6轴目标。插补周期越短轨迹越顺,但别在ISR里跑逆运动学浮点大矩阵,提前算好查表更稳。

四、同步误差:偏差耦合补偿

单轴PID只管自己,6轴协同要靠轴间偏差:

void sync_correct(axis_group_t*g){

   float mean = 0;

   for(int i=0;i<6;i++) mean += g->fb[i];

   mean /= 6;

   for(int i=0;i<6;i++){

       float e = g->cmd[i] - g->fb[i];        // 本轴跟踪误差

       float cross = g->fb[i] - mean;         // 相对其余轴偏差

       g->sync_err[i] = e + 0.3f*cross;       // 偏差耦合项

       g->cmd[i] += 0.1f * g->sync_err[i];    // 补偿指令

   }

}

偏差耦合比纯主从稳,某轴负载突变更不容易把末端拽偏。

五、电子齿轮:飞手/传送带跟踪用

主从跟随别直接乘系数硬切:

进入同步前先“相位追赶”,从轴速度平滑靠到主轴

退出同步也缓出,别瞬切

齿轮比用累加器处理分数比

机械臂本体一般走插补,外围输送线/变位机才用电子齿轮跟主轴。

六、1ms调度骨架

void motion_1ms(void){

   read_encoders(g.fb);          // 编码器回读

   if(state==RUNNING){

       virt_step(&v);            // 虚拟轴推进

       interp_1ms(&g, &traj, &v);// 插补出目标

       sync_correct(&g);         // 轴间补偿

       for(int i=0;i<6;i++)

           servo_set_target(i, g.cmd[i]);

   }

   monitor_sync(&g);             // 超差/失步检测

}

急停/使能异常时清虚拟轴vel、发零速指令,别等上位机超时。

七、落坑清单

各轴独立定时发目标→相位错开轨迹扭

插补在Linux线程里跑→jitter拖尾

主轴硬切电子齿轮→从轴猛冲

只调单轴PID不补轴间误差→末端轮廓偏

逆解放1ms中断里→WCET爆周期

编码器只取电机端→减速器回差没消

虚拟轴vel不减到0就换向→过冲

EtherCAT DC没开→多轴时钟漂

失步不降级→臂抖着继续走

急停走HMI按钮→现场停不住

八、落地顺序

定控制周期:轴控1ms,插补跟周期同拍

建虚拟轴做统一进度,S型加减速

笛卡尔轨迹→逆解→6轴目标表

每周期同刻下发,EtherCAT DC开起来

单轴PID先稳,再加偏差耦合项

轴间同步误差上阈值报警

电子齿轮只用于外部跟随轴

急停/抱闸/使能锁走硬件DI

6轴同步的命脉是“时间对齐+轨迹同源”:虚拟轴统一节拍,插补出各关节目标,周期边界同刻下发,轴间偏差耦合兜负载不均。伺服再好也救不了上层各发各的指令;Linux再快也别碰硬实时轴控环。工程里常见做法是上层算路径、MCU/运动卡做插补同步、驱动器跑三环——这三层边界清楚,机械臂末端才可能稳在亚毫米级;剩下抖动靠偏差耦合和前馈摩擦力补偿收尾,不是靠把PID增益拉爆。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭