DNAV-1 · simulator stage · 11 Oct 2026

Pathfinder system map

How Pathfinder keeps a drone on its mission when GPS is jammed or spoofed, using only the sensors every ArduPilot drone already has. Three pictures: what runs on the drone, how the model is trained, and how we test it.

The six parts

Every term is defined in plain words in Terms.

Pathfinder is six named parts (owner decision D-NAME-1 "Domain names for the six parts", 11 Oct 2026). Every page, chart and test uses these names. "Physics" and "Fused" are no longer part names: they are the two modes of the Position Estimator, Pathfinder without ML and Pathfinder with ML.

NameJob
1 · GPS FixThe satellite position. Truth in the calibration phase; replaced by the Navigator's output in the denied phase.
2 · Position EstimatorCombines every input (motion sensors, barometer, compass, drag, Velocity Predictor output) into position, velocity, heading and an uncertainty.
3 · Velocity PredictorA trained regression model. Outputs air velocity in m/s with its own uncertainty. It does not output a coordinate.
4 · Predictor AdapterRetunes the Velocity Predictor to this drone, in flight, while the GPS Fix is good.
5 · GPS Integrity MonitorClassifies the GPS Fix as Healthy, Jammed or Spoofed. Rule-based today (D-21); a learned classifier is PLAN Phase 8. "Spoofer" was rejected because it names the attacker.
6 · NavigatorUses the GPS Fix while it is healthy; otherwise sends the Position Estimator's latitude, longitude and altitude to the autopilot as the GPS replacement (R-3).
Name in docsCode identifier (unchanged for now)
Position Estimatoreskf.rs · its Pathfinder without ML mode is run type b2, B2_FILTER_DRAG
Velocity Predictorlearned.rs, onnx.rs · models/velocity-long.onnx
Predictor Adapteradapter.rs
GPS Integrity Monitorintegrity.rs · GpsIntegrity
Navigatornavigator.rs · its Pathfinder with ML mode is run type full, PATHFINDER_FULL
GPS Fixthe GPS messages read by pathfinderd

Rust and Python identifiers, run IDs and file names keep their old spelling; renaming the code is a follow-up task.

Flowchart A · how the parts connect

flowchart LR
  SEN[Sensors
gyro, accelerometer,
barometer, compass, motors] VP[Velocity Predictor
velocity + uncertainty] PE[Position Estimator
weighted by uncertainty,
minus wind] NAV[Navigator
lat, lon, alt] AP[Autopilot
sees it as GPS] GF[GPS Fix] GIM[GPS Integrity Monitor
Healthy, Jammed, Spoofed] PA[Predictor Adapter] SEN --> VP SEN --> PE VP --> PE PE --> NAV NAV --> AP GF --> GIM GF --> NAV GIM -- switch --> NAV GF -- calibration phase only --> PA PA --> VP

Flowchart B · the two phases of a flight

stateDiagram-v2
  [*] --> Calibration
  Calibration --> Denied: GPS Fix lost or caught lying
  Denied --> Calibration: GPS Fix healthy again
  state Calibration {
    direction LR
    [*] --> Tuning
    Tuning: GPS Fix is the truth
    Tuning: Predictor Adapter retunes the Velocity Predictor
  }
  state Denied {
    direction LR
    [*] --> Flying
    Flying: GPS Integrity Monitor reports Jammed or Spoofed
    Flying: Adapter frozen
    Flying: Navigator sends the Position Estimator output as GPS
  }
  

1 · In flight: what runs on the drone

The flight controller (today the ArduPilot simulator, later a real autopilot) streams its sensors to a small companion computer. Pathfinder works out where the drone is and feeds that back. While GPS is trusted, ArduPilot flies on GPS and Pathfinder only watches and learns. When GPS is lost or caught lying, ArduPilot switches to Pathfinder's position and carries on with the mission.

flowchart LR
  subgraph FC[Flight controller - ArduPilot]
    S[Sensors
gyro + accelerometer 200 Hz
barometer, compass
motor outputs, GPS] EKF[ArduPilot EKF3
position used for flying] NAV[Autopilot
flies the waypoints] end subgraph CC[Companion computer - pathfinderd] IN[Read MAVLink
sensor messages] PROF[Vehicle profile
frame, motors, IMUs] subgraph CORE[Pathfinder core - Rust] F[Position Estimator
integrates the IMU] DRAG[Drag model
speed from tilt and air drag] ML[Velocity Predictor
air speed from IMU + motors] AD[Predictor Adapter
tunes the predictor to this drone
while GPS is good] GI[GPS Integrity Monitor
jamming and spoofing] end OUT[Send position
20 times a second] end S --> IN --> F IN --> PROF DRAG --> F ML --> F AD --> ML IN --> GI F --> GI GI -- GPS trusted --> AD F --> OUT --> EKF GI -- GPS bad: switch source --> EKF EKF --> NAV

Measured in the simulator only (D-10). The Velocity Predictor is currently the weak link: see "Where we are" below.

2 · Before flight: how the Velocity Predictor is made

We fly hundreds of simulated flights with varied wind, sensor errors and motor wear, record everything, and train a small network to predict the drone's speed through the air. The trained file is copied onto the companion computer.

flowchart LR
  G[Flight generator
random routes, wind,
sensor bias, motor wear] --> SITL[ArduPilot simulator
quad and octa] SITL --> LOG[Flight logs
sensors + true position] LOG --> SPLIT[Split by flight
train / check / test] SPLIT --> TR[Train network
PyTorch on the RTX 4080] TR --> ONNX[Model file
velocity-long.onnx] ONNX --> CORE[Pathfinder core
runs it with tract]

