★ New · feat/rtk-ppk-corrections

Centimeter-grade positioning — live and post-processed.

3D Map Explorer relays NTRIP correction streams as RTCM3 straight to the aircraft over MAVLink for live RTK fixes, and post-processes the recorded trajectory against a base-station RINEX file to recover centimeter positions the live fix may have missed. Two paths to the same goal: survey-grade drone mapping.

NTRIP clientRTCM3 relayMAVLink GPS_RTCM_DATA PPK post-processRINEX base stationCentimeter accuracyFix-quality summary
What it does · RTK (live)

NTRIP in → RTCM out → MAVLink to the aircraft.

The RtkService connects to one or more NTRIP casters, pulls the RTCM3 correction stream, and forwards it to the aircraft via MAVLink GPS_RTCM_DATA frames — reusing the command-send link the payload module established.

  • NTRIP sources — register multiple casters (mountpoint, credentials, format); CRUD over REST, persisted by NtripSourceStore.
  • RTCM forwarder — chunks the stream into MAVLink-sized frames and pushes when a live link exists; no-op otherwise.
  • Status — connection state, active mountpoint, and whether a live MAVLink link can actually deliver corrections.
POST /api/rtk/connect/{id}
// connect caster → relay RTCM3 to aircraft
GET /api/rtk/status
{
  "connected": true,
  "mountpoint": "BASE1",
  "liveLink": true,
  "forwarding": true
}
→ GPS_RTCM_DATA frames sent
→ aircraft publishes RTK Fix
What it does · PPK (post-flight)

Reprocess the trajectory against a base station.

PPK reprocesses the aircraft's recorded trajectory against a base-station RINEX observation file to recover centimeter-accurate positions the live RTK fix may have missed — dropouts, float-only epochs, re-initialization. Phase 1 is an honest degrade: it loads the trajectory (from FlightLog), decodes the base-station RINEX header, and summarizes the existing fix quality so you know whether PPK would meaningfully help.

📉

Trajectory load

Aircraft trajectory read from FlightLogService — the same logs replay uses.

📡

RINEX decode

Base-station header parsed — station, approx position, observation types (L1/L2).

📊

Fix-quality summary

What fraction of epochs were Fixed vs Float — tells you if PPK is worth running.

🎯

QC position

Base-station position surfaced for quality control / bias checks.

🧮

Honest degrade

Missing trajectory / unreadable RINEX → a result object with a clear status, never an exception.

Phase 2 · full math

Carrier-phase double-difference + LAMBDA ambiguity resolution is planned, not shipped.

REST API surface

Manage corrections from your own tools

CapabilityEndpointNotes
Capability discoveryGET /api/rtk/capabilitiesRTK relay + PPK availability
List / get sourcesGET /api/rtk/sources · /sources/{id}Registered NTRIP casters
Add sourcePOST /api/rtk/sourcesMountpoint, creds, format
Update / deletePUT · DELETE /api/rtk/sources/{id}
Connect / disconnectPOST /api/rtk/connect/{id} · /disconnectStart/stop RTCM relay
StatusGET /api/rtk/statusConnection + live-link + forwarding state
PPK post-processPOST /api/rtk/ppkTrajectory + RINEX → fix-quality summary

RTK relay reflects RtkService / NtripClient / RtcmForwarder; PPK reflects PpkService on commit fddb81f38 (feat/rtk-ppk-corrections). PPK Phase 1 is an honest degrade — trajectory + base position + fix-quality summary, not the full carrier-phase double-difference solution (planned Phase 2). Actual cm accuracy depends on base-station quality and rover GNSS hardware.

Part of the UAS loop

Plan → Preflight → Fly → Process → Exploit

Survey-grade drone mapping

Live RTK relay over MAVLink today; PPK trajectory recovery — Phase-2 full carrier-phase math on the roadmap.