3. 通信协议基础:MAVLink协议详解

各位同学,今天我们来聊聊无人机系统里最核心的「语言」——通信协议。说白了,地面站和飞机之间怎么说话,全靠它。

我最早接触无人机时,踩过一个坑:飞机在天上飞得好好的,突然地面站收不到数据了。排查了半天,发现是串口波特率没对上。嗯,这种低级错误,我相信你们不会犯,但通信协议这块要是理解不透,后面调试起来真的会让人抓狂。

3.1 MAVLink协议概述

MAVLink,全称Micro Air Vehicle Link,是目前无人机领域应用最广的通信协议。我个人的习惯是把它理解成「无人机界的HTTP协议」——它定义了数据怎么打包、怎么解析、怎么保证可靠性。

MAVLink有两个主要版本:v1.0和v2.0。v2.0主要增加了签名机制,防止数据被篡改。如果你做的是消费级产品,v1.0够用;但要是做行业应用,我建议直接上v2.0。

3.2 消息格式详解

MAVLink的消息结构其实不复杂。每个消息包由三部分组成:

  • 帧头:固定字节,标识消息开始
  • 载荷:实际数据,长度可变
  • 校验:CRC校验,保证数据完整性

来看一个典型的MAVLink v1.0消息包结构:

字节偏移  字段名        说明
0         STX          帧头,固定0xFE
1         LEN          载荷长度
2         SEQ          序列号
3         SYS          系统ID
4         COMP         组件ID
5         MSGID        消息ID
6..N      PAYLOAD      载荷数据
N+1..N+2  CKA/CKB      校验和

这里有个细节要注意:序列号SEQ。我在项目中遇到过,地面站收不到数据时,第一反应就是看SEQ是否连续。如果跳号了,说明有丢包;如果一直不变,说明飞机根本没发数据。

小技巧:调试MAVLink时,可以用Wireshark抓包,配合MAVLink解析插件,能直观看到每个字段的值。我当年就是这么学会的。

3.3 心跳包——飞机的「脉搏」

心跳包(HEARTBEAT)是MAVLink里最重要的消息。它每隔1秒发送一次,告诉地面站「我还活着」。你想想看,如果飞机失联了,地面站怎么知道?就是靠心跳包超时。

心跳包的消息ID是0,载荷只有几个关键字段:

字段 说明 常见值
type 飞行器类型 MAV_TYPE_QUADROTOR (2)
autopilot 飞控类型 MAV_AUTOPILOT_PX4 (12)
base_mode 飞行模式 0x81 (armed + stabilized)
system_status 系统状态 MAV_STATE_ACTIVE (4)
mavlink_version 协议版本 3

我曾经遇到过一个诡异的问题:地面站显示飞机在线,但就是收不到GPS数据。后来发现,心跳包里的system_status字段显示的是「校准中」,而不是「活跃」。说白了,飞机虽然活着,但还没准备好干活。

避坑指南:不要只依赖心跳包判断连接状态。我建议同时监控GPS数据流和遥控器信号,三重确认才靠谱。

3.4 GPS定位数据解析

GPS定位数据通过GLOBAL_POSITION_INT消息(MSGID=33)传输。这个消息包含经纬度、海拔、地速等信息。

关键字段如下:

字段名        类型        说明
lat           int32_t    纬度,单位:度×10^7
lon           int32_t    经度,单位:度×10^7
alt           int32_t    海拔,单位:毫米
relative_alt  int32_t    相对高度,单位:毫米
vx            int16_t    地速X分量,单位:cm/s
vy            int16_t    地速Y分量,单位:cm/s
vz            int16_t    地速Z分量,单位:cm/s
hdg           uint16_t   航向角,单位:度×100

这里有个坑:经纬度是乘以10^7的整数。我刚开始做地面站时,直接把这个值当浮点数用,结果飞机显示在太平洋中间。嗯,后来才反应过来要除以10^7。

举个例子:

// 原始数据
int32_t raw_lat = 223456789;  // 22.3456789° × 10^7

// 正确解析
double lat = raw_lat / 1e7;   // 22.3456789°
重点:GPS数据更新频率通常是5-10Hz。如果低于5Hz,说明GPS信号不好或者飞控负载过高。我一般会在地面站上画一个GPS信号强度指示器,方便快速定位问题。

3.5 串口通信原理

串口通信是地面站和飞控之间最常用的物理层连接方式。说白了,就是一根TX线、一根RX线、一根GND线,数据一位一位地传。

串口参数必须匹配:

  • 波特率:常见115200、57600、38400
  • 数据位:通常8位
  • 停止位:通常1位
  • 校验位:通常无

我个人的习惯是:开发阶段用115200,速度快;产品阶段降到57600,稳定性更好。为什么?因为115200对线材和干扰更敏感,长距离传输容易出错。

调试技巧:用串口助手看原始数据流。如果看到一堆乱码,八成是波特率不对。如果看到0xFE开头的字节,那就是MAVLink数据包。

3.6 TCP/UDP网络通信

当无人机飞得远了,串口就不够用了。这时候需要网络通信。TCP和UDP是两种最常用的传输层协议。

特性 TCP UDP
可靠性 可靠,有重传机制 不可靠,可能丢包
顺序性 保证数据顺序 不保证顺序
延迟 较高 较低
适用场景 指令下发、参数上传 视频流、遥测数据

我建议这样选:

  • 控制指令(如起飞、降落)用TCP,确保送达
  • 遥测数据(如GPS、姿态)用UDP,延迟低
  • 视频流必须用UDP,TCP的重传机制会导致画面卡顿

曾经有个项目,我们用TCP传视频流,结果画面延迟高达5秒。换成UDP后,延迟降到200毫秒。你想想看,5秒的延迟,飞手根本没法操作。

3.7 本章知识体系

下面这张图总结了本章的核心逻辑:

通信协议基础:知识体系 MAVLink协议 消息格式 帧头 + 载荷 + 校验 序列号SEQ防丢包 心跳包 每秒1次,消息ID=0 type/autopilot/base_mode GPS定位 GLOBAL_POSITION_INT 经纬度×10⁷,注意单位 串口通信 TCP/UDP网络

这张图展示了本章的核心脉络:MAVLink协议是核心,它定义了消息格式、心跳包和GPS定位数据。底层传输则依赖串口或TCP/UDP网络。你想想看,没有这些基础,地面站和飞机就是两个聋哑人,谁也听不懂谁。


好了,这一章的内容就到这里。通信协议这块,说白了就是「约定」——大家说好怎么打包、怎么解析、怎么传输。理解了这些,后面讲地面站架构设计时,你就能明白为什么数据流要这么设计了。

下一章我们会深入地面站的软件架构,看看这些协议数据到了地面站之后,是怎么被处理、显示和存储的。

可可精品资料库