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 协议栈与典型系统架构 应用层 地面站 (QGC / Mission Planner) | 机载计算机 | 仿真环境 MAVLink 协议层 消息定义 | 序列化 | 校验 | 签名 (v2.0) 传输层 串口 (UART) | UDP | TCP | 蓝牙 | 数传电台 物理层 USB / 串口线 / 无线射频 / 以太网 MAVLink 不关心底层传输介质,只要上层能收发字节流,它就能工作 仿真联调时,最常用的是 UDP 和串口回环

从这张图你能看到,MAVLink 处于中间层,它不关心你是用串口还是 UDP,也不关心你是飞控还是地面站。它只负责把“我要发什么消息”变成一串字节,然后交给下层去传输。接收方拿到字节流,再按同样的规则解析出来。

嗯,这里要注意:MAVLink 本身不保证可靠传输。如果你用 UDP,丢包了它不会重传。所以关键消息(比如航点上传、模式切换)需要应用层做确认机制。我一般会在机载计算机上写一个超时重试逻辑,确保指令送达。

小技巧:在仿真环境里调试 MAVLink 通信时,可以用 mavlink-router 或 mavproxy.py 来抓包和转发。这两个工具能帮你看到每一帧的原始数据,排查问题非常方便。我们后面章节会专门讲怎么用它们。