4、定位基础:轮式里程计模型与标定,运动学模型(阿克曼、差速)
各位同学,今天我们聊点实在的。定位模块里,轮式里程计是成本最低、最可靠的“保底”手段。你想想看,GPS 会丢星,激光雷达会退化,但只要你轮子还在转,里程计就能给你一个相对位置。我做了这么多年自动驾驶,见过太多团队一上来就搞多传感器融合,结果轮子标定都没做准,最后定位飘得一塌糊涂。
这一章,我们就来把轮式里程计的底子打扎实。我会从最基本的模型讲起,再到标定方法,最后对比阿克曼和差速这两种最常见的运动学模型。嗯,都是我在项目里踩过坑、填过土的东西。
4.1 轮式里程计的核心思想
说白了,里程计就是“用轮子转了多少圈,来推算车走了多远”。这个思路很朴素,但实现起来有不少细节。
核心公式其实就一个:
位移 = 轮子周长 × 编码器脉冲数 / 每圈脉冲数
但这里有个关键问题——轮子周长不是一成不变的。轮胎气压、负载、磨损都会改变它。我曾经在一个项目中,就因为换了批新轮胎没重新标定,导致定位误差在 100 米内累积了 3 米多。所以,标定不是一次性的,得定期做。
里程计误差来源(按影响程度排序):
- 轮子半径误差——最常见,影响比例因子
- 轮距误差——影响转弯时的角速度
- 编码器分辨率——低速时尤其明显
- 打滑——无法避免,只能通过模型补偿
4.2 差速模型:两轮驱动的“直觉”
差速模型在扫地机器人、AGV 上用得最多。它的原理很简单:左右轮速度不同,车就会转弯。
我习惯把差速模型拆成两步来理解:
- 先算线速度:左右轮速度的平均值
- 再算角速度:左右轮速度差除以轮距
公式长这样:
v = (v_left + v_right) / 2
ω = (v_right - v_left) / L
其中 L 是左右轮的轮距
有了 v 和 ω,我们就可以用下面的方式更新位姿:
Δx = v * cos(θ) * Δt
Δy = v * sin(θ) * Δt
Δθ = ω * Δt
我的经验:差速模型在低速(< 1m/s)时非常准,但一旦速度上去,打滑效应会急剧放大。我曾经在测试一台 1.5m/s 的 AGV 时,转弯处的误差直接飙到了 15%。后来加了 IMU 辅助才压下来。
4.3 阿克曼模型:汽车的“标准答案”
阿克曼模型模拟的是汽车转向几何。它的核心是:转弯时,内外侧轮的转弯半径不同,但所有轮子的转向中心交于一点。
这个模型比差速复杂一些,但更贴近真实车辆。我建议你记住两个关键参数:
- 轴距(Wheelbase):前后轴的距离
- 轮距(Track):左右轮的距离
阿克曼模型的运动学公式:
v = 后轴中心速度
ω = v * tan(δ) / L
其中 δ 是前轮等效转角,L 是轴距
位姿更新方式和差速模型一样,只是 v 和 ω 的计算方式不同。
注意:阿克曼模型假设车轮纯滚动,没有侧滑。但在实际中,尤其是高速过弯时,侧偏角不可忽略。我建议在 5m/s 以上时,引入一个侧偏刚度补偿项。
4.4 两种模型的对比
我把两种模型的核心差异整理成了表格,方便你对照:
| 对比项 | 差速模型 | 阿克曼模型 |
|---|---|---|
| 适用平台 | 两轮差速底盘、履带车 | 汽车、三轮车 |
| 控制输入 | 左右轮速度 | 后轮速度 + 前轮转角 |
| 转弯方式 | 差速转向 | 前轮转向 |
| 低速精度 | 高 | 中 |
| 高速精度 | 低(打滑严重) | 中(需补偿侧偏) |
| 标定参数 | 轮距、左右轮半径 | 轴距、轮距、转角零偏 |
4.5 里程计标定:从理论到实战
标定是里程计落地的关键一步。我见过太多人直接拿理论参数用,结果误差大得离谱。
我个人习惯用 UMBmark 方法来标定差速底盘。这个方法的核心思路是:让机器人走一个正方形,然后看终点误差。
具体步骤:
- 让机器人从起点出发,走一个 4m × 4m 的正方形
- 记录终点位置和朝向的误差
- 根据误差反推轮距和轮半径的修正系数
对于阿克曼模型,标定稍微复杂一些。我通常分两步走:
- 直线标定:让车走直线,修正轮半径比例因子
- 转弯标定:让车走固定半径的圆,修正轴距和转角零偏
避坑指南:我曾经在标定阿克曼底盘时,发现直线标定怎么都做不准。后来排查了半天,发现是轮胎气压不一致导致的。所以标定前,先检查轮胎气压,这是最容易被忽略的一步。
4.6 知识体系总览
下面这张图把本章的核心知识点串了起来。你可以把它当作一个快速索引:
4.7 实战建议
最后,我结合自己的项目经验,给你几条实在的建议:
- 先做标定,再做融合——很多团队一上来就搞 EKF 融合,结果里程计本身误差就很大,融合效果自然好不到哪去。先把里程计标定到 1% 以内的误差,再谈融合。
- 注意编码器安装——编码器和轮轴的同心度很重要。我见过一个案例,编码器安装偏了 1mm,结果每转一圈就多计 6mm 的位移,累积下来非常可观。
- 定期重新标定——轮胎磨损、气压变化都会改变轮子半径。我建议每 3 个月或每 1000 公里重新标定一次。
- 不要迷信理论参数——理论轮距和实际轮距往往有差异。我建议用 UMBmark 方法实测修正,而不是直接拿设计图纸上的参数用。
最后提醒一句:里程计在长距离、长时间运行下,误差一定会累积。它适合做短距离的局部定位,或者作为融合定位的一个输入源。千万别指望单靠里程计就能搞定全局定位,那是不现实的。