3. 通信协议基础
各位同学,今天我们来聊聊无人机系统里最核心的「语言」——通信协议。说白了,地面站和飞机之间怎么说话,全靠它。
我最早接触无人机时,踩过一个坑:飞机在天上飞得好好的,突然地面站收不到数据了。排查了半天,发现是串口波特率没对上。嗯,这种低级错误,我相信你们不会犯,但通信协议这块要是理解不透,后面调试起来真的会让人抓狂。
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是否连续。如果跳号了,说明有丢包;如果一直不变,说明飞机根本没发数据。
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字段显示的是「校准中」,而不是「活跃」。说白了,飞机虽然活着,但还没准备好干活。
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°
3.5 串口通信原理
串口通信是地面站和飞控之间最常用的物理层连接方式。说白了,就是一根TX线、一根RX线、一根GND线,数据一位一位地传。
串口参数必须匹配:
- 波特率:常见115200、57600、38400
- 数据位:通常8位
- 停止位:通常1位
- 校验位:通常无
我个人的习惯是:开发阶段用115200,速度快;产品阶段降到57600,稳定性更好。为什么?因为115200对线材和干扰更敏感,长距离传输容易出错。
3.6 TCP/UDP网络通信
当无人机飞得远了,串口就不够用了。这时候需要网络通信。TCP和UDP是两种最常用的传输层协议。
| 特性 | TCP | UDP |
|---|---|---|
| 可靠性 | 可靠,有重传机制 | 不可靠,可能丢包 |
| 顺序性 | 保证数据顺序 | 不保证顺序 |
| 延迟 | 较高 | 较低 |
| 适用场景 | 指令下发、参数上传 | 视频流、遥测数据 |
我建议这样选:
- 控制指令(如起飞、降落)用TCP,确保送达
- 遥测数据(如GPS、姿态)用UDP,延迟低
- 视频流必须用UDP,TCP的重传机制会导致画面卡顿
曾经有个项目,我们用TCP传视频流,结果画面延迟高达5秒。换成UDP后,延迟降到200毫秒。你想想看,5秒的延迟,飞手根本没法操作。
3.7 本章知识体系
下面这张图总结了本章的核心逻辑:
这张图展示了本章的核心脉络:MAVLink协议是核心,它定义了消息格式、心跳包和GPS定位数据。底层传输则依赖串口或TCP/UDP网络。你想想看,没有这些基础,地面站和飞机就是两个聋哑人,谁也听不懂谁。
好了,这一章的内容就到这里。通信协议这块,说白了就是「约定」——大家说好怎么打包、怎么解析、怎么传输。理解了这些,后面讲地面站架构设计时,你就能明白为什么数据流要这么设计了。