Detect a person, hold a stable lock on that specific person in multi-person scenes, and follow at a controlled distance on an Ackermann-steered platform.
Two non-negotiables shaped everything: the robot must never move without a positively identified target, and it must recover autonomously from the faults that actually happen in the field — USB drops, unreliable depth, lost tracks.
Vision pipeline, tracker, decision FSM, serial protocol and fault handling, Teensy firmware integration, chassis CAD (Fusion 360 → STEP), wiring, unit tests, and the full technical report with a one-page executive summary.
A layered pipeline. Perception and tracking never talk to hardware; the decision layer never parses frames. Each layer has one job and a narrow, testable interface.
The OAK-D runs its spatial detection network on-device and returns 3D positions directly. The host never touches frames for inference — freeing it for decisions, and removing a whole class of latency and coupling.
Greedy IOU matching with stable, monotonic IDs was sufficient for reliable target lock in multi-person scenes — and runs anywhere. A DeepSORT-with-embeddings wrapper exists for when it is installed, but is optional by design.
On losing a target, the robot performs a one-time STOP + CENTER and waits. It does not wander, spin, or reverse toward the last known position. No target, no motion.
Steering maps horizontal offset to PWM through a tunable exponent (arc_gamma), with independent left/right gains and caps — intentionally asymmetric to compensate a measured mechanical bias — plus a dead-band and minimum-PWM floor to stop oscillation.
Distance holding uses true stereo depth (z in metres) against a setpoint when depth is trustworthy, and degrades gracefully to bounding-box area when it is not.