Skip to content
shaostassen.com

← home

Cornell ECE 4160 · Spring 2026 · Solo

Fast Robots: Sensor Fusion and Autonomous Navigation

A hand-built differential-drive robot that localizes with a Bayes filter and pulls off high-speed maneuvers by Kalman-filtering sensor data faster than the sensors themselves update.

Kalman filterBayes filterPIDLQREmbedded C++BLEIMUToF

full reports ↗

Problem

Make a small, cheap robot do fast, precise autonomous maneuvers — the regime where you can't just drive slowly and average the sensor noise away. The robot has to sense, estimate, decide, and act on a microcontroller, with sensors that update slower than the dynamics it's trying to control.

Constraints

  • All onboard compute is a SparkFun Artemis (Cortex-M4F) — no companion computer during runs.
  • Time-of-flight distance sensors sample far slower than the robot closes distance at speed; the IMU drifts.
  • BLE is the only telemetry channel, so debugging means designing your own logging protocol.
  • Consumer RC-car hardware: motor deadbands, battery sag, and real friction, not simulation.

Approach

The build progressed as an integrated stack rather than isolated demos: BLE communication and onboard telemetry first, then sensor characterization, then PID control on orientation and wall-approach, then a Kalman filter fusing the ToF readings with a fitted dynamics model — which lets the robot predict distance between slow sensor samples and brake later than raw sensing would allow. On top of that: high-speed stunts (a drift turn and a flip), an inverted-pendulum balance, and grid-based Bayes-filter localization from ToF scans feeding waypoint navigation.

Tuning that PID is the part people picture as turning three knobs until it looks right. It is really a chain of trades. Raise Kp and the steady-state error shrinks but never closes — drop Ki to zero and push Kp to the top to see the gap that is left. Add Ki and it closes, at the price of overshoot. And because a real actuator runs out of authority, Ki also buys windup: the integral keeps accumulating error the motor cannot act on, so the loop sails past the target before it recovers. Turn anti-windup off, put Ki near 20, and watch the overshoot go from a few percent to roughly a third.

Tune the loop

step response · simulated first-order plant

1.00-12s

outputcontrol effort, saturating at ±1

2.0
8.0
0.05
overshoot
1%
settling (2%)
0.41 s
steady-state err
0.000

That plant is a generic first-order lag — the shape a motor loop takes — not this robot's measured dynamics. I am not going to publish numbers I did not fit. What carries over is the shape of the trade, which is the one I tuned against on hardware, where battery sag and motor deadband move it run to run.

Why it's technically hard

The interesting problems are all about acting faster than you can sense. The Kalman filter isn't academic here — without it, the robot literally cannot stop in time. The Bayes filter has to work with a coarse pose grid and a noisy beam sensor model, and every gain was tuned on real hardware where latency, noise, and battery state change run to run.

Result

Full lab-by-lab reports with data and video live on the Fast Robots report site.

Plates

The Fast Robots car with its electronics exposed — control board, sensor wiring, and battery held down with orange tape.
FIG.01The car with its lid off: control board, sensor wiring, and battery strapped down with tape that saw a lot of iterations.
The robot on a workbench, wiring loom and sensors visible, tools and 3D prints around it.
FIG.02Bench state between runs: wiring loom, sensors, and the printed brackets that kept moving until they stopped breaking.
A laptop plotting two live sensor traces beside the robot's microcontroller board on a breadboard.
FIG.03ToF and IMU streaming over BLE. Everything downstream — the filter, the controller, the stunts — depends on reading these honestly.
Top-down view of the differential-drive robot on a tiled floor.
FIG.04Top-down, on the tile it actually drove on. Differential drive, so every turn is a wheel-speed difference the controller has to hold.
The taped-out test arena: a wooden-walled course on a lab floor with the robot parked inside.
FIG.05The test arena. The Bayes filter has to work out where the car is from range scans of exactly this geometry.