Odometry

Odometry is the estimation of a robot’s pose by integrating incremental motion measurements over time — dead reckoning. Starting from a known initial pose, each new measurement gives a small relative motion ΔTk\Delta T_k, and the current pose is the composition of all increments:

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

The word “odometry” originally referred to wheel odometry: encoders count wheel rotations, and a kinematic model (differential drive, Ackermann) converts them into linear and angular velocity. The same idea generalises to any sensor that can measure relative motion:

The defining property of odometry is drift: every increment carries a small error, and because increments are chained multiplicatively, errors accumulate without bound. A 0.5% translational error per metre is invisible over a desk-sized motion and catastrophic over a kilometre. Odometry alone can therefore never produce a globally consistent map — that requires loop closure and global optimisation, which is exactly what separates odometry from SLAM.

In modern SLAM back-ends, odometry appears as a relative pose constraint: an edge between consecutive pose nodes in a pose graph or a motion-model factor in a factor graph,

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)

where the control/measurement ut\mathbf{u}_t comes from encoders, an IMU, or a VO front-end, and QtQ_t models its uncertainty.

Worked example: differential-drive odometry

For a two-wheeled differential-drive robot with wheel radius rr, encoder-measured wheel angular velocities ωl,ωr\omega_l, \omega_r, and wheel separation LL, the body velocities are

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}.

Integrating the planar pose (x,y,θ)(x, y, \theta) over a timestep Δt\Delta t (simplest Euler form):

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.

This ten-line integrator is a complete odometry system — and it exhibits every classic failure mode. Notice that the position update depends on θk\theta_k: any heading error rotates all subsequent translation into the wrong direction. After driving a distance dd with a heading error δθ\delta\theta, the lateral position error is roughly dδθd \cdot \delta\theta — which is why heading (gyro quality, wheel-base calibration) dominates odometric accuracy, and why adding even a cheap gyro to wheel odometry helps so much.

How drift behaves

Practically, odometry quality is quoted as relative error — percent of distance travelled and degrees per metre — which is exactly what the KITTI odometry benchmark and the relative pose error (RPE) metric measure. Absolute trajectory error (ATE) is the wrong lens for an odometry system, because absolute error is unbounded by design.

Common pitfalls

Why it matters for SLAM

Odometry is the backbone of every SLAM system: it provides the high-rate, locally accurate motion estimate that tracking, mapping, and loop-closure modules build on. Understanding its error characteristics — locally smooth, globally drifting — explains the architecture of modern SLAM: trust odometry over short horizons, and correct it globally whenever a loop closure or absolute measurement becomes available.