Verified result

Inertial Ghost

Drone navigation with no GPS, using an error-state Kalman filter over three sensors.

IMU + VIO + UWBThree sensors, one ESKF
Period
2025 to 2026
Areas
Robotics

Navigation continuing after the GPS fix is gone, with the estimated track drawn against the truth.

3Sensor streams fused: IMU, VIO, UWB
ESKFError-state Kalman filter as the estimator core
A*Planning over the estimated map

Problem

Indoors, underground, or anywhere with a roof, a drone has no satellite fix. Its inertial measurement unit, the IMU, still works, but integrating acceleration twice turns a small bias into a large position error within seconds. It does not fail loudly. It drifts.

Approach

Three sensors, chosen because they fail differently.

The IMU gives high-rate motion and drifts. VIO, visual-inertial odometry, tracks features in the camera image to estimate motion, and it fails when there is nothing to track, like a blank wall. UWB, ultra-wideband ranging, measures distance to fixed anchors, and it fails when something metal sits in the way.

An ESKF, an error-state Kalman filter, fuses them. It tracks the correction to the current estimate rather than the estimate itself, which handles rotation properly and keeps the maths linear where it needs to be. On top of the estimate, A* plans a route.

Godot 4 draws it, because a filter you can only read as a CSV is a filter you will misunderstand.

System

IMU  ->  |
VIO  ->  |  ESKF (position, velocity, attitude, biases)  ->  estimated pose
UWB  ->  |                                                       |
                                                        A* route planning
                                                                 |
                                                     Godot 4 visualisation

Results

The filter core, the planner and the visualisation all run. The useful test is not the clean run, it is dropping a sensor mid-flight and watching whether the estimate degrades gracefully or jumps.

This project and the SkyScout estimator share a lineage. The same ESKF thinking, and the same habit of checking the recovered biases rather than the headline error, went into both.

Limits, and what I would do next

UWB needs anchors placed in advance, which is fine in a warehouse and useless in an unknown building. The honest framing is that this is an indoor-with-infrastructure solution, not a go-anywhere one.

Next: log the filter’s consistency, not just its error, so the estimate’s own confidence can be checked against how wrong it actually is.

Stack

  • Python
  • ESKF
  • VIO
  • UWB
  • A* planning
  • Godot 4