1. MAVLink 协议概述
各位同学,咱们今天聊聊 MAVLink。这个协议,说白了就是无人机世界的“普通话”。没有它,飞控、地面站、摄像头、机械臂……这些设备之间根本没法沟通。
我最早接触 MAVLink 是在 2015 年,当时做一个多机协同的项目。几台无人机在天上飞,地面站要同时控制它们,还得回传状态。那时候我就意识到,没有一个统一的通信协议,这事儿根本搞不定。MAVLink 就是干这个的。
什么是 MAVLink
MAVLink 的全称是 Micro Air Vehicle Link,微小型飞行器通信链路。它由苏黎世联邦理工学院的 Lorenz Meier 在 2009 年提出,最初是为 PX4 和 ArduPilot 项目设计的。
它的核心特点就三个:
- 轻量级——报文非常小,v1.0 版本最小只有 8 字节,适合低带宽、高延迟的无线链路。
- 实时性——采用发布/订阅模式,消息可以按固定频率发送,比如姿态数据 50Hz,GPS 数据 10Hz。
- 可扩展——协议定义了消息 ID 空间,你可以自定义消息,只要不跟官方冲突就行。
一句话总结:MAVLink 是无人机系统里,飞控、地面站、机载计算机之间交换数据的标准协议。它定义了“谁发什么、怎么发、发完怎么解析”。
MAVLink 的发展历史
这个协议的发展,其实挺有意思的。我把它分成三个阶段:
| 阶段 | 时间 | 关键事件 |
|---|---|---|
| v0.9 | 2009 | 最初原型,用于 PX4 飞控的内部测试 |
| v1.0 | 2010-2011 | 正式发布,被 ArduPilot 采用,成为行业标准 |
| v2.0 | 2017-至今 | 引入签名、扩展帧、多目标寻址,解决 v1.0 的安全和扩展问题 |
我记得 2017 年刚出 v2.0 的时候,很多老项目不愿意升级。为什么?因为 v1.0 太稳定了,而且改协议意味着要改驱动、改地面站、改日志解析……工作量不小。但后来大家发现,v2.0 的签名机制能有效防止“假报文注入”,这在工业级应用里是刚需,所以慢慢都迁过来了。
MAVLink v1.0 vs v2.0
这两个版本的区别,我直接列个表,大家一目了然:
| 对比项 | v1.0 | v2.0 |
|---|---|---|
| 帧头长度 | 6 字节 | 10-14 字节 |
| 系统 ID | 1 字节(最多 255 个系统) | 1 字节(兼容) |
| 组件 ID | 1 字节 | 1 字节 |
| 消息 ID | 1 字节(最多 255 种消息) | 3 字节(最多 16777215 种) |
| 签名 | 不支持 | 可选,13 字节 HMAC-SHA256 |
| 目标系统/组件 | 不支持 | 支持,可指定接收者 |
| 兼容性 | v2.0 可自动检测并降级 | 向下兼容 v1.0 |
这里有个坑,我提醒一下大家。v2.0 虽然功能更强,但如果你在串口上同时跑 v1.0 和 v2.0 的设备,一定要确认地面站或路由器的自动检测逻辑是否正常。我曾经遇到过一个问题:一个 v2.0 的飞控连上一个只支持 v1.0 的老地面站,地面站收到 v2.0 的帧头直接丢弃,导致链路不通。后来我在飞控端强制降级到 v1.0 才解决。
注意:v2.0 的签名功能需要预先共享密钥。如果密钥泄露,签名就形同虚设。生产环境中,密钥必须通过安全渠道分发,比如加密文件或硬件安全模块。
MAVLink 的应用场景
MAVLink 的应用范围,其实比很多人想象的要广。我把它分成几类:
- 无人机飞控与地面站通信——这是最经典的场景。飞控通过 MAVLink 上报姿态、GPS、电池状态,地面站下发航点、模式切换、遥控指令。
- 多机协同——几台无人机之间通过 MAVLink 交换位置、状态、任务信息。我做过一个项目,三台无人机编队飞行,每台都通过 MAVLink 广播自己的 GPS 坐标,然后机载计算机做相对定位和避障。
- 机载计算机与飞控交互——比如树莓派或 Jetson 通过串口或 UDP 连接飞控,用 MAVLink 获取传感器数据,或者发送控制指令。说白了,这就是“大脑”和“小脑”之间的通信。
- 仿真与测试——在 Gazebo、AirSim 等仿真环境中,MAVLink 是连接仿真飞控和外部控制器的标准接口。我们后面几章会重点讲这个。
- 工业与农业应用——比如植保无人机通过 MAVLink 上报喷洒流量、药箱液位;巡检无人机上报检测结果、图像元数据。
你想想看,如果没有 MAVLink,每个飞控厂商都用自己的私有协议,那地面站、机载计算机、仿真平台都得单独适配,这得多麻烦?MAVLink 的存在,让整个生态统一了。
MAVLink 协议栈结构
为了让大家更直观地理解 MAVLink 在整个系统里的位置,我画了一张图:
从这张图你能看到,MAVLink 处于中间层,它不关心你是用串口还是 UDP,也不关心你是飞控还是地面站。它只负责把“我要发什么消息”变成一串字节,然后交给下层去传输。接收方拿到字节流,再按同样的规则解析出来。
嗯,这里要注意:MAVLink 本身不保证可靠传输。如果你用 UDP,丢包了它不会重传。所以关键消息(比如航点上传、模式切换)需要应用层做确认机制。我一般会在机载计算机上写一个超时重试逻辑,确保指令送达。
小技巧:在仿真环境里调试 MAVLink 通信时,可以用 mavlink-router 或 mavproxy.py 来抓包和转发。这两个工具能帮你看到每一帧的原始数据,排查问题非常方便。我们后面章节会专门讲怎么用它们。