3 · Proof: how we test it

Every claim is a locked acceptance test (AC-1 to AC-9). Each test flies held-out scenarios the model never trained on, including a hexacopter it has never seen, and compares Pathfinder against ArduPilot alone.

flowchart LR
  SC[Held-out scenarios
jam, spoof step, spoof ramp,
GPS returns, clean] --> RUN[Test harness
flies each scenario
several ways] RUN --> B1[ArduPilot alone] RUN --> B2[Position Estimator
mode Pathfinder without ML] RUN --> FULL[Navigator
mode Pathfinder with ML] B1 --> AC[Acceptance tests
pass or fail with numbers] B2 --> AC FULL --> AC B1 --> V[Flight viewer
one HTML page per scenario] B2 --> V FULL --> V

4 · The simulation setup: what runs where

Everything runs on one Windows PC. The simulated drone is the real ArduPilot flight software flying a physics model, the same tool drone makers use. A ground station shows it live as a pilot would see it. The viewer shows what a ground station cannot: where the drone really was, against where each system thought it was.

flowchart LR
  subgraph PC[Windows PC]
    subgraph WSL[WSL - Linux inside Windows]
      LAB[Scenario lab
sim/lab.sh
pick wind, jam time,
spoof size, drone type] SITL[ArduPilot SITL
real autopilot code
+ physics model] PFD[pathfinderd
Pathfinder on the
companion computer] LOGS[Flight records
true position + every estimate] end GCS[QGroundControl or
Mission Planner
live view, like a pilot] VIEW[Flight viewer
HTML page per scenario
truth vs estimates] end LAB -- starts flights, jams or spoofs GPS --> SITL SITL -- sensors --> PFD PFD -- position --> SITL SITL -- TCP port 5763 --> GCS SITL --> LOGS PFD --> LOGS LOGS --> VIEW
PieceWhat it is forHow to open it
ArduPilot SITLThe drone. Same flight code as a real ArduPilot drone, flying a simulated airframe with simulated sensors, wind and GPS jamming.Started for you by the lab or the tests
Ground stationWatch the flight live: map, mode, waypoints, GPS state. Shows only what the autopilot believes.QGroundControl: Comm Links, TCP, 127.0.0.1:5763
Scenario labChange a knob, fly again, compare. One command per experiment.bash sim/lab.sh --help, guide in docs/LAB.md
Flight viewerAfter the flight: true path and each system's estimate on one map, error over time, replay slider.Double-click a file in viewer/out/

5 · How Pathfinder hands its position to the autopilot

There are two ways to plug in. Both keep the GPS Fix in charge while it is healthy and switch to Pathfinder the moment it is jammed or caught lying.

flowchart TB
  PF[Pathfinder
position + how sure it is] subgraph A[Mode A - today: navigation feed] OD[ODOMETRY message
position, speed, confidence] EK[ArduPilot EKF3
external navigation input] SW[Source switch
GPS to Pathfinder on jamming] end subgraph B[Mode B - flown once: GPS replacement] GI[GPS_INPUT message
latitude, longitude, altitude,
speed, accuracy] G2[Autopilot sees a
second GPS receiver] SEL[GPS selection
prefers the healthy receiver] end PF --> OD --> EK --> SW PF --> GI --> G2 --> SEL SW --> FLY[Autopilot keeps
flying the mission] SEL --> FLY
ModeStrengthLimitWorks with
A · Navigation feedRichest link: the autopilot gets speed and confidence and blends them properly. Proven in the simulator.Needs the autopilot's external-navigation setup.ArduPilot (EKF3)
B · GPS replacementDrop-in: to the autopilot, Pathfinder is just another GPS. No change to its navigation settings.A GPS message carries less information, so blending is coarser. Flown once in the simulator: stayed on mission, autopilot within 1.1 m of Pathfinder's position, switched 0.5 s after jamming. Spoofing and PX4 not yet tested.Any autopilot that accepts a MAVLink GPS, including ArduPilot and PX4

Owner requirement R-3, 11 Oct 2026: the product must be able to feed the autopilot as a replacement for the GPS coordinates. Mode B: pathfinderd --output gps-input sends GPS_INPUT as the autopilot's second GPS (ArduPilot GPS2_TYPE 14) and makes it primary when the GPS Fix is untrusted (D-65). Mode A stays the default until Mode B passes the full test set.

For the presentation

Where we are, in plain words

Error after GPS lossafter 1 minafter 2 minafter 5 min
ArduPilot aloneabout 1.4 kmabout 2.1 kmabout 3.9 km
Position Estimator, Pathfinder without ML5.5 m8.0 m29 m
Navigator, Pathfinder with MLworse than Pathfinder without ML; often triggers a forced landing

ArduPilot-alone figures are medians over 8 held-out quad and octa flights; the Pathfinder rows are one flight (heldout-jam-1020). All simulator numbers.

The Position Estimator alone already works well. Adding the Velocity Predictor makes it worse, because the predictor's speed estimates are much less accurate than the estimator's own, and the estimator still trusts them too much. The next three steps:

  1. Stop the current test run. It is testing the Navigator in Pathfinder with ML mode, which we already know is flawed, and would take hours to fail the remaining tests the same way.
  2. Fly one scenario both ways and compare. One flight in Pathfinder without ML mode, one in Pathfinder with ML mode, side by side in the viewer, to confirm the Velocity Predictor is what drags it down.
  3. Only listen to the predictor when it agrees. If Pathfinder without ML wins, the Position Estimator uses the Velocity Predictor only when it is close to what the estimator already says, and ignores it otherwise. Then rerun all the tests.