Tutorials
Drone Telemetry

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

ItemNotes
MAVLink vehicle or SITLArduPilot, PX4, or any MAVLink source
Companion computerRaspberry Pi, Jetson, or laptop
Python 3.8+On the companion computer
Plexus accountFree 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

  1. Go to app.plexus.company (opens in a new tab)
  2. Click Add Device
  3. Copy the API key (starts with plx_)

Step 3: Identify Your Connection

Find how your flight controller is connected:

Connection TypeConnection StringCommon Setup
USB serial/dev/ttyACM0:57600Pixhawk via USB
Serial radio/dev/ttyUSB0:57600SiK telemetry radio
UDPudpin:0.0.0.0:14550MAVProxy, SITL, GCS relay
TCPtcp:127.0.0.1:5760SITL 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 default

Step 4: Start Streaming

plexus start --key plx_xxxxx --mavlink udpin:0.0.0.0:14550

Or for a USB-connected Pixhawk:

plexus start --key plx_xxxxx --mavlink /dev/ttyACM0:57600

You'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.armed

Step 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-001

Sessions 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 MessagePlexus Metrics
ATTITUDEattitude.roll, attitude.pitch, attitude.yaw
GPS_RAW_INTgps.latitude, gps.longitude, gps.altitude
GLOBAL_POSITION_INTgps.groundspeed, gps.heading
SYS_STATUSbattery.voltage, battery.current, battery.remaining
HEARTBEATheartbeat.mode, heartbeat.armed, heartbeat.system_status
VFR_HUDvfr.airspeed, vfr.groundspeed, vfr.altitude, vfr.climb
RC_CHANNELSrc.ch1–rc.ch8
SERVO_OUTPUT_RAWservo.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