Mavlink协议(第二版)

文章目录

    • 协议简介
      • 一、Mavlink协议
        • 主要特点
      • 二、数据结构
        • 不兼容标志 (MAVLink 2)
        • 兼容性标志 (MAVLink 2)
        • 有效载荷格式
        • MAVLink 2 的数据包格式
      • 三、航点协议
      • 四、参数的读写
      • 五、增加新的mavlink消息
      • 六、消息的发送与解析
      • 七、通用的Mavlink消息
    • 参考资料

协议简介

不整理了,官方给出了新版本很清晰了已经。

官方中文文档:

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传输时基本单位是消息帧,消息帧的结构如下:

mavlink-structMavLink数据结构

字节索引 名称 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];      ///< 保证正确连接的签名(可选)

三、航点协议

四、参数的读写

五、增加新的mavlink消息

六、消息的发送与解析

七、通用的Mavlink消息

参考资料

1.Mavlink协议
2.Mavlink协议第一版介绍

你可能感兴趣的:(物联网,mavLink)