Odometry

**里程计(odometry)**是通过对增量运动测量值随时间进行积分来估计机器人位姿的方法——即航位推算(dead reckoning)。从一个已知的初始位姿出发,每一次新的测量都给出一个小的相对运动 ΔTk\Delta T_k,当前位姿就是所有增量的复合:

Tk=T0ΔT1ΔT2ΔTkT_k = T_0 \cdot \Delta T_1 \cdot \Delta T_2 \cdots \Delta T_k

“odometry”一词最初指的是轮式里程计(wheel odometry):编码器统计车轮转数,再通过运动学模型(差速驱动、阿克曼转向)将其转换为线速度和角速度。同样的思想可以推广到任何能够测量相对运动的传感器:

里程计的定义性特征是漂移(drift):每个增量都带有一个小误差,并且由于增量是以乘法方式串联的,误差会无界地累积。每米 0.5% 的平移误差在桌面尺度的运动中不可察觉,但在一公里范围内则是灾难性的。因此,单靠里程计永远无法产生全局一致的地图——这需要回环检测和全局优化,这正是区分里程计与 SLAM 的关键所在。

在现代 SLAM 后端中,里程计以相对位姿约束的形式出现:作为位姿图中连续位姿节点之间的一条边,或作为因子图中的一个运动模型因子,

xt+1=f(xt,ut)+wt,wtN(0,Qt)\mathbf{x}_{t+1} = f(\mathbf{x}_t, \mathbf{u}_t) + \mathbf{w}_t, \qquad \mathbf{w}_t \sim \mathcal{N}(\mathbf{0}, Q_t)

其中控制/测量量 ut\mathbf{u}_t 来自编码器、IMU 或视觉里程计前端,而 QtQ_t 对其不确定性进行建模。

实例演算:差速驱动里程计

对于一台车轮半径为 rr、编码器测得车轮角速度为 ωl,ωr\omega_l, \omega_r、轮距为 LL 的两轮差速驱动机器人,其机体速度为

v=r(ωr+ωl)2,ω=r(ωrωl)L.v = \frac{r(\omega_r + \omega_l)}{2}, \qquad \omega = \frac{r(\omega_r - \omega_l)}{L}.

在时间步 Δt\Delta t 上对平面位姿 (x,y,θ)(x, y, \theta) 进行积分(最简单的欧拉形式):

xk+1=xk+vcosθkΔt,yk+1=yk+vsinθkΔt,θk+1=θk+ωΔt.x_{k+1} = x_k + v\cos\theta_k\,\Delta t, \qquad y_{k+1} = y_k + v\sin\theta_k\,\Delta t, \qquad \theta_{k+1} = \theta_k + \omega\,\Delta t.

这个十行代码的积分器就是一个完整的里程计系统——而且它展现出了所有经典的失效模式。注意位置更新依赖于 θk\theta_k:任何朝向误差都会使所有后续的平移旋转到错误的方向上。在以朝向误差 δθ\delta\theta 行驶了距离 dd 之后,横向位置误差大致为 dδθd \cdot \delta\theta——这正是为什么朝向(陀螺仪质量、轮距标定)主导着里程计精度,也是为什么即便给轮式里程计加上一个廉价的陀螺仪也能大幅提升效果的原因。

漂移的表现规律

在实践中,里程计的质量通常用相对误差来衡量——即行驶距离的百分比误差和每米的角度误差——这正是 KITTI 里程计基准和相对位姿误差(RPE)指标所度量的内容。绝对轨迹误差(ATE)并不适合用来衡量里程计系统,因为绝对误差本身在设计上就是无界的。

常见陷阱

对SLAM的意义

里程计是每个 SLAM 系统的骨架:它提供了高频率、局部精确的运动估计,跟踪、建图和回环检测模块都建立在此之上。理解它的误差特性——局部平滑、全局漂移——正是理解现代 SLAM 架构的关键所在:在短时间尺度上信任里程计,而每当回环检测或绝对测量可用时,就对其进行全局修正。

相关条目