Connect to any MAVLink-speaking autopilot — PX4, ArduPilot, or a DJI bridge — over UDP or TCP and the aircraft appears as a live, heading-rotated green track on the map. Position, altitude, battery, flight mode, GPS fix quality, and armed state update in real time alongside the mission plan, the airspace layers, and the rest of the team's TAK positions. This is the ownship layer that closes the UAS loop: plan it, fly it, watch it, process it.
The receiver binds a UDP port (QGroundControl's 14550 default — the same port SITL, mavlink-router, and companion computers stream to) or connects out over TCP to a serial-to-network bridge. Frames are parsed with a hand-rolled, air-gapped MAVLink v1/v2 decoder — no NuGet package, no native dependency — and folded into a per-aircraft track that fans out over SSE to the map overlay.
// autopilot → UDP 14550 → live track { "sysid": 1, "callsign": "ALPHA-1", "latitude": 38.8978, "longitude": -77.0367, "altAglM": 50.0, "mode": "AUTO.MISSION", "armed": true, "batteryPct": 87, "fixType": "3D", "sats": 14 } → green heading-wedge on the map
The decoder was audited field-by-field against the official MAVLink C library headers — every byte offset, every signed/unsigned width, every flight-mode enum. No silent misalignments.
Fused WGS84 position (lat/lon/alt-MSL/alt-AGL), ground speed, vertical speed, and heading from GLOBAL_POSITION_INT — the same fused estimate the autopilot flies on.
Roll, pitch, yaw, and body rates from ATTITUDE — the raw material for a live attitude indicator or a 3D model orientation.
Voltage, current, and remaining percent from SYS_STATUS — with the signed -1 "not measured" sentinel handled correctly, not rendered as 655 A.
Fix type (NO_GPS through RTK_FLOAT), HDOP/VDOP, and satellite count from GPS_RAW_INT — decoded in MAVLink wire order, not XML source order.
ArduPilot's flat enum and PX4's packed main_mode | (sub_mode << 16) — so a PX4 drone shows AUTO.RTL, not a wrong flat-enum label.
The SAFETY_ARMED bit from HEARTBEAT, rendered as a red track when armed — and heartbeat-driven link-loss detection that flags a stale track.
Every position update is published as a Cursor-on-Target event — the a-f-A-M-U friendly-UAS type, the same one Remote ID uses — so the drone appears on every connected ATAK / WinTAK / TAK-X device alongside the rest of the blue-force picture. One MAVLink feed in, the whole team sees the aircraft.
Each decoded position becomes a CoT event via the existing TAK client — STOMP wss to a TAK Server or UDP multicast for server-less team interop.
Tracks stream over /api/mavlink/tracks/events Server-Sent Events — the same fan-out pattern the Remote ID and feeds layers use.
MAVLink ownship = green heading-wedge. Remote ID traffic = purple triangle. ADS-B manned = blue. Three populations, three colors, one map.
This layer is situational awareness only — it issues no commands and changes no vehicle state. It does not relieve the pilot of the drone's own Remote ID broadcast obligation (14 CFR Part 89), and it does not grant any operational authority the pilot doesn't already hold. The PIC's eyes and the aircraft's own warnings remain authoritative.
Every capability is a localhost route. The receiver is opt-in — it never binds on startup. Select a connection profile, start reception, and the tracks flow.
| Capability | Endpoint | Notes |
|---|---|---|
| Capabilities | GET /api/mavlink/capabilities | Receiver state, serial availability (Phase 2), bound endpoint |
| Profile CRUD | GET/POST/PUT/DELETE /api/mavlink/profiles | Connection profiles (transport, host, port, callsign) |
| Start reception | POST /api/mavlink/polling/start | Bind UDP / connect TCP for the selected profile |
| Stop reception | POST /api/mavlink/polling/stop | Unbind + tear down the receive loop |
| Track snapshot | GET /api/mavlink/tracks | Latest decoded state per sysid (position, mode, battery…) |
| Live track stream | GET /api/mavlink/tracks/events | SSE fan-out — the map overlay subscribes here |
Drone work is a pipeline, and 3D Map Explorer covers every stage in the same desktop — now including the live-fly leg.
FlyPath mission planning + FAA airspace awareness — draw the polygon, tune the grid, export the .kmz, check the airspace.
Mission planning →Connect the autopilot over MAVLink and watch the drone fly as a live green track — position, battery, mode, armed state — published to the TAK team.
This page →After the flight, process the photo folder with OpenDroneMap (SfM) into an orthomosaic COG and a surface model.
3D reconstruction →For video sorties, play STANAG/MISB KLV-tagged drone video with a live sensor footprint — and convert raw DJI clips into STANAG-compliant FMV.
Full Motion Video →