教程 · 中级 · 30 分钟

机器人减速箱背隙:怎样测量,怎样解决

每套齿轮传动都有的空隙,会让机械臂下垂、让里程计漂移。先用角度量出你的背隙,再决定是消除它,还是在设计上绕开它。

引言

有一族机器人故障,表现形式全都一样:这台机器往一个方向走是好的,往另一个方向走就错了。机械臂从左边和从右边够到同一个点,落下时差了两个位置。平衡机器人在直立附近抖动,无论怎么调参都稳不下来。迷宫机器人每转一次弯航向就差一度,跑完一趟差十五度。

这些都不是调参问题,而它们的原因完全相同。电机和它驱动的东西之间是一串齿轮,而齿轮之间必须留有间隙,否则会卡死。这个间隙叫背隙,它的含义是:每当电机换向时,输出根本不会动,直到齿面越过这段间隙、在另一边碰上为止。

本站有七页把背隙列为某样东西不工作的原因。本文就是解释它的那一页。

它到底是什么

背隙不是摩擦,也不是滞后。它是一个有记忆的死区。

想象驱动齿贴在从动齿的一个齿面上。推,输出精确地跟着输入走——完全没有误差。现在反向。驱动齿离开那个齿面,横穿这段间隙,在整个横穿过程中输出停在原地不动。等在远端齿面上碰上,输出才重新开始跟随,并且永久地偏了一个间隙的宽度。

这个描述直接导出两个后果,也是最值得记住的两个:

  • **单方向移动时背隙不花你一分钱。**它是一笔换向税,每次换向收一次,与之后走了多远无关。机器人最贵的一次换向是急停,而那里的空行程是白送的,直接加在停车距离上。
  • **误差取决于你是从哪边过来的。**这就是它为什么是迟滞而不是一个简单偏移,也是为什么一个标定常数去不掉它。

它画出来是什么形状

让一个带 4° 空行程的关节来回运动,把输出画出来。

一个带四度空行程的关节的两幅堆叠曲线图。上图把指令位置画成虚线正弦波、实际输出画成实线,对时间作图。每一次换向时实际输出都在一条阴影带里保持平直,而指令位置继续移动,之后才恢复。下图把实际位置对指令位置作图,形成一个平行四边形环,围着零背隙减速箱会走的点状对角线,环量出来宽四度。
同一段运行画两遍。在时间轴上,背隙就是每次换向处的那段平直;把输出对输入作图,它是一个平行四边形,其水平宽度正好等于空行程——这里 4° 的间隙量出 4.07°,多出来的那一点是采样带宽。 下载 SVG

下面那幅图是有用的心智图像,因为它让两个分支变得一目了然。上升时,输出落后半个间隙。下降时,输出超前半个间隙。在两者之间,输出停在上一次被留在的位置。

十分钟量出你自己那份

手里没有数字就没法围绕它做设计,而每个减速箱都不一样。有两种办法拿到它。

**手工,适合任何情况。**给电机断电,把底盘稳住。在轮缘或机械臂末端贴一条胶带,然后在输出两个极限之间轻轻晃——不要晃到把任何东西弄变形,只是晃到每个方向都碰上阻力为止。标出两个极限,量它们之间的弧长。换算:

backlash (°) = arc / (π · D) × 360

在输出整转的四五个位置上重复做,取最差的那一个。齿与齿之间的差异和轴的偏心都是真实存在的,而你碰巧先测的那个位置未必有代表性。

**用编码器,更精确。**如果你的电机在电机轴上带了编码器——N20 编码器电机就有——朝一个方向极慢地驱动,直到输出刚开始动,把计数器清零,然后反向,数到输出再次动为止。那个计数就是间隙:

backlash (°) = counts / counts-per-output-rev × 360

对一颗每转每通道 7 个脉冲的 N20,做 ×4 解码,配 1:100 减速箱,输出每转是 2800 个计数——所以31 个计数就是 4°。分辨率绰绰有余,足够去量一个几乎看不见的东西。

