MAVLink


MAVLink or Micro Air Vehicle Link is a protocol for communicating with small unmanned vehicle. It is designed as a header-only message marshaling library. MAVLink was first released early 2009 by Lorenz Meier under LGPL license.

Applications

It is used mostly for communication between a Ground Control Station and Unmanned vehicles, and in the inter-communication of the subsystem of the vehicle. It can be used to transmit the orientation of the vehicle, its GPS location and speed.

Packet Structure

In version 1.0 the packet structure is the following:
Field nameIndex Purpose
Start-of-frame0Denotes the start of frame transmission
Payload-length1length of payload
Packet sequence2Each component counts up their send sequence. Allows for detection of packet loss.
System ID3Identification of the SENDING system. Allows to differentiate different systems on the same network.
Component ID4Identification of the SENDING component. Allows to differentiate different components of the same system, e.g. the IMU and the autopilot.
Message ID5Identification of the message - the id defines what the payload “means” and how it should be correctly decoded.
Payload6 to The data into the message, depends on the message id.
CRC to Check-sum of the entire packet, excluding the packet start sign

After Version 2, the packet structure was expanded into the following:
Field nameIndex Purpose
Start-of-frame0Denotes the start of frame transmission
Payload-length1length of payload
incompatibility flags2Flags that must be understood for MAVLink compatibility
compatibility flags3Flags that can be ignored if not understood
Packet sequence4Each component counts up their send sequence. Allows for detection of packet loss.
System ID5Identification of the SENDING system. Allows to differentiate different systems on the same network.
Component ID6Identification of the SENDING component. Allows to differentiate different components of the same system, e.g. the IMU and the autopilot.
Message ID7 to 9Identification of the message - the id defines what the payload “means” and how it should be correctly decoded.
Payload10 to The data into the message, depends on the message id.
CRC to Check-sum of the entire packet, excluding the packet start sign
Signature to Signature to verify that messages originate from a trusted source.

CRC field

To ensure message integrity a cyclic redundancy check is calculated to every message into the last two bytes. Another function of the CRC field is to ensure the sender and receiver both agree in the message that is being transferred. It is computed using an ITU X.25/SAE AS-4 hash of the bytes in the packet, excluding the Start-of-Frame indicator.
Additionally a seed value is appended to the end of the data when computing the CRC. The seed is generated with every new message set of the protocol, and it is hashed in a similar way as the packets from each message specifications. Systems using the MAVLink protocol can use a precomputed array to this purpose.
The CRC algorithm of MAVLink has been implemented in many languages, like Python and Java.

Messages

The payload from the packets described above are MAVLink messages. Every message is identifiable by the ID field on the packet, and the payload contains the data from the message. An XML document in the MAVlink source has the definition of the data stored in this payload.
Below is the message with ID 24 extracted from the XML document.


The global position, as returned by the Global Positioning System. This is NOT the global position estimate of the system, but rather a RAW sensor value. See message GLOBAL_POSITION for the global position estimate. Coordinate frame is right-handed, Z-axis up.
Timestamp
0-1: no fix, 2: 2D fix, 3: 3D fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.
Latitude, in degrees * 1E7
Longitude, in degrees * 1E7
Altitude, in meters * 1000
GPS HDOP horizontal dilution of position in cm. If unknown, set to: UINT16_MAX
GPS VDOP horizontal dilution of position in cm. If unknown, set to: UINT16_MAX
GPS ground speed. If unknown, set to: UINT16_MAX
Course over ground in degrees * 100, 0.0..359.99 degrees. If unknown, set to: UINT16_MAX
Number of satellites visible. If unknown, set to 255


Note: The XML document describes the logical ordering of the fields for the protocol. The actual wire format has the fields reordered to reduce Data structure alignment issues. This can be a source of confusion when reading the code generated from the message definitions.

MAVLink Ecosystem

MAVLink is used as the communication protocol in many projects, which may mean there is some compatibility between them. An interesting tutorial explaining basics of MAVLink has been written.