The robot drives a fixed loop while its onboard camera "sees" nearby coloured landmark clusters and adds them to a growing map. Its true motion is known here for reference (solid green path); its own belief is built purely by dead-reckoning — integrating small, biased per-step odometry increments — which is drawn as the dashed orange path. Because each step's tiny heading and scale error compounds into the next, the estimate slowly bows away from the truth.
estStep = rotate(trueStep, headingBias) · (1 + scaleBias)
headingBias += noise·randomWalk·dt
drift = |estPos − truePos|
- Drive speed — how fast the robot advances along the loop; a full circuit revisits the start cluster, which is what makes loop closure possible.
- Odometry noise — scales how fast heading/scale bias random-walks each step; higher noise makes the dashed path bow away from the solid one faster.
- Camera sensor range — how close a landmark must be to get observed and folded into the map (bright markers) versus remaining unseen ground truth (faint markers).
- Loop closure — when the robot's arc-length odometer wraps back past the start cluster it already mapped, the pose graph recognises the revisit and distributes a single correction backward across the whole stored trajectory and map — a rubber-sheet snap, not just a jump at the end — visible as the drift readout plunging toward zero.
Real-world relevance: this loop-closure correction is exactly what lets visual SLAM systems keep a long trajectory accurate over city-block distances, instead of drifting unboundedly like raw dead-reckoning.