VISLOC

GPS fails.
Cameras don't have to.

A simulated visual localization pipeline for GPS-denied navigation: feature-matching against a known map for an absolute (but slow) fix, optical-flow odometry for a fast (but drifting) relative estimate, fused by an Unscented Kalman Filter into a single stable position track.

70.6%final drift reduction
50.9%mean error reduction
$0GPU / drone / paid imagery
Run the simulation ↓
01 — Live playback

Watch it drift, then watch it correct

frame 0 / 199
space play/pause   step frame   click map or chart to jump
02 — Parameter sandbox

Tune the filter, live

This is the same UKF math as the simulation above, ported to JavaScript and re-run on every change. The camera/odometry data comes from a few precomputed noise presets (re-running ORB matching and optical flow live in-browser isn't feasible without porting OpenCV to JS) — switching presets swaps that underlying data, while every slider below recomputes the actual filter in real time.

Scenario preset
Noise/yaw level - swaps the precomputed camera data.
Process noise (σ)2.5
How much the filter trusts its own constant-velocity prediction vs. incoming data. Higher lets it track a turning path faster.
VPS fix rateevery 10 frames
How often an absolute fix is attempted - lower is more frequent correction, but less realistic for a real 1-2Hz constraint.
Soft-correction window10 frames
How many frames a VPS fix is spread over, instead of snapping instantly.
Threshold (χ²)9.21
Rejects a fix that's statistically too far from the current estimate. Disable to accept every fix unconditionally.
final drift reduction
mean error reduction
max error reduction
ground truth raw odometry UKF fused
03 — Results

Standard scenario

200-frame loop, ±2° camera yaw, σ=1.5px position noise, absolute fix attempted every 10 frames.

MetricRaw odometryUKF fusedReduction
Final drift12.73px3.74px70.6%
Mean error7.99px3.92px50.9%
Max error13.14px7.36px44.0%

Fusion's benefit is scenario-dependent, not universal — it helps most when raw odometry drift is substantial relative to the localizer's own measurement noise (~4px). When VIO is already that accurate on its own, there's little room left for fusion to improve on it. Full validation, including a known open limitation around sharp direction-reversal points, is documented in the repository README.