文章目录
协议简介
不整理了,官方给出了新版本很清晰了已经。
官方中文文档:
https://github.com/mavlink/mavlink-devguide/tree/master/zh
https://github.com/mavlink/mavlink-devguide/tree/master/zh/guide
MavLink官网:https://mavlink.io/
MAVLink通讯协议是一个为微型飞行器设计的非常轻巧的、只由头文件构成的信息编组库。它可以通过串口非常高效地封装C结构数据,并将这些数据包发送至地面控制站。该协议被PX4, PIXHAWK, APM和Parrot AR.Drone平台所广泛测试并在以上的项目中作为MCU/IMU间以及Linux进程和地面站链路通信间的主干通信协议。
一、Mavlink协议
MAVLink 是一种非常轻量级的消息传递协议,用于与无人机(以及机载无人机组件之间)进行通信。
MAVLink 遵循现代混合发布-订阅和点对点设计模式:数据流作为主题发送/发布,而任务协议或参数协议等配置子协议是点对点重传。
消息在 XML 文件中定义。每个 XML 文件都定义了特定 MAVLink 系统支持的消息集,也称为“方言”。大多数地面控制站和自动驾驶仪实施的参考消息集在common.xml 中定义(大多数方言建立在此定义之上)。
代码生成器根据这些 XML 消息定义为特定编程语言创建软件库,然后无人机、地面控制站和其他 MAVLink 系统可以使用这些软件库进行通信。生成的库通常是 MIT 许可的,因此可以在任何闭源应用程序中不受限制地使用,而无需发布闭源应用程序的源代码。
主要特点
- 非常有效率。MAVLink 1 每个数据包只有 8 个字节的开销,包括开始标志和数据包丢弃检测。MAVLink 2 只有 14 字节的开销(但它是一个更安全和可扩展的协议)。由于 MAVLink 不需要任何额外的成帧,因此非常适合通信带宽非常有限的应用。
- 非常可靠。自 2009 年以来,MAVLink 已被用于在许多不同的车辆、地面站(和其他节点)之间通过各种且具有挑战性的通信渠道(高延迟/噪声)进行通信。它提供了检测数据包丢失、损坏和数据包身份验证的方法。
- 可以使用多种不同的编程语言,在众多微控制器/操作系统(包括 ARM7、ATMega、dsPic、STM32 和 Windows、Linux、MacOS、Android 和 iOS)上运行。
- 网络上最多允许 255 个并发系统(车辆、地面站等)
- 启用机外和机载通信(例如 GCS 和无人机之间,以及无人机自动驾驶仪和启用 MAVLink 的无人机相机之间)。
MAVLink于2009年初由Lorenz Meier首次发布, 目前为止,已拥有数量可观的贡献者。
基于C封装的MAVLink库,是一个 header-only库, 其针对资源受限系统有限的ram 和闪存,进行了高度优化。 这种库,已经过现场验证, 并部署在许多产品中, 充当不同厂家组件之间的交互性接口。
MAVLink 2的主要新特性是:
24 位消息 ID(指令类型) - 允许方言中超过 1600 万个唯一消息定义(MAVLink 1 限制为 256)
数据包签名- 验证消息是由受信任的系统发送的。
消息扩展- 向现有 MAVLink 消息定义添加新字段,而不会破坏尚未更新的接收器的二进制兼容性。
空字节有效负载截断- 序列化有效负载末尾的空(零填充)字节必须在发送之前删除(所有字节都在MAVLink 1中发送,无论内容如何)。
Compatibility Flags / Incompatibility Flags - 通过指示必须以特殊/非标准方式处理的帧来允许协议的向后兼容演变(具有兼容性标志的数据包仍可以以标准方式处理,而具有不兼容标志的数据包必须是如果不支持该标志,则丢弃)。
二、数据结构
MAVLink 是一种二进制遥测协议,专为资源受限系统和带宽受限链接而设计。MAVLink 部署在两个主要版本中:v1.0 和 v2.0,它们向后兼容(v2.0 实现可以解析和发送 v1.0 数据包)。遥测数据流以多播设计发送,而改变系统配置和需要保证交付(如任务协议或参数协议)的协议方面是点对点重传。
Mavlink传输时基本单位是消息帧,消息帧的结构如下:
字节索引 | 名称 | C版本 | 内容 | 值 | 含义 |
---|---|---|---|---|---|
0 | STX | uint8_t magic | 数据包起始标志 | 0xFD | 协议特定的文本开始(STX)标记,用于指示新数据包的开始。 |
1 | LEN | uint8_t len | 有效载荷长度 | 0 - 255 | 标识该消息包中负载长度 |
2 | INC FLAGS | uint8_t incompat_flags | 不兼容标志 | - | 为实现MAVLink兼容性必须理解的标志(若实现不理解标志,则丢弃数据包)。 |
3 | CMP FLAGS | uint8_t compat_flags | 兼容性标志 | - | 如果不理解,则可以忽略的标志(即使不理解标志,实现仍然可以处理数据包)。 |
4 | SEQ | uint8_t seq | 包序列号 | 0 - 255 | 消息发送序列号,用于检测数据包的丢失 |
5 | SYS ID | uint8_t sysid | 系统 ID (发送者) | 1 - 255 | 发送信息的系统(车辆)的ID。用于区分网络上的系统. |
6 | COMP ID | uint8_t compid | 组件ID (发送者) | 1 - 255 | 发送消息的组件的ID。用于区分系统中的组件(例如自动驾驶仪和摄像头) |
7 to 9 | MSG ID | uint32_t msgid:24 | 消息IDID (low, middle, high bytes) | 0 - 16777215 | 有效负载中消息类型的ID。用于将数据解码回消息对象。 |
For n-byte payload:n=0: NA, n=1: 10, n>=2: 10 to (9+n) | PAYLOAD | uint8_t payload[max 255] | 消息载荷 | - | 消息内部的负载信息 |
(n+10) to (n+11) | CHECKSUM | uint16_t checksum | Checksum (low byte, high byte) | - | CRC-16/MCRF4XX for message (excluding magic byte). Includes CRC_EXTRA byte. |
(n+12) to (n+25) | SIGNATURE | uint8_t signature[13] | 签名信息 | - | (可选) 签名以确保链接是防篡改的. |
- 对于没有有效负载的确认数据包,最小数据包长度为12字节。
- 对于使用整个有效负载的签名消息,最大数据包长度为280字节。
注意:校验码由crc16算法得到,算法从消息包的1~n+6字节(不包含STX),还要额外加上个
MAVLINK_CRC_EXTRA
进行计算得到一个16位的校验码。每个消息的头文件里都包含MAVLINK_CRC_EXTRA
,这个MAVLINK_CRC_EXTRA
是由生成mavlink代码的xml文件生成的,加入这个额外的东西是为了当飞行器和地面站使用不同版本的mavlink协议时,双方计算得到的校验码会不同,这样不同版本间的mavlink协议就不会在一起正常工作,避免了由于不同版本间通讯时带来的重大潜在问题。
不兼容标志 (MAVLink 2)
不兼容标志用于指示 MAVLink 库必须支持才能处理数据包的功能。这包括影响数据包格式/排序的任何功能。
如果 MAVLink 实现不理解字段中的任何标志,则它必须丢弃数据包incompat_flags。
支持的不兼容标志包括(在撰写本文时):
旗帜 | C旗 | 特征 |
---|---|---|
0x01 | MAVLINK_IFLAG_SIGNED | 数据包已签名(签名已附加到数据包)。 |
兼容性标志 (MAVLink 2)
兼容性标志用于指示功能不会阻止 MAVLink 库处理数据包(即使该功能不被理解)。例如,这可能包括一个标志,用于指示应将数据包视为“高优先级”(此类消息可由任何 MAVLink 实现处理,因为数据包格式和结构不受影响)。
MAVLink 实现可以安全地忽略它在该compat_flags领域不理解的标志。
有效载荷格式
MAVLink 在有效载荷本身中不包含有关消息结构的信息(为了减少开销)!相反,发送方和接收方必须对在线格式的消息字段的含义、顺序和大小有共同的理解。
消息在 MAVLink 数据包中编码:
- msgid(消息id)字段标识数据包中编码的特定消息,所有MavLink指令消息和应答消息都使用此标识标记类型。
- 有效负载字段包含消息数据:
-
- MAVLink为有线传输重新排序有效负载中的消息字段(根据原始XML消息定义中的顺序)。
-
- 在发送消息之前,MAVLink 2会截断有效负载末尾的任何零填充字节,并适当设置数据包长度字段(MAVLink 1始终发送所有字节)。
- len字段包含有效负载数据的长度。
- A CRC_EXTRA byte is added to the message checksum. 接收者可以使用它来确认它与有效负载消息格式/定义兼容。
A MAVLink library should notify a bad CRC during decoding if a message specification is incompatible (e.g. the C library mavlink_parse_char() gives a status MAVLINK_FRAMING_BAD_CRC).
MAVLink 2 的数据包格式
以下为在链路上传输的 MAVLink v2 数据包格式。 内存中的表示方式可能会有所不同。
uint8_t magic; ///< protocol magic marker
uint8_t len; ///< Length of payload
uint8_t incompat_flags; ///< flags that must be understood
uint8_t compat_flags; ///< flags that can be ignored if not understood
uint8_t seq; ///< Sequence of packet
uint8_t sysid; ///< ID of message sender system/aircraft
uint8_t compid; ///< ID of the message sender component
uint8_t msgid 0:7; ///< first 8 bits of the ID of the message
uint8_t msgid 8:15; ///< middle 8 bits of the ID of the message
uint8_t msgid 16:23; ///< last 8 bits of the ID of the message
uint8_t payload[max 255]; ///< A maximum of 255 payload bytes
uint16_t checksum; ///< CRC-16/MCRF4XX
uint8_t signature[13]; ///< 保证正确连接的签名(可选)