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版本内容含义
0STXuint8_t magic数据包起始标志0xFD协议特定的文本开始(STX)标记,用于指示新数据包的开始。
1LENuint8_t len有效载荷长度0 - 255标识该消息包中负载长度
2INC FLAGSuint8_t incompat_flags不兼容标志-为实现MAVLink兼容性必须理解的标志(若实现不理解标志,则丢弃数据包)。
3CMP FLAGSuint8_t compat_flags兼容性标志-如果不理解,则可以忽略的标志(即使不理解标志,实现仍然可以处理数据包)。
4SEQuint8_t seq包序列号0 - 255消息发送序列号,用于检测数据包的丢失
5SYS IDuint8_t sysid系统 ID (发送者)1 - 255发送信息的系统(车辆)的ID。用于区分网络上的系统.
6COMP IDuint8_t compid组件ID (发送者)1 - 255发送消息的组件的ID。用于区分系统中的组件(例如自动驾驶仪和摄像头)
7 to 9MSG IDuint32_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)PAYLOADuint8_t payload[max 255]消息载荷-消息内部的负载信息
(n+10) to (n+11)CHECKSUMuint16_t checksumChecksum (low byte, high byte)-CRC-16/MCRF4XX for message (excluding magic byte). Includes CRC_EXTRA byte.
(n+12) to (n+25)SIGNATUREuint8_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旗特征
0x01MAVLINK_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协议第一版介绍

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MAVLink是一种轻量级的、可扩展的通讯协议,用于在无人机和地面站之间传输数据。MAVLink协议使用UDP、TCP、串口等传输方式。以下是MAVLink协议的详细介绍。 1. MAVLink协议的数据包格式 MAVLink协议的数据包格式分为两个部分:头部和数据。头部包含了数据包的长度、序列号、系统ID、组件ID、消息ID和CRC校验码。数据部分包含了数据包的内容。 头部的格式如下: ``` typedef struct MAVLink_header_t { uint16_t len; // 数据包长度 uint8_t seq; // 数据包序列号 uint8_t sysid; // 发送者的系统ID uint8_t compid; // 发送者的组件ID uint8_t msgid; // 消息ID uint8_t crc[2]; // CRC校验码 } MAVLink_header_t; ``` 数据部分的格式根据消息ID的不同而不同。MAVLink定义了一系列消息ID,包括心跳消息、状态消息、姿态消息、传感器消息等。每个消息的数据部分都包含了特定的字段,用于描述该消息的内容。 2. MAVLink协议的数据包传输 MAVLink协议支持UDP、TCP、串口等多种传输方式。在使用UDP传输时,MAVLink协议将数据包封装为UDP数据报进行传输。在使用TCP传输时,MAVLink协议将数据包封装为TCP数据流进行传输。在使用串口传输时,MAVLink协议将数据包封装为帧格式进行传输。 3. MAVLink协议的数据包解析 MAVLink协议的数据包解析主要包括以下几个步骤: (1)接收数据包:从传输通道中接收到一个MAVLink数据包。 (2)校验数据包:使用CRC校验码对接收到的数据包进行校验。 (3)解析头部:解析数据包头部,得到数据包的长度、序列号、系统ID、组件ID、消息ID和CRC校验码。 (4)解析数据:根据消息ID解析数据包的数据部分,得到数据包的内容。 以上是MAVLink协议的详细介绍。在使用MAVLink协议进行通讯时,需要根据具体的应用场景选择合适的传输方式,并根据消息ID解析数据包的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值