去年调一台四关节专用机械臂,单轴测试时每根轴的阶跃响应都很漂亮,超调小、无静差,我当时觉得这事儿差不多稳了。结果一带联动轨迹,末端画直线是弯的,画圆是个歪椭圆,低速还能看,一提速度轮廓误差直接没法看。查了一圈才明白,锅不在单轴性能,而在"同步"。

这篇文章把多关节(多轴)同步控制的常见方法梳理一遍:从最朴素的主从结构,到经典的交叉耦合控制,再到偏模型的自适应/鲁棒方案,最后说说工程上真正容易翻车的几个点。文中提到的方法大都有几十年的文献积累,文末列了几篇代表性的,想深入的同学建议按图索骥。

1. 为什么会不同步

先看机理。机器人每个关节的负载、减速比、电机功率往往不一样,即使标称"相同"的关节,装上臂件之后实际惯量也差得远。同样一条轨迹下发下去,惯量小的轴先到,惯量大的轴滞后,而末端位姿是所有关节位置的运动学合成——任何一根关节的滞后,都会在末端体现出来。

把误差分开定义会清楚一些:

跟踪误差:各关节跟随自身给定轨迹的偏差,ei = qi* − qi;
同步误差:关节之间相对位置的偏差,εij = ei − ej(等速协调时)。

传统单轴控制再好,压低的也只是各个 ei,因为各轴误差大小、相位都不一样,ε 未必小。同步控制的本质,是把"各轴各自跟自己的给定"改成"所有轴作为一个整体去跟一个任务"。

补充一点:机械臂和普通多轴机床(比如十字滑台)还不完全一样。机械臂关节之间存在动力学耦合——质量矩阵的非对角项、科氏力、重力项,一个关节运动会"拽"着别的关节。所以机械臂的同步控制理论上要难一档,这也是后面模型派方法存在的理由。

2. 主从控制:最直觉的方案

最古老也最常用的做法。主轴按规划值跑,从轴的给定不是自己的规划值,而是主轴的实际位置(乘以要求的传动比)。这样从轴永远以主轴的实际状态为基准,两者不会散开——代价是从轴永远滞后主轴一个跟踪误差的量级。

工程里电子齿轮(Electronic Gearing)就是主从的特例,主流 CANopen/EtherCAT 驱动器都自带这个功能,设个齿轮比就能用,调试量接近于零。

优点明显,缺点也明显:

  1. 从轴的跟踪误差直接变成同步误差,主从结构本身不消减它;
  2. 响应不对称:主轴受扰动,从轴跟着晃;从轴受扰动,主轴无感;
  3. 主从地位固定,不适合运行中负载/角色会切换的场合。

有个变种叫双主从(A 跟 B 的实际位置、B 跟 A 的实际位置),理论上对称性好一些,但两根轴互相追,增益稍微一大就振荡,实际工程里很少直接用。

适用场景:变位机、随动工位、传送带同步这类对相位一致性有要求、但对绝对节拍不苛刻的场合。如果对轮廓精度要求进到毫米级以内,单靠主从一般不够。

3. 交叉耦合控制(CCC):绕不开的经典

1980 年 Koren 为多轴机床提出来的,四十多年过去仍然是教科书内容。核心思想一句话就能说清:不再把各轴误差独立反馈,而是定义一个同步(轮廓)误差,让这个误差参与所有轴的控制律。

以两轴等速协调为例,同步误差:

ε=e1−e2\varepsilon = e_1 - e_2ε=e1e2

把每轴反馈的误差改造成:

e1′=e1+β1ε,e2′=e2−β2εe_1' = e_1 + \beta_1 \varepsilon,\qquad e_2' = e_2 - \beta_2 \varepsilone1=e1+β1ε,e2=e2β2ε

直觉上很好理解:假设轴 1 滞后更多(e1 > e2,滞后记为正),那么 ε > 0,改造后轴 1 的误差被放大(使劲追),轴 2 的误差被缩小(等一等),两个轴互相拉扯着对齐。β = 0 时退化为独立控制,β 越大同步误差压得越死。

放一段示意代码,双轴、1kHz 周期调用的结构:

/* 双轴CCC核心,控制周期内调用一次
 * e1/e2: 各轴跟踪误差(务必折算到同一量纲后再进来)
 * beta:  耦合增益,0.2起步往上调
 */
