[原]MAVLink 2介绍概述

mavlink官方文档入口

MAVLink是一种非常轻量级的消息传输协议, 用于地面控制终端(地面站)与无人机之间 (以及机载无人机组件之间) 进行通信。

Mavlink 遵循现代混合发布-订阅和点对点设计模式: 数据流作为 topics 发送/发布的, 而配置子协议 (如 路径点协议 或 参数协议)是基于重传机制的点对点模式。

消息内容定义于与之关联的xml 文件中。 每个xml文件对应一个特定的MAVLink系统,并为该系统定义了专属的消息集(亦被称之为“语支dialect”)。 大部分 地面站和自动驾驶仪所采用的“通用消息集”定义于 common.xml中 (大多数“语支”均是基于“通用消息集“构建 的:即,大多数“语支”所对应的xml文件里,均包含了common.xml) 。

代码生成器根据这些 XML 消息定义为特定编程语言创建软件库,然后无人机、地面控制站和其他 MAVLink 系统可以使用这些软件库进行通信。生成的库通常是 MIT 许可的,因此可以在任何闭源应用程序中不受限制地使用,而无需发布闭源应用程序的源代码。

Note 基于C封装的MAVLink库,是一个 header-only库, 其针对资源受限系统有限的ram 和闪存,进行了高度优化。 这种库,已经过现场验证, 并部署在许多产品中, 充当不同厂家组件之间的交互性接口。

主要特征

  • 高效性。 MAVLink 1每个数据包只有8个字节的开销, 包括起始标志和数据包丢弃检测。 MAVLink 2只有14个字节的开销 (但它是一个更安全且可扩展的协议)。 因为MAVLink不需要任何额外的帧, 所以它非常适合通信带宽非常有限的应用程序。
  • 可靠性。 自2009年以来, MAVLink一直被用于多种载具、地面站 (和其他节点) 之间的通信,而这些通信信道中,不乏各种挑战性(如高延迟、噪声) 。 同时,Mavlink也具备检测数据包丢失、损坏和数据包身份验证的功能。
  • Many different programming languages can be used, running on numerous microcontrollers/operating systems (including ARM7, ATMega, dsPic, STM32 and Windows, Linux, MacOS, Android and iOS).
  • 单个网络上最多可容纳255个并行系统 (载具、地面站等)。
  • 支持offboard和 onboard通信 (例如,地面站和无人机之间的通信(offboard), 以及无人机自动驾驶仪与启用MAVLink的无人机摄像头之间的通信(onboard))。

协议概述

MAVLink 是一种二进制遥测协议,专为资源受限的系统和带宽受限的链路而设计。MAVLink部署有两个主要版本:v1.0和v2.0,v2.0向后兼容(v2.0实现可以解析和发送v1.0数据包)。遥测数据流以多播设计发送,而改变系统配置并需要保证传输(如任务协议参数协议)的协议方面是点对点重传。

以下是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];      ///< Signature which allows ensuring that the link is tamper-proof (optional)

序列化

MAVLink 的在线格式针对资源受限的系统进行了优化,因此字段顺序与 XML 规范中的字段顺序不同。在线生成器根据大小对消息的所有字段进行排序,uint64_t首先是最大的字段 ( ),然后是较小的字段。排序是使用稳定的排序算法完成的,这确保任何不需要重新排序的字段保持相同的相对顺序。这可以防止编码/解码系统上的对齐问题,并允许非常有效的打包/解包。

有关详细信息和特定异常,请参阅序列化

混合流传输与传送保证

MAVLink 专为混合网络而构建,其中来自数据源(通常是无人机)的高速数据流流向数据接收器(通常是地面站),但与需要保证交付的传输混合在一起。关键的见解是,对于大多数遥测流来说,没有已知的或单一的接收者:相反,通常机载计算机、地面控制站和云系统都需要相同的数据流。

另一方面,配置机载任务或使用机载参数更改系统配置需要保证交付的点对点通信。MAVLink 通过允许两种操作模式实现了非常高的效率。

主题(Topic)模式(发布-订阅)

在主题模式下,协议不会发出消息的目标系统和组件 ID,以节省链路带宽。这种通信模式的典型示例是所有自动驾驶仪数据流,例如位置、姿态等。

这种多播模式的主要好处是不会产生额外的开销,并且多个订阅者都可以接收该数据。

点对点模式

在点对点模式下,MAVLink 使用目标 ID 和目标组件。在大多数使用这些字段的情况下,子协议还确保有保证的交付(任务、参数、命令)。

完整性检查/校验和

MAVLink 实现两个完整性检查:第一个检查是使用 CRC-16/MCRF4XX 校验和在传输过程中检查数据包的完整性。然而,这只能确保链接上的数据没有被更改 - 它不能确保与数据定义的一致性。第二个完整性检查是针对数据描述,以确保具有相同 ID 的两条消息确实包含相同的信息。为了实现这一点,数据定义本身通过 CRC-16-CCITT 运行,并且结果值用于作为数据包 CRC 的种子。大多数参考实现将此常量存储在名为CRC_EXTRA的数组中

 

 
posted @   南水之源  阅读(635)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2018-01-05 [osg]osg窗口显示和单屏幕显示
点击右上角即可分享
微信分享提示