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 帧为例说明字段含义。

字段长度含义
STX1 字节起始标志,MAVLink1 为 0xFE,MAVLink2 为 0xFD
LEN1 字节载荷长度,不含签名
INCOMPAT_FLAGS1 字节不兼容标志,接收方必须理解才能解析
COMPAT_FLAGS1 字节兼容标志,接收方不理解也可忽略
SEQ1 字节帧序号,用于丢包检测
SYSID1 字节系统 ID,标识飞行器或地面站
COMPID1 字节组件 ID,标识系统内具体组件
MSGID3 字节消息 ID,MAVLink2 为 24 位
PAYLOAD0~255 字节消息数据,按字段顺序排列
CHECKSUM2 字节CRC-16 校验,覆盖帧头到载荷
SIGNATURE13 字节可选,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 字节开销。在低带宽链路中需评估是否值得,或仅对关键指令启用签名。

MAVLink1 与 MAVLink2 帧结构对比 MAVLink1 帧(6 字节帧头) STX LEN SEQ SYSID COMPID MSGID PAYLOAD CRC MAVLink2 帧(10 字节帧头 + 可选签名) STX LEN INC CMP SEQ SYS COMP MSGID(3B) PAYLOAD CRC SIGNATURE MAVLink1 帧头字段 MAVLink2 帧头字段 载荷 校验和 可选签名 核心差异速览 • 帧头:MAVLink1 为 6 字节,MAVLink2 为 10 字节 • 消息 ID:MAVLink1 为 8 位(256 种),MAVLink2 为 24 位(1600 万种) • 签名:MAVLink2 支持 13 字节签名,MAVLink1 不支持