void sync_ctrl_tick(double e1, double e2, axis_t *ax1, axis_t *ax2)
{
    double eps = e1 - e2;                    /* 同步误差 */

    ax1->ec = e1 + ax1->beta * eps;          /* 落后的轴加把劲 */
    ax2->ec = e2 - ax2->beta * eps;          /* 超前的轴松一点 */

    ax1->u  = pi_step(&ax1->pi, ax1->ec);    /* 各自过自己的环 */
    ax2->u  = pi_step(&ax2->pi, ax2->ec);
}

实际效果:文献和实测里轮廓精度普遍能提升 2~5 倍,尤其是加速度段,独立控制误差发散的地方 CCC 能拉回来不少。

它的短板也要说清楚:

  • 多于 3 轴时,耦合矩阵(决定谁跟谁、按什么比例耦合)没有系统的设计方法,基本靠经验和试凑;
  • 原始 CCC 针对恒速/线性系统,高动态段效果打折,通常要配合速度/加速度前馈;
  • β 是个"全局性"的参数,负载变化大的工况下固定 β 会顾此失彼,有变增益的做法,复杂度上去了。

一个重要的变体是 相邻交叉耦合(ACCC),Yeh 和 Hsu 做过系统工作:第 i 轴只和相邻的 i−1、i+1 轴耦合,控制器复杂度从 O(n²) 降到 O(n)。代价是同步误差收敛慢一些、依赖轴的排列顺序。多工位环形设备(转盘式的)用得比较多。

再往下还有一类做法是把 ε 定义成轮廓误差(实际点相对期望轮廓的最短距离)而不是简单的速度差,这样耦合的物理意义更贴近加工精度,但任意曲线的轮廓误差不好算,一般用局部圆弧拟合近似,计算量上去了。

4. 偏模型的一派:自适应、鲁棒、学习

前面方法基本不碰机器人动力学模型。另一派把关节动力学方程写进来:

