工业控制多轴协同编程:实现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增益拉爆。





