# MAVLink

Live telemetry from PX4 and ArduPilot vehicles

- Category: Vehicles
- Capabilities: Streams, Entities, Operations
- Runs on: Linux x64, Linux ARM64, macOS Apple silicon, macOS Intel, Windows x64

Stream live telemetry from PX4 and ArduPilot vehicles over UDP, TCP or serial
(a USB cable or a telemetry radio). Plug a flight controller in over USB and
Phloem offers it on **Inputs**.

## What you get

- **Every message the vehicle sends**, not a fixed list. That covers the
  whole ArduPilot dialect, which includes the common MAVLink set. A field
  shows as `/mav/<system>/<component>/<message>/<field>`, such as
  `/mav/1/1/attitude/roll` or `/mav/1/1/battery_status/voltages[0]`.
- **Several vehicles and components on one link.** The system id separates
  vehicles. The component id separates an autopilot from its gimbal or
  camera.
- **Real units.** Latitude in degrees, altitude in metres, speed in m/s,
  temperature in °C, battery in volts and amps. Every channel declares its
  unit.
- **"Not measured" stays empty.** A field the vehicle marks as no reading,
  such as an absent battery cell, shows as no reading, never as 65.535 V.
- **Position as a track on the map**, from the fused position and from raw
  GPS once it has a 3D fix.

## Setup

Enter the **Connection**:

| Connection | Means |
|---|---|
| `udpin:0.0.0.0:14550` | listen for a vehicle (a simulator sends here by default) |
| `udpout:192.168.1.10:14555` | send to a vehicle at that address |
| `tcpout:192.168.1.20:5760` | connect to a vehicle, or a simulator on another computer, over TCP |
| `serial:/dev/ttyACM0:115200`, `COM3` | a flight controller or radio on a serial port |

Press **Test connection**. It waits for the vehicle's heartbeat and names what
answered, such as "PX4 QUADROTOR (system 1, component 1)".

## Time

Each sample carries the moment the vehicle measured it, in UTC, not the moment
it arrived. Phloem asks the vehicle for `SYSTEM_TIME` once a second to line up
its clock.

- Until the first `SYSTEM_TIME` arrives, or for a message with no time of its
  own, the arrival time is used. The channel records that.
- A vehicle reboot is detected and handled.
- The servo outputs' clock rolls over every 71.6 minutes. Samples still land
  at their true time.

## The full PX4 log, live

Telemetry is a few dozen messages at a few hertz. The log is every sensor,
estimator and controller topic at full rate. Turn on **Stream the full log
(PX4)** to stream it live. It lands on the same `/ulog/<topic>_<instance>/<field>`
channels as an imported `.ulg` file, so live and imported flights line up.

- It needs a link of at least 5 KB/s: a USB cable or Ethernet, not a telemetry
  radio.
- PX4 does not stream its log while a simulator runs in lockstep.
- When PX4 refuses, the input says why.
- A lost packet shows as a gap on every log channel.

## Supports

- PX4 and ArduPilot over UDP, TCP or serial (USB or a telemetry radio)
- Every message in the ardupilotmega dialect (a superset of common), not a fixed list
- Units from the dialect: scaled encodings (degE7, mm, cm/s, cdegC, mV, cA) landed as degrees, metres, m/s, °C, V, A
- A field's 'no reading' value (an unmeasured current, an absent cell) landed as no reading
- Several vehicles and components on one link, each on its own channels
- Vehicle time placed on UTC from the vehicle's SYSTEM_TIME; the vehicle's position as a track on the map
- PX4's full log streamed live over USB or Ethernet, decoded exactly as an imported .ulg; lost packets stated as gaps

## Connection fields

| Field | Type | Required | Notes |
|---|---|---|---|
| Connection | Text | Yes | udpin:host:port (listen), udpout:host:port, tcpout:host:port, serial:port[:baud], or a serial port such as /dev/ttyACM0 or COM3. |
| Stream the full log (PX4) | On / off | No | Every topic the autopilot logs, live, on the same channels an imported .ulg lands on. PX4 streams its log only over USB or Ethernet (at least 5 KB/s), not a telemetry radio. |
