3D Map Explorer's payload module turns the desktop into a live gimbal and camera controller. Drive pitch/yaw/roll, toggle between RGB and thermal, and command zoom — all over MAVLink. This is the platform's first command-send path: every prior MAVLink feature only listened.
The MAVLink telemetry stack already ingested HEARTBEAT, GLOBAL_POSITION_INT, and attitude. Payload control promotes the gimbal from a planning parameter into a live, controllable attitude and adds outbound commands to the aircraft.
MAV_CMD_DO_GIMBAL_MANAGER_ATTITUDE (1000), with Follow / Lock / Free pointing modes.MAV_CMD_SET_CAMERA_MODE (510).MAV_CMD_SET_CAMERA_ZOOM (531).CAMERA_INFORMATION (259) + vendor heuristic → RGB / Thermal / LiDAR / Multispectral.// point the gimbal nadir, lock yaw north { "sysId": 1, "pitchDeg": -90, "yawDeg": 0, "mode": "Lock" } → MAV_CMD 1000 sent → status reflects GIMBAL_DEVICE_ATTITUDE_STATUS { "accepted": true, "gimbalPitchDeg": -90 }
Payload status is assembled from the same MAVLink stream the telemetry overlay already decodes. The command-send path reuses that link so every command rides the connection that's already proven up.
GIMBAL_DEVICE_ATTITUDE_STATUS (285) → live pitch/yaw/roll, quaternion→euler.
CAMERA_INFORMATION (259) → sensor type + mode from cam_definition_uri or heuristic.
Component IDs from HEARTBEAT identify gimbal/camera components per sysId.
Follow (yaw trails flight direction), Lock, Free — mapped to GIMBAL_MANAGER_FLAGS.
?sysId + ?staleSec on status so stale attitudes are flagged, not trusted.
Every command send returns a result object; a dead link is reported, never raised.
| Capability | Endpoint | MAVLink |
|---|---|---|
| Capability discovery | GET /api/payload/capabilities | Available sensors + gimbal presence |
| Payload status | GET /api/payload/status | Live attitude + mode (?sysId, ?staleSec) |
| Gimbal command | POST /api/payload/command | MAV_CMD 1000 — pitch/yaw/roll + mode |
| Camera mode | POST /api/payload/camera/mode | MAV_CMD 510 — RGB ↔ Thermal |
| Camera zoom | POST /api/payload/camera/zoom | MAV_CMD 531 — zoom level |
Command mapping reflects PayloadService on commit 73ddba7d0 (feat/multi-sensor-payload). This is the first feature that sends MAVLink commands; earlier features (FlyPath, telemetry overlay) were receive-only. Actual gimbal response depends on the airframe's MAVLink gimbal protocol support.
Live gimbal attitude, RGB/thermal switching, and zoom — the first outbound MAVLink command path on the platform.