M(q)q¨+C(q,q˙)q˙+G(q)=τM(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tauM(q)q¨+C(q,q˙)q˙+G(q)=τ

大致三条路线:

(1)计算力矩 + 同步补偿。 先用计算力矩控制把每个关节的名义动力学解耦线性化,剩余的按独立通道处理,同步误差再用耦合项去压。名义模型准的时候效果好,参数不准(负载估计错、臂件换装)就退化。工业机器人本体厂的原生控制器基本是这个路子再加各种补偿。

(2)自适应同步控制。 把参数不确定性交给自适应律,跟踪误差和同步误差一起进 Lyapunov 函数,稳定性有证明。Sun Dong 教授这条线的工作很有代表性(包括多机器人协调装配)。缺点是自适应律的增益调起来麻烦,瞬态性能不一定好看,仿真论文多、工程落地相对少——不是方法不行,是整定和维护成本高。

(3)滑模/鲁棒控制。 对付大范围负载变化直接有效,但抖振是个绕不开的问题,边界层、高阶滑模各种改法都有。工业场合真的直接上滑模的其实不多,更多是做弱化处理或者混合结构。

另外两个工程上真正高频使用的手段,严格说不算"同步方法",但作用极大:

  • 前馈:速度/加速度前馈能把相位滞后补掉一大块,同步误差天生变小。这是性价比最高的一招,很多所谓的"同步问题"加了前馈就消失一半;
  • 迭代学习控制(ILC):轨迹严格重复的场合(上下料、点胶、注塑机械手)非常好用,跑几十个循环把误差学掉,最终精度可以压到非常低。前提就一条:轨迹必须重复、扰动有界。

再新一点的还有 MPC 做多关节协调的(把各关节速度/力矩约束和同步误差一起塞进滚动优化),算力够的话效果不错,但在中低端嵌入式控制器上还不现实,目前更多用在轨迹规划层。

5. 时间同步还是空间同步

这个问题平时容易被忽略。插补有两条路线:

  • 按时间插补:t 是自变量,时刻 t 就必须到位置 p(t)。这是绝大多数系统的默认做法;
  • 按路径参数插补(空间同步):主轴的实际位置是自变量,从轴不追自己的时间表,追主轴的位置。相当于"宁可整体慢,不可彼此散"。

时间插补有个隐含假设:所有轴都跟得上各自的时间表。负载重、速度高的场合这个假设不成立,误差只会越拉越大。空间同步牺牲节拍换取形状保持,对焊接、切割、涂胶这类形状敏感、节拍不敏感的工艺很合适;反过来,上下料这种节拍敏感的场合就不能用。

还有一个折中做法是"时间 + 慢化":实时估计最慢的轴能跟到什么程度,在线缩放所有轴的时间表(参考点缩放,federate scaling 是 CNC 里的说法)。相当于动态让步,实现不难,效果往往比死磕时间插补好。

6. 工程上的坑

这部分可能是全文最值钱的。列几条我实际踩过的:

6.1 总线和采样的"伪同步"

同步控制的下限不在算法,在数据的时间戳。三个典型来源:

  • 各编码器采样时刻不对齐。1kHz 控制周期下两个编码器采样差 0.5ms,轴速 300°/s 时角差 0.15°,直接混进同步误差里。这种误差随速度变化、随时间抖动,看着像噪声,其实是系统性的;
  • 报文排队。CAN 1Mbps 挂三个驱动器,轻负载时没事,SYNC 报文和位置给定挤在一起时延迟开始抖,CAN 的仲裁机制决定了大 ID 的报文延迟方差更大;
  • 控制器到驱动器的执行延迟。指令发出去到驱动器执行有固定滞后,没补偿掉就是纯相位损失。

对策:预算够就上 EtherCAT,分布式时钟同步做到亚微秒级,这些年硬件成本也降下来了;至少 CANopen 要用 CSP(循环同步位置)模式 + SYNC 严格触发,别用自由跑的模式凑合。编码器尽量在同一中断里全部采完。

6.2 单轴没调好,同步控制救不了

耦合增益没法把一个烂的单轴环变成好环。顺序必须是:每个轴的带宽、前馈、惯量辨识都做到位,再叠同步。见过一个项目耦合增益拉到 1.5 强行压同步误差,两根轴互相拉扯,低速蠕行还异响,最后回头把从轴电流环带宽提上去才解决。

6.3 耦合矩阵要带量纲

论文里耦合系数写成 ±1 没问题,工程上如果一个关节是角度、另一个是毫米,直接 ±1 耦合,两边误差的"贡献"数量级完全失衡,调参会调到怀疑人生。先把误差折算到末端任务空间(或统一量纲)再耦合,这是很多自制同步控制不 work 的隐蔽原因。

6.4 评价标准要定对

不要只看各轴跟踪误差的 RMS。轮廓误差(实际点相对期望轮廓的最短距离)才是同步控制真正要优化的量。直线好算(点到直线距离),任意曲线用小线段或局部圆弧近似。上线前把最大值和 95 分位一起统计了——均值好看、局部超差,客户是不认的。

6.5 机械背刺

减速器背隙、联轴器弹性,最终都会表现成同步误差。反向间隙补偿(按速度符号预置偏移)能顶一阵,根子上还是机械的活。机械上省的钱,控制上迟早要加倍还回去。

7. 方法小结

方法思路优点主要短板典型场景
主从 / 电子齿轮从轴追主轴实际位置实现简单,驱动器自带从轴滞后、响应不对称变位机、随动
交叉耦合 CCC同步误差反馈进所有轴轮廓精度提升明显多轴扩展难、整定靠经验2~3 轴高精度轮廓
相邻耦合 ACCC只和相邻轴耦合复杂度 O(n)收敛稍慢、依赖轴排列多工位环形设备
计算力矩+同步补偿动力学解耦后加耦合理论性能好依赖模型精度本体厂控制器
自适应 / 鲁棒在线估计或抑制不确定性抗负载变化复杂、瞬态难看研究、特殊工况
ILC利用轨迹重复性学习精度可以压到极低只适合重复轨迹上下料、点胶
空间同步主轴位置当公共时钟形状保持好牺牲节拍焊接、切割

8. 结语

写这么多,观点其实就一个:多关节同步控制不是一个单一算法,而是一个分层的问题——总线与时钟层、驱动层(电流环、前馈)、控制层(耦合结构)、规划层(插补方式),各管一段。出了不同步,先定位在哪一层,再谈用什么方法。

我自己的习惯路线是:EtherCAT / 同步采样打底 → 单轴带宽和前馈拉满 → 还不够就上 CCC → 重复轨迹叠 ILC → 到这一步仍然不达标,才考虑模型派的方法。按这个顺序走,大部分问题在第三步之前就解决了。

水平有限,文中如有不准确的地方,欢迎评论区指出,会持续更新。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