Siddhartha Yash Kovid

← Notes · Darth-Hidious/kc-ukf-nav

KC-UKF on real KITTI — spoof-resilient GNSS/INS

Cross-sensor trust inside a classical UKF. KITTI drive 0001, ~47 m GPS spoof — conventional UKF ~61 m error, KC-UKF ~1.9 m.

KC-UKF is an error-state unscented Kalman filter. The measurement update scales each sensor’s noise covariance by a cross-sensor compatibility score (CFE — Compatibility-Field Estimation): per-sensor NIS against the baseline noise model → Gaussian compatibility → softmax across sensors → R-inflation, inside one classical UKF update. No discrete fault switch. No learning at runtime.

Mechanism

Per-sensor NIS is scored against the baseline noise model, mapped to compatibility, then used to inflate R inside a normal UKF update. Constants are named and bounded. A small supervised network can set them so you are not hand-tuning every scenario.

KITTI results

Drive 0001, injected ~47 m GPS spoof on the recorded signals:

  • Conventional UKF ≈ 61 m error
  • KC-UKF ≈ 1.9 m

Slow drift below the GNSS noise floor is the harder case. Adaptive filters (including Sage–Husa) follow it to roughly 12 m; tuned KC-UKF holds about 3.45 m. Leave-one-drive-out over 11 drives keeps the margin on held-out drives.

Per-sensor behavior under spoof

In the plot above, GNSS R inflates hard while barometer and magnetometer stay near one. The filter stops trusting the bad channel instead of hard-switching it out.

Drone

Same filter, no retune, MuJoCo Skydio X2: peak error ~27 m → ~2.9 m. CFE is a trust layer on a classical update, not a new filter per vehicle.

CFE core schematic

Reproduce

Each paper claim maps to one command (process_kitti.py, kitti_scenarios.py, lodo_cv.py, SymPy checks, pytest). KITTI raw is not in the repo; a download script pulls the official mirror. Checked-in result JSONs are the outputs of those commands.

Under review for IEEE NAVICON 2026. DOI: 10.5281/zenodo.19506045.

Repository: https://github.com/Darth-Hidious/kc-ukf-nav