1. MAVLink 协议概述
各位同学好,欢迎来到这门课。我是你们这趟旅程的向导。
做嵌入式通信这么多年,我接触过不少协议。但要说在无人机和机器人领域最让我省心的,还得是 MAVLink。它不是什么高深莫测的东西,说白了,就是一套让飞控、地面站、摄像头、机械臂这些设备能互相“听懂”的通用语言。
什么是 MAVLink
MAVLink 的全称是 Micro Air Vehicle Link,微型飞行器链路协议。2009 年由苏黎世联邦理工学院的 Lorenz Meier 在 PIXHAWK 项目中首次提出。
它的核心设计理念就两条:轻量和可靠。
- 轻量:一个最简数据包只有 8 个字节。在串口带宽有限的年代,这简直是救命的设计。我记得早期用 115200 波特率跑数传,每多一个字节都心疼。
- 可靠:每个包都带校验和,丢包重传机制也很成熟。我在项目里遇到过无线干扰严重的情况,MAVLink 的校验机制帮我挡掉了至少 90% 的误码。
一句话总结:MAVLink 是无人机/机器人领域的“HTTP 协议”。它定义了消息的格式、ID 和传输规则,让不同厂商的硬件和软件能无缝协作。
MAVLink 的发展历史
这协议的发展史,其实就是一部开源无人机的发展史。我把它分成三个阶段来讲。
| 阶段 | 时间 | 关键事件 |
|---|---|---|
| 萌芽期 | 2009 - 2012 | PIXHAWK 项目诞生,MAVLink v1.0 发布。主要服务学术研究,消息类型不到 100 种。 |
| 爆发期 | 2013 - 2017 | APM 和 PX4 生态崛起,MAVLink 成为事实标准。v2.0 草案开始讨论,解决 v1.0 的扩展性问题。 |
| 成熟期 | 2018 - 至今 | MAVLink v2.0 正式发布,支持 256 个消息 ID、签名认证、可变长度负载。ArduPilot、PX4、QGroundControl 全面迁移。 |
嗯,这里有个小插曲。2015 年我参与一个农业植保项目,用的还是 v1.0。当时需要自定义一个喷洒流量控制消息,结果发现 v1.0 的消息 ID 空间只有 256 个,而且很多被官方占用了。我们只能硬着头皮用保留 ID,结果和另一家公司的自定义消息冲突了……从那以后,我坚定地转向了 v2.0。
MAVLink v1.0 vs v2.0
这两个版本的区别,我直接上对比表,大家一目了然。
| 特性 | MAVLink v1.0 | MAVLink v2.0 |
|---|---|---|
| 消息 ID 范围 | 0 - 255(8 位) | 0 - 16777215(24 位) |
| 负载长度 | 固定 0 - 255 字节 | 可变,最大 255 字节 |
| 签名认证 | 不支持 | 支持(SHA-256,防止篡改) |
| 兼容性 | 基础,向后兼容 | 向前兼容 v1.0(自动检测) |
| 最小包长 | 8 字节 | 10 字节(含签名则更长) |
我的建议:新项目直接上 v2.0。v1.0 就像老式诺基亚,打电话发短信没问题,但想装个就难了。v2.0 的签名认证在商业无人机上几乎是刚需——我曾经见过有人用 v1.0 的无人机做演示,被隔壁实验室用 SDR 设备伪造了遥控指令,差点炸机。
MAVLink 的应用场景
MAVLink 的应用范围比很多人想象的要广。它不只是飞控和地面站之间的“传话筒”。
- 无人机(UAV):这是最经典的应用。飞控(PX4/ArduPilot)通过 MAVLink 向地面站发送姿态、GPS、电池状态;地面站通过 MAVLink 发送航点、模式切换指令。我做过一个测绘项目,无人机在 500 米外通过 433MHz 数传回传实时 RTK 定位数据,MAVLink 的丢包重传机制保证了厘米级精度。
- 机器人(UGV/USV):地面机器人、无人船、水下航行器都在用。MAVLink 的通用消息定义(如
NAV_CONTROLLER_OUTPUT)可以描述任何移动平台的运动状态。我参与过一个巡检机器人项目,用 MAVLink 在工控机和底盘控制器之间传递速度指令和里程计数据,比自定义协议省了至少 3 周的开发时间。 - 地面站(GCS):QGroundControl、Mission Planner、MAVSDK 都是 MAVLink 的典型应用。它们通过 MAVLink 协议解析飞控数据、发送指令、记录日志。甚至有人用 MAVLink 做无人机编队表演——一台地面站同时控制上百台无人机,靠的就是 MAVLink 的
COMMAND_LONG和MISSION_ITEM消息。
下面这张图,是我自己画的一个 MAVLink 生态全景图。它展示了 MAVLink 如何连接各个组件。
注意:MAVLink 不是万能的。它不负责视频流传输(那是图传的事),也不处理高实时性控制(如电机 PWM 输出)。它的定位是“控制与状态消息”的传输层。别指望用它传 4K 视频,那是 H.264 的活。