Project
Indoor Drone Positioning System
Final System
The final Palm Pilot demo tied the full chain together: webcam gesture input, the ground control station, UWB positioning, EKF state estimation, and closed-loop flight. After months of subsystem debugging, the system completed repeated live demos with responsive gesture commands and stable indoor motion. Video credit: Felix Morin.

Custom Time Difference of Arrival (TDOA) Implementation
We chose UWB TDOA instead of motion capture to keep the system portable and lower cost. Each anchor pair produced a timing constraint, and combining many of those curves made the drone's indoor position observable without GPS.

Custom Tag Design
The onboard tag was built around an ESP32 and DWM1000 UWB transceiver. Its job was to passively listen to anchor packets, extract precise timestamps, compute TDOA pairs, and feed measurements into the drone's estimator without adding extra radio traffic.

Custom Anchor Design
The anchor boards used an STM32F0 and DWM1000 to broadcast timing and position packets around the flight area. Building the anchors ourselves increased development effort, but reduced cost and gave us control over USB-C flashing, configuration, TDMA scheduling, and debug LEDs.

TDOA Testing
Before flying, we validated the tag against known anchor geometry by holding it at measured positions and comparing expected and measured TDOA values. The measurements stayed within roughly +/-10 cm, giving us confidence to integrate them into the EKF.

Flight Control Architecture
Once the positioning pipeline worked on the bench, it was integrated with the Crazyflie 2.1 flight stack. The onboard EKF fused IMU, barometer, and UWB TDOA updates, while the ground station streamed velocity commands and received telemetry for closed-loop control.

Stationary EKF Testing
The first EKF check was deliberately simple: leave the drone stationary and watch the estimate over time. Low variance and minimal drift showed that the UWB updates and onboard prediction model were balanced under ideal conditions.

Carried EKF Testing
After the stationary test, we manually carried the drone around the 6 m by 4 m workspace to stress the estimate across the anchor layout. Variance increased with motion, but the state stayed bounded across the full coverage area.

Takeoff EKF Testing Failures
The first takeoff tests exposed the real integration problem: vibration, noisy acceleration measurements, CPU load, and inconsistent EKF update timing could push the estimate unstable. This failure drove the estimator tuning and firmware-load reduction work.

Takeoff EKF Testing Success
After increasing EKF process noise and reducing onboard computational load, the estimate stayed stable through takeoff, hover, and landing. This was the turning point where the positioning system became usable for controlled flight.

Pure Pursuit Control Testing
With localization stable, we tested trajectory control using pure pursuit for circular paths. The drone followed a moving lookahead point around the circle and reached an average path error of about 3.6 cm during system-level testing.