Probabilistic motion models: how uncertainty grows as a robot moves through the world.
Every Bayes filter has two ingredients: a motion model p(xt | ut, xt-1) and a measurement model p(zt | xt). This chapter develops the motion model. The next chapter covers measurements.
Why does the robot need a probabilistic motion model? Because commands are never executed perfectly. Tell a robot to drive 1 meter forward and turn 90 degrees left. What actually happens? It drives 0.97 meters (or 1.04 meters), turns 87 degrees (or 93 degrees), and drifts slightly sideways. Wheels slip. Motors have variability. The floor is uneven.
This chapter focuses on mobile robots moving on a 2D plane. We develop two complementary models:
Velocity motion model: The robot is commanded with a translational velocity v and rotational velocity ω. Used for planning and prediction.
Odometry motion model: The robot measures how far its wheels actually turned. Used for post-hoc estimation (the data is only available after the motion).
For a mobile robot on a plane, the pose (or kinematic state) has three components:
where (x, y) is the position in a global coordinate frame, and θ is the heading (orientation). A robot with θ = 0 points along the x-axis; θ = π/2 points along the y-axis.
| Term | Definition |
|---|---|
| Pose | Position + orientation: (x, y, θ) |
| Location | Position only: (x, y) |
| Heading / bearing | Orientation θ only |
| Configuration | The full kinematic state (for a planar robot, same as pose) |
Classical kinematics gives a deterministic function: given pose xt-1 and control ut, compute the next pose xt. Probabilistic kinematics extends this to a conditional density:
This density describes the probability of ending up at pose xt when starting at xt-1 and executing command ut. It captures the "cloud" of possible outcomes.
Imagine commanding a robot to drive forward and turn. The true motion is corrupted by noise in translation, rotation, and drift. The resulting probability cloud has a characteristic banana shape: spread along the arc of motion, wider at the end (where rotational error compounds translational error).
There are two ways to use a motion model:
Density evaluation: Given xt-1, ut, and xt, compute p(xt | ut, xt-1). Needed by histogram filters and EKF.
Sampling: Given xt-1 and ut, generate a random xt drawn from p(xt | ut, xt-1). Needed by particle filters.
The velocity model assumes the robot is controlled by two velocities:
where vt is translational velocity (forward/backward) and ωt is rotational velocity (turning). This is the natural interface for differential-drive, synchro-drive, and Ackerman-drive robots.
Ideal (noise-free) motion: A robot with constant v and ω moves along a circular arc of radius r = v/ω. After time Δt:
Noisy motion: The actual velocities differ from commanded ones. The model adds Gaussian noise to v and ω, controlled by six robot-specific error parameters α1 through α6:
| Parameter | Controls |
|---|---|
| α1, α2 | Translational error from translation and rotation |
| α3, α4 | Rotational error from translation and rotation |
| α5, α6 | Final heading error |
For particle filters, we need to sample from the velocity motion model — generate random poses from p(xt | ut, xt-1). The algorithm is simple:
pseudocode # Sample from velocity motion model Input: xt-1 = (x, y, θ), ut = (v, ω) # Add noise to commanded velocities v̂ = v + sample(α1|v| + α2|ω|) ω̂ = ω + sample(α3|v| + α4|ω|) γ̂ = sample(α5|v| + α6|ω|) # Apply noisy velocities x' = x - (v̂/ω̂) sin θ + (v̂/ω̂) sin(θ + ω̂Δt) y' = y + (v̂/ω̂) cos θ - (v̂/ω̂) cos(θ + ω̂Δt) θ' = θ + ω̂Δt + γ̂Δt return (x', y', θ')
The function sample(b) draws from a zero-mean distribution with variance b — typically Gaussian or triangular.
Different noise settings produce very different distributions. High translational noise (α1, α2) spreads particles along the arc. High rotational noise (α3, α4) spreads them perpendicular to the arc. Balanced noise produces the banana shape.
Watch how the velocity motion model spreads particles. The robot starts at the left and executes a "drive forward and turn" command. Particles show the distribution of possible outcomes. Adjust the noise to see banana shapes, wide arcs, and tight clusters.
Commanded: drive forward and turn. Teal dot = ideal endpoint. Orange dots = sampled endpoints (200 particles). Adjust noise parameters.
The odometry model uses wheel encoder data instead of velocity commands. Most commercial robots provide odometry: "the left wheel turned X ticks, the right wheel turned Y ticks." From this, we can compute a relative motion estimate.
The odometry model decomposes motion into three phases:
δrot1: Initial rotation to face the new position.
δtrans: Translation to the new position.
δrot2: Final rotation to the new heading.
Noise is added to each of the three components independently. The error parameters α1 through α4 control how much translational and rotational noise is injected. Since odometry directly measures wheel motion (rather than predicting it from motor commands), it tends to be more accurate than the velocity model.
| Aspect | Velocity Model | Odometry Model |
|---|---|---|
| Input | Commanded velocities (v, ω) | Wheel encoder readings |
| When available | Before and during motion (planning) | After motion only (estimation) |
| Accuracy | Lower (commands ≠ actual motion) | Higher (direct wheel measurement) |
| Use case | Motion planning, prediction | Localization, SLAM |
Sampling from the odometry model follows the same principle as the velocity model: perturb the parameters, then compute the new pose.
pseudocode # Sample from odometry motion model Input: xt-1 = (x, y, θ), ut = (δrot1, δtrans, δrot2) # Add noise to each component δ̂rot1 = δrot1 + sample(α1|δrot1| + α2|δtrans|) δ̂trans = δtrans + sample(α3|δtrans| + α4(|δrot1| + |δrot2|)) δ̂rot2 = δrot2 + sample(α1|δrot2| + α2|δtrans|) # Compute new pose x' = x + δ̂trans cos(θ + δ̂rot1) y' = y + δ̂trans sin(θ + δ̂rot1) θ' = θ + δ̂rot1 + δ̂rot2 return (x', y', θ')
The noise scales with the magnitude of the motion: larger motions accumulate more error. This is physically reasonable — driving 10 meters has more odometry drift than driving 1 meter.
So far, our motion models ignore obstacles. The robot might sample a pose that's inside a wall! There are two approaches to handling this:
Rejection sampling: Sample poses from the motion model, discard any that land in occupied space, and re-sample. Simple but wasteful if many samples are invalid.
Map-informed models: Modify the motion model itself to assign zero probability to poses inside obstacles. This is cleaner but requires access to the map during the prediction step.
Another subtlety: the Markov assumption says xt depends only on xt-1 and ut. In reality, there are un-modeled effects (people pushing the robot, carpet vs. tile, wheel wear). Over-estimating the motion noise provides a practical buffer against these violations.
Probabilistic motion models are the prediction engine of every Bayes filter. They transform the old belief into a predicted belief by accounting for the uncertainty in robot motion.
| Model | When to use |
|---|---|
| Velocity model | When you have commanded velocities (v, ω); suitable for planning and prediction |
| Odometry model | When you have wheel encoder data; more accurate; suitable for localization and SLAM |
Key lessons:
• Noise is added to control parameters (velocities or odometry), not directly to the pose.
• Noise magnitude scales with the motion magnitude — bigger moves are noisier.
• Over-estimating noise is safer than under-estimating it.
• Both density evaluation and sampling are needed, depending on the filter type.