2. MAVLink协议基础
MAVLink(Micro Air Vehicle Link)是无人机与地面站、飞控与机载计算机之间最常用的轻量级通信协议。它采用二进制帧格式,开销小、解析快,适合串口、UDP、TCP 等多种链路。理解 MAVLink1 与 MAVLink2 的差异,是后续学习签名与通信安全的前提。
一、核心原理:从 MAVLink1 到 MAVLink2 的演进
MAVLink1 诞生于 2009 年前后,帧头固定为 6 字节,最大载荷 255 字节,使用 8 位消息 ID,最多定义 256 种消息。随着无人机系统复杂度提升,消息种类迅速超过 256 种,且需要更好的扩展性与安全性,MAVLink2 应运而生。
MAVLink2 的核心改进包括:帧头扩展为 10 字节,消息 ID 扩展为 24 位,支持载荷截断(payload truncation)以节省带宽,并引入可选的签名机制(signature)用于消息完整性与来源认证。MAVLink2 向下兼容 MAVLink1,但 MAVLink1 设备无法解析 MAVLink2 帧。
关键结论:MAVLink2 不是简单“加长版”,而是在保持轻量级的同时,解决了消息空间、带宽效率和通信安全三个核心问题。
二、消息帧结构:逐字段拆解
MAVLink 帧由帧头、载荷、校验和(以及 MAVLink2 的可选签名)组成。下面以 MAVLink2 帧为例说明字段含义。
| 字段 | 长度 | 含义 |
|---|---|---|
| STX | 1 字节 | 起始标志,MAVLink1 为 0xFE,MAVLink2 为 0xFD |
| LEN | 1 字节 | 载荷长度,不含签名 |
| INCOMPAT_FLAGS | 1 字节 | 不兼容标志,接收方必须理解才能解析 |
| COMPAT_FLAGS | 1 字节 | 兼容标志,接收方不理解也可忽略 |
| SEQ | 1 字节 | 帧序号,用于丢包检测 |
| SYSID | 1 字节 | 系统 ID,标识飞行器或地面站 |
| COMPID | 1 字节 | 组件 ID,标识系统内具体组件 |
| MSGID | 3 字节 | 消息 ID,MAVLink2 为 24 位 |
| PAYLOAD | 0~255 字节 | 消息数据,按字段顺序排列 |
| CHECKSUM | 2 字节 | CRC-16 校验,覆盖帧头到载荷 |
| SIGNATURE | 13 字节 | 可选,MAVLink2 签名,含链路 ID、时间戳和签名值 |
MAVLink1 帧头为 6 字节:STX、LEN、SEQ、SYSID、COMPID、MSGID(1 字节),没有 INCOMPAT_FLAGS 和 COMPAT_FLAGS,也没有签名。MAVLink2 帧头为 10 字节,消息 ID 扩展为 3 字节。
三、版本差异与典型应用场景
MAVLink1 与 MAVLink2 的主要差异可归纳为以下几点:
- 帧头长度:MAVLink1 为 6 字节,MAVLink2 为 10 字节。
- 消息 ID:MAVLink1 为 8 位,MAVLink2 为 24 位。
- 载荷截断:MAVLink2 支持尾部零字节截断,减少带宽占用。
- 签名机制:MAVLink2 支持 13 字节签名,MAVLink1 不支持。
- 兼容性:MAVLink2 可解析 MAVLink1 帧,反之不行。
典型应用场景方面,MAVLink1 常见于早期飞控、简单遥控链路和低带宽数传;MAVLink2 则广泛用于现代飞控(如 PX4、ArduPilot)、机载计算机通信、多机协同以及需要签名认证的安全链路。
实践提示:在 QGroundControl 或 MAVProxy 中,可通过参数 MAV_PROTO_VER 设置协议版本。若链路两端版本不一致,通常会出现“心跳可见但命令无响应”的现象。
四、案例与排障:一次版本不匹配的复盘
某次外场测试中,地面站发送 MAVLink2 指令,飞控却无响应。抓包发现飞控仅发送 MAVLink1 心跳。原因是飞控固件较旧,仅支持 MAVLink1。将地面站协议版本切换为 MAVLink1 后通信恢复。该案例说明:版本协商不是自动的,必须显式配置或确保双方兼容。
# 查看当前协议版本(MAVProxy 示例)
param show MAV_PROTO_VER
# 设置为 MAVLink2
param set MAV_PROTO_VER 2
# 设置为 MAVLink1
param set MAV_PROTO_VER 1
另一个常见误区是认为 MAVLink2 一定比 MAVLink1 慢。实际上,MAVLink2 的载荷截断和更高效的消息 ID 编码,在高频消息场景下反而可能更省带宽。真正影响性能的是链路质量、消息频率和签名开销。
注意:启用 MAVLink2 签名后,每帧增加 13 字节开销。在低带宽链路中需评估是否值得,或仅对关键指令启用签名。