教程 · 中级 · 30 分钟
车轮打滑:里程计为何漂移,又该如何应对
轮子转过的距离总比车走的远。本文讲附着力极限在哪里、为什么原地转向总会打滑,以及为什么系统性打滑才是危险的那种。
引言
让机器人走一个一米见方的正方形,四次 90° 转弯,回到起点。它回不到。把轮径和轮距标定到直线完全精确,再跑一遍,它还是回不到——而且在地毯上和在瓷砖上差的量还不一样。
本站在里程计那一页、编码器那一页、微型迷宫车项目以及另外半打页面上,都把轮子打滑列为原因。没有一处说明打滑实际上是什么、你有多少、以及其中哪一部分是你能动手解决的。
编码器量的是轮子,不是地面
这一句话就是整个主题。
编码器数的是轮子的转动。里程计需要的是地面行程。只有在触地点不打滑时两者才是同一个数,而它们的差就是滑移率——没有变成机器人运动的那部分轮子运动:
slip = (wheel travel − ground travel) / wheel travel
由此而来、并且塑造了下面一切的两个后果:
**打滑从内部是看不见的。**再好的编码器也检测不到它,因为它量的是那个动了的东西。这和减速箱背隙是同一种失明,而修法也一样:需要一个能量外部世界的东西。
**它不是噪声。**噪声会被平均掉;打滑一般不会,而原因在倒数第二节。
附着力预算
轮胎能推多狠,只由摩擦允许多少决定:
F_max = µ × N
N 是驱动轮上真正压着的重量——不是机器人的全部重量。同一个乘积也决定了机器人能多狠地推别的东西,而那是唯一一个你希望附着力上限越高越好、而不只是够用的场合。一台典型的两轮带万向轮底盘,会把大约一半到三分之二的质量压在驱动轴上,剩下的对附着力毫无用处。
两边除以质量,天花板就是一个加速度:
a_max = µ × (weight fraction on driven wheels) × g
上面那幅图有用的读法是:在一台业余机器人上,直线行驶很少是附着力受限的。哪怕那里最差的表面也给出一个典型设计所要求的三倍以上的加速度。如果你的机器人在直线上打滑,那是因为你下发的是个阶跃而不是斜坡——而那正是运动曲线存在的意义。
转弯是另一回事。
原地转弯永远在打滑
差速机器人的轮子是固定的。它们能向前向后滚,却不能横向移动——而原地转向要的恰恰是后者。
让底盘绕中心旋转时,每颗轮胎触地点上的每一点都描出一段圆弧,而轮子只能沿着与它相切的那条直线滚。这个差就是刮擦:整个转弯过程中轮胎都被横向拖过地面。宽触地点比窄触地点刮得多,而一个不能自由转向的万向轮同样会和转弯较劲。
所以原地转向不是一个“可能”打滑的动作。它是按构造就在打滑,而且它由编码器推出来的航向每次都错大致同一个量、同一个方向。
最后这一句就是问题所在。
系统性打滑是危险的那一种
取 90 mm 的轮距。一次 90° 原地转向让每个轮子滚 70.7 mm。让其中一个轮子因为刮擦损失掉其中 2%,航向就短了 0.9°——一个小到在任何单次转弯上都看不见的数。
现在跑一个迷宫。图的下面一栏展示了两种未来:
- 符号随机——有的转弯短,有的转弯长。误差按 √N 增长。50 次转弯后约 6°,而且它确实是一个你可以建模的随机游走。
- 系统性——每一次左转弯都因为同一个原因朝同一个方向刮。误差按 N 增长。50 次转弯后是 45°,而机器人正沿着一条它以为在别处的走廊开下去。
真实机器人和第二种接近得多。刮擦来自转弯之间并不改变的几何,所以误差也不变。这就是“有点漂”在一趟跑完之后变成“彻底丢了”的原因,也是微型迷宫车需要陀螺仪而不是更好的编码器的原因。
弄清楚你有多少
三个测试,从最便宜的开始。
**开一段直线然后量。**在地面上做标记,下发精确的 1000 mm,量你实际走了多少。在两种表面上各重复一次。稳定的标度误差是标定问题;随表面变化的误差就是打滑。
**原地转十次然后看。**下发十次 90° 转弯——那是 900°,两圈半。标出起始航向,量终点。把误差除以十。这把一个本来测不出来的单次转弯误差放大,而它是本页最有用的单独一件事。
**拿编码器和陀螺仪比。**如果你有 MPU-6050,把它的 Z 轴角率在一次转弯上积分,与编码器推出来的航向比较。两者的分歧就是打滑,直接、实时地测出来,完全不需要地面标记。它们不一致的地方就是编码器错了——陀螺仪不在乎轮子干了什么。
另一个实时特征是有电流尖峰却没有相应的加速度:电机在干活,而机器人没动。
真正有帮助的东西
**一切加斜坡。**轮速上一个阶跃指令要求无限加速度,而轮胎给出它给得上的部分,剩下的就变成打滑。给指令做曲线是免费的,而且这是单项收益最大的一件事。
**能走弧线就走弧线。**一段弧线让两个轮子以不同速度向前滚,刮擦比原地转向少得多。地图允许的地方就优先用它——这也是背隙的修法,因为走弧线同样不会反转任何一个轮子。
把重量放到驱动轮上,并让万向轮保持自由。压在一个不被驱动的万向轮上的重量,就是不产生附着力的重量。
**如果你经常原地转向,就收窄触地点。**宽而抓地的轮胎帮加速、害原地转向;这个取舍是真实的,值得有意识地选。
**不要只靠加抓地力去追 µ。**更多摩擦意味着打滑发生得更晚,而不是里程计变正确了。那是余量,不是修法。
什么也帮不了的
轮子里程计就是航位推算。它对世界没有任何参考,所以打滑、背隙和直径误差会累积起来,而且永远得不到修正——这和电机控制路线图里警告的那种无界漂移是同一件事,而它是方法本身的属性,不是你的制作里的缺陷。
修法是第二个意见:
- 陀螺仪修正航向,而航向恰恰是最疼的那个误差,而且很便宜。
- 墙或线的参考在你每次看到它们时重置横向位置——一台沿墙机器人就是这样在走廊里保持真实的。
- 一张地图——扫描匹配或 SLAM——两个都修,代价是一颗激光雷达和多得多的算力。
里程计在一米之内优秀,在一百米之外一文不值。围绕这一点做设计,而不是试图修好它。
出问题时
| 现象 | 通常原因 |
|---|---|
| 正方形直线完美却永远合不拢 | 原地转向的刮擦;用十转弯测试量它 |
| 瓷砖上距离对、地毯上偏短 | 是打滑不是标定——误差跟着地面走 |
| 航向误差稳定地朝一个方向增长 | 系统性打滑;陀螺仪是便宜的修法 |
| 起初长得快,之后在走廊里进入平台 | 墙在修正你——那正是参考在干它的活 |
| 只在起步时打滑 | 下发的是阶跃而不是斜坡 |
| 转弯时陀螺仪与编码器不一致 | 正确——那个分歧就是测量结果 |
| 换上更抓地的轮胎并没有修好里程计 | 抓地力提高打滑阈值;它不会让编码变诚实 |
| 只有一个轮子像在打滑 | 重量分布或卡住的万向轮,不是电机 |
值得带走的习惯是十转弯测试。它把一个谁也看不见的误差变成一个数字,而一旦你有了这个数,就能判断自己需要的是陀螺仪、斜坡,还是什么都不需要。
打滑本身就是传动原理的那台车
上面全都把打滑当成故障。而在麦克纳姆底盘上它是设计:滚子故意朝横向松脱,而机器人之所以能横向移动,全靠这个。后果值得直说,因为它们改变的是你该量什么,而不是你该多努力。
- 横向里程计是机器人上最弱的一个数,而不是一个调参问题。编码器是栓在轮子上的,而轮子故意不是地面。
- **有一个免费的检查,而它是半瞎的。**四个轮子、三个自由度留下一个备用方程——在任何刚性、抓地的底盘上都有
FL + FR = RL + RR——所以残差能抓到一个轮子打滑,却看不到四个一起打滑。推导在这里。 - **修法是不通电的轮子。**装在弹簧支架上的全向死轮不传递转矩,所以它们在指令下不打滑,而它们把机器人上最弱的数变成最好的那个。
把抓地力滑块拉到底,看着编码器仍然坚持说机器人到了。
探索关联图谱
本教程所属的搭建
包含本教程的项目和学习路线。
延伸阅读