Drone Telemetry Dashboard with MAVLink
Stream live flight data from any MAVLink-compatible vehicle — drones, rovers, fixed-wing aircraft — to a Plexus dashboard. See attitude, GPS, battery, and sensor data in real time.
What You'll Build
A flight monitoring dashboard with:
- Attitude — roll, pitch, yaw (with 3D attitude indicator)
- GPS — latitude, longitude, altitude, ground speed
- Battery — voltage, current, remaining percentage
- System — flight mode, armed status, heartbeat
What You Need
| Item | Notes |
|---|---|
| MAVLink vehicle or SITL | ArduPilot, PX4, or any MAVLink source |
| Companion computer | Raspberry Pi, Jetson, or laptop |
| Python 3.8+ | On the companion computer |
| Plexus account | Free at app.plexus.company (opens in a new tab) |
Works with any MAVLink connection: USB serial, UDP telemetry radio, TCP, or SITL simulator.
Step 1: Install the Agent
pip install plexus-agent[mavlink]This installs the Plexus agent with the MAVLink adapter (pymavlink).
Step 2: Get Your API Key
- Go to app.plexus.company (opens in a new tab)
- Click Add Device
- Copy the API key (starts with
plx_)
Step 3: Identify Your Connection
Find how your flight controller is connected:
| Connection Type | Connection String | Common Setup |
|---|---|---|
| USB serial | /dev/ttyACM0:57600 | Pixhawk via USB |
| Serial radio | /dev/ttyUSB0:57600 | SiK telemetry radio |
| UDP | udpin:0.0.0.0:14550 | MAVProxy, SITL, GCS relay |
| TCP | tcp:127.0.0.1:5760 | SITL default |
To test with ArduPilot SITL (no hardware needed):
# In a separate terminal, start SITL:
sim_vehicle.py -v ArduCopter --console --map
# This outputs on udp:127.0.0.1:14550 by defaultStep 4: Start Streaming
plexus start --key plx_xxxxx --mavlink udpin:0.0.0.0:14550Or for a USB-connected Pixhawk:
plexus start --key plx_xxxxx --mavlink /dev/ttyACM0:57600You'll see telemetry flowing in the terminal:
Connected to MAVLink (ArduPilot ArduCopter 4.5.1)
System ID: 1 Component: 1
Streaming:
attitude.roll attitude.pitch attitude.yaw
gps.latitude gps.longitude gps.altitude
gps.groundspeed battery.voltage battery.current
battery.remaining heartbeat.mode heartbeat.armedStep 5: See Your Dashboard
Open app.plexus.company (opens in a new tab). Your device appears with all MAVLink metrics.
Recommended Dashboard Layout
Build a flight monitoring dashboard with these widgets:
Row 1 — Attitude & GPS
- Attitude Indicator — Shows aircraft orientation (roll/pitch/yaw)
- Line Chart — GPS altitude over time
- Line Chart — Ground speed
Row 2 — Battery & System
- Line Chart — Battery voltage and current
- Gauge — Battery remaining percentage
- Status — Flight mode and armed state
Row 3 — Raw Sensors
- Multi-series Line Chart — Accelerometer (accel_x, accel_y, accel_z)
- Multi-series Line Chart — Gyroscope data
Using the Python API Directly
For custom MAVLink processing or filtering specific messages:
from plexus import Plexus
from plexus.adapters import MAVLinkAdapter
px = Plexus(api_key="plx_xxxxx", source_id="drone-001")
adapter = MAVLinkAdapter(
connection_string="udpin:0.0.0.0:14550",
include_messages=["ATTITUDE", "GPS_RAW_INT", "SYS_STATUS"],
)
adapter.connect()
print(f"Connected: {adapter.vehicle_type}")
while True:
for metric in adapter.poll():
px.send(metric.name, metric.value, tags=metric.tags)Recording Flight Sessions
Use sessions to group telemetry by flight:
# The agent creates sessions automatically when armed/disarmed,
# or you can control it from the dashboard
plexus run --key plx_xxxxx --mavlink udpin:0.0.0.0:14550 --name drone-001Sessions let you:
- Compare flights side-by-side in the dashboard
- Replay telemetry from any past flight
- Export session data for post-flight analysis
MAVLink Messages Decoded
The adapter automatically decodes these MAVLink messages:
| MAVLink Message | Plexus Metrics |
|---|---|
| ATTITUDE | attitude.roll, attitude.pitch, attitude.yaw |
| GPS_RAW_INT | gps.latitude, gps.longitude, gps.altitude |
| GLOBAL_POSITION_INT | gps.groundspeed, gps.heading |
| SYS_STATUS | battery.voltage, battery.current, battery.remaining |
| HEARTBEAT | heartbeat.mode, heartbeat.armed, heartbeat.system_status |
| VFR_HUD | vfr.airspeed, vfr.groundspeed, vfr.altitude, vfr.climb |
| RC_CHANNELS | rc.ch1–rc.ch8 |
| SERVO_OUTPUT_RAW | servo.ch1–servo.ch8 |
Additional messages are decoded automatically — any MAVLink message with numeric fields becomes a Plexus metric.
Troubleshooting
"No heartbeat received" — Check your connection string. For serial, verify the baud rate matches your flight controller (usually 57600 or 115200). For UDP, ensure the port isn't blocked.
Missing GPS data — The flight controller only sends GPS data when a GPS module is connected and has a fix. Indoor testing may not produce GPS metrics.
High latency — Telemetry radios (SiK) have limited bandwidth. Reduce the streaming rate or filter to essential messages with --mavlink-filter ATTITUDE,GPS_RAW_INT,SYS_STATUS.
Next Steps
- CAN Bus Adapter — Monitor vehicle CAN networks
- Attitude Indicator UI — GPU-accelerated 3D attitude display
- 3D Model Viewer — Visualize vehicle orientation in 3D
- Session Recording — Control recording from the dashboard