编码器装在哪里,决定你能看见什么

这是最让人意外的部分,也决定了你刚量出来的那个数字是不是一个能在软件里修掉的问题。

装在电机轴上的编码器位于减速箱之前。在横穿间隙的过程中它报告电机转得好好的,因为电机确实转得好好的。轮子可没有。你的位置估计说你动了;你其实没动。背隙对电机侧编码器是不可见的,它以纯粹的、未经修正的误差落进你的里程计里。

装在输出轴上的编码器位于减速箱之后,它报告的是真相——但那也正是为什么它在横穿期间读数为零,而那又正是你一开始要测量背隙时用的是电机侧编码器的原因。那个无法补偿它的编码器,恰恰是能看见它的那个。

所以对业余机器人诚实的总结是:几乎所有业余机器人上编码器都在电机侧,而背隙就是位置估计里未被测量的误差。下面所有内容都是关于把这个误差变小,或者让它无关紧要。

它正在让你付出多少

关节上的空行程是一个角度;它真正的代价是一个距离,而杠杆决定这个距离有多大。同样是 4° 的空行程,三台机器人:

位置 杠杆 每次换向的代价
机械臂大臂 150 mm 连杆 夹爪端 10.5 mm
驱动轮 65 mm 轮子 行程 2.27 mm
微型迷宫车轮子 42 mm 轮子 行程 1.47 mm

机械臂那一行就是为什么关节臂在业余级公差下最受苦:大臂的空行程在传到工具之前,要乘上整条臂长。150 mm 连杆的大臂上一度,在夹爪端已经是 2.6 mm。

轮子那两行看起来无害,直到你去数换向次数。一台微型迷宫车在每个路口都原地转向,而原地转每次都要反转一个轮子。42 mm 轮子、90 mm 轮距上,4° 的空行程就是每次转弯 0.93° 的航向误差——而航向误差恰好是唯一不会平均掉的东西,因为之后每一段直线都是沿着错掉的方位角在走。一百次转弯,就是 147 mm 的行程被你的里程计记了下来而机器人从未走过。

自平衡车是极端情形,因为它连续不断地换向——每秒几百次、每次都很小,而且每一次小增量都小于那个间隙。它一生中大部分时间都待在死区里,这就是为什么任何一组增益都稳不住它。

修法一:少买一点

最便宜的修法通常就是那个零件本身。

**金属齿轮替掉塑料齿轮。**注塑齿轮公差松,磨损之后更松。金属齿轮组去不掉背隙,但通常只剩其中一小部分,这也是 N20 电机出现在每一台平衡机器人和微型迷宫车作品里的唯一原因,也是TT 减速电机对一台大部分时间朝前开的循迹车来说完全够用的原因。

搞清楚哪一级要紧。每一级折算到输出端的背隙,要除以那一级到输出之间的减速比。末级对输出的比值是一,所以它的全部背隙原样出现,而上游各级都被除小了。因此高减速比的减速箱并不自动更差——如果你要改进一个齿轮,就改进最后那一级。

**预紧。**相互弹簧顶住的分裂齿轮、防背隙丝杠螺母、用张紧的皮带代替齿轮对。所有这些做法都让齿面同时保持接触。所有它们都要付出摩擦、效率和磨损,这就是你正在做的取舍。

**或者干脆删掉减速箱。**皮带驱动或直接驱动的关节压根没有齿轮背隙可谈。它有的是柔顺,那是另一个问题,下面会讲。

修法二:永远从同一侧接近

机加工里最老的修法,在软件里性价比最高,因为它不花钱。

背隙只在换向时被收取。所以让每一次移动的最后一段都朝同一个方向,你到达时间隙就总是已经被穿过了。如果你需要从一个位置的上方够到它,就冲过头一点再从下面回来。3D 打印机的 Z 轴就是这么做的;数控操作员则是靠本能用手做。

// Always arrive travelling positive: the gap is crossed before we get there.
void moveTo(float target) {
  if (target < currentPosition()) {
    driveTo(target - APPROACH_MARGIN);   // margin > measured backlash
  }
  driveTo(target);
}

