教程 · 中级 · 30 分钟
机器人减速箱背隙:怎样测量,怎样解决
每套齿轮传动都有的空隙,会让机械臂下垂、让里程计漂移。先用角度量出你的背隙,再决定是消除它,还是在设计上绕开它。
引言
有一族机器人故障,表现形式全都一样:这台机器往一个方向走是好的,往另一个方向走就错了。机械臂从左边和从右边够到同一个点,落下时差了两个位置。平衡机器人在直立附近抖动,无论怎么调参都稳不下来。迷宫机器人每转一次弯航向就差一度,跑完一趟差十五度。
这些都不是调参问题,而它们的原因完全相同。电机和它驱动的东西之间是一串齿轮,而齿轮之间必须留有间隙,否则会卡死。这个间隙叫背隙,它的含义是:每当电机换向时,输出根本不会动,直到齿面越过这段间隙、在另一边碰上为止。
本站有七页把背隙列为某样东西不工作的原因。本文就是解释它的那一页。
它到底是什么
背隙不是摩擦,也不是滞后。它是一个有记忆的死区。
想象驱动齿贴在从动齿的一个齿面上。推,输出精确地跟着输入走——完全没有误差。现在反向。驱动齿离开那个齿面,横穿这段间隙,在整个横穿过程中输出停在原地不动。等在远端齿面上碰上,输出才重新开始跟随,并且永久地偏了一个间隙的宽度。
这个描述直接导出两个后果,也是最值得记住的两个:
- **单方向移动时背隙不花你一分钱。**它是一笔换向税,每次换向收一次,与之后走了多远无关。机器人最贵的一次换向是急停,而那里的空行程是白送的,直接加在停车距离上。
- **误差取决于你是从哪边过来的。**这就是它为什么是迟滞而不是一个简单偏移,也是为什么一个标定常数去不掉它。
它画出来是什么形状
让一个带 4° 空行程的关节来回运动,把输出画出来。
下面那幅图是有用的心智图像,因为它让两个分支变得一目了然。上升时,输出落后半个间隙。下降时,输出超前半个间隙。在两者之间,输出停在上一次被留在的位置。
十分钟量出你自己那份
手里没有数字就没法围绕它做设计,而每个减速箱都不一样。有两种办法拿到它。
**手工,适合任何情况。**给电机断电,把底盘稳住。在轮缘或机械臂末端贴一条胶带,然后在输出两个极限之间轻轻晃——不要晃到把任何东西弄变形,只是晃到每个方向都碰上阻力为止。标出两个极限,量它们之间的弧长。换算:
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 模拟器里对着一个对小输入反应迟缓的被控对象调参,就能看到这个现象:同一组增益对大幅移动是稳定的,对小幅移动却在设定点附近来回寻的。
柔顺是空行程的另一半
如果你靠晃输出能量出空行程,你量到的是背隙和柔顺叠加在一起,而它们需要不同的修法。用一个测试把它们分开:施加一个负载,记下偏转量,然后释放。
| 背隙 | 柔顺 | |
|---|---|---|
| 偏转量与负载的关系 | 固定间隙,与负载无关 | 与负载成正比 |
| 释放时 | 停在你留下的位置 | 弹回去 |
| 修法 | 更好的齿轮、预紧、单侧接近 | 更硬的零件、更短的杠杆、加支撑 |
| 症状 | 与方向相关的误差 | 负载下下垂,动作之后振铃 |
一条长长的亚克力机械臂背隙很少、柔顺很多。一副装在短短的轴上的廉价塑料减速箱正好相反。两者读起来都是“臂没去我告诉它去的地方”,这就是为什么在买任何东西之前先做那个两分钟的测试是值得的。
出问题时
| 现象 | 通常原因 |
|---|---|
| 臂从每一侧够到同一点结果不同 | 就是背隙——在调任何东西之前先量它 |
| 平衡机器人抖动、稳不下来 | 修正增量小于空行程;换金属减速箱,而不是继续调参 |
| 每转弯航向漂一度 | 会反转的那个轮子上的背隙;优先走弧线,或者加一个陀螺仪 |
| 里程计说它动了,它其实没动 | 电机侧编码器看不见减速箱里的间隙 |
| 设定点附近稳定振荡 | 积分项在死区里卷绕、然后被一次穿过 |
| 位置可重复但负载下下垂 | 是柔顺不是背隙——加刚度,不要换减速箱 |
| 过了几个月变糟 | 塑料齿轮磨损;背隙随使用变大 |
背隙就是那种“机器人在模拟器里完美、在台架上却让人失望”的原因,因为它恰恰是一个理想模型会略去的那类东西。量一次,把数字写下来,大部分神秘感就跟着消失了。如果这个数字大到让人难受,答案通常是一套更好的电机和减速箱,而不是再花一个下午调参。
探索关联图谱
本教程所属的搭建
包含本教程的项目和学习路线。
延伸阅读