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 生态全景图 MAVLink 协议 飞控 / 自动驾驶仪 PX4 / ArduPilot / 自研 地面站 (GCS) QGC / Mission Planner 传感器 / 执行器 GPS / 云台 / 机械臂 其他设备 数传 / 图传 / 伴计算机 MAVLink 是连接飞控、地面站、传感器、执行器的“通用语言” 支持串口、UDP、TCP 等多种物理层传输方式

注意:MAVLink 不是万能的。它不负责视频流传输(那是图传的事),也不处理高实时性控制(如电机 PWM 输出)。它的定位是“控制与状态消息”的传输层。别指望用它传 4K 视频,那是 H.264 的活。