APPROACH_MARGIN 必须明显大于你量到的空行程——取两倍是个合理的起点。代价是一半的移动要多花时间,收益是一种不再依赖于“你是从哪边来的”的可重复性。

对移动机器人来说,同一个技巧换一种读法:在地图允许的地方,优先走宽弧而不是原地转向,因为走弧线同样不会反转任何一个轮子。

修法三:别让控制器跟它较劲

一个 PID 环遇到背隙,就是在自己的控制范围正中间遇到一个死区,而它处理得很糟,方式很具体、也很容易认出来。

在间隙里,输出在涨却什么都没发生,于是误差不缩小。积分项继续累积,穿过一个无论多大力都没用的时段。等齿面终于咬合,累积的那一项被一次性施加到一个此时才连上的机构上,关节就冲过目标。然后它反向,再穿一次间隙,在另一个方向上做同样的事。这就是极限环——一种永不收敛的稳定寻的振荡——而它的幅值由机械决定,不由增益决定。

真正有帮助的做法:

  • **你不下发运动指令却在动的时候,停止积分。**如果输出已经超过本该产生运动的阈值,而编码器说输出没在动,就冻结积分。这和你对付饱和执行器时用的防积分饱和逻辑是同一套;死区只不过是一个暂时被断开的执行器。
  • **先降 Ki,再降 Kp。**积分项才是把死区变成极限环的那个。
  • **不要去追最后那几度。**如果你的空行程是 4°,那么 1° 的公差带就是在要求振荡。接受一个比背隙略宽一点的死区,环就不寻的。
  • **给换向做曲线。**一条运动曲线在过零速时是缓过去的,它会轻轻穿过间隙而不是一头撞上远端齿面——更安静,对塑料齿轮也友好得多。

在 PID 模拟器里对着一个对小输入反应迟缓的被控对象调参,就能看到这个现象:同一组增益对大幅移动是稳定的,对小幅移动却在设定点附近来回寻的。

柔顺是空行程的另一半

如果你靠晃输出能量出空行程,你量到的是背隙和柔顺叠加在一起,而它们需要不同的修法。用一个测试把它们分开:施加一个负载,记下偏转量,然后释放。

背隙 柔顺
偏转量与负载的关系 固定间隙,与负载无关 与负载成正比
释放时 停在你留下的位置 弹回去
修法 更好的齿轮、预紧、单侧接近 更硬的零件、更短的杠杆、加支撑
症状 与方向相关的误差 负载下下垂,动作之后振铃

一条长长的亚克力机械臂背隙很少、柔顺很多。一副装在短短的轴上的廉价塑料减速箱正好相反。两者读起来都是“臂没去我告诉它去的地方”,这就是为什么在买任何东西之前先做那个两分钟的测试是值得的。

出问题时

现象 通常原因
臂从每一侧够到同一点结果不同 就是背隙——在调任何东西之前先量它
平衡机器人抖动、稳不下来 修正增量小于空行程;换金属减速箱,而不是继续调参
每转弯航向漂一度 会反转的那个轮子上的背隙;优先走弧线,或者加一个陀螺仪
里程计说它动了,它其实没动 电机侧编码器看不见减速箱里的间隙
设定点附近稳定振荡 积分项在死区里卷绕、然后被一次穿过
位置可重复但负载下下垂 是柔顺不是背隙——加刚度,不要换减速箱
过了几个月变糟 塑料齿轮磨损;背隙随使用变大

背隙就是那种“机器人在模拟器里完美、在台架上却让人失望”的原因,因为它恰恰是一个理想模型会略去的那类东西。量一次,把数字写下来,大部分神秘感就跟着消失了。如果这个数字大到让人难受,答案通常是一套更好的电机和减速箱,而不是再花一个下午调参。

探索关联图谱

本教程所属的搭建

包含本教程的项目和学习路线。

延伸阅读

参考资料