第4章:通信基础(MAVLink与RTPS)
各位同学,大家好。今天我们来聊聊多机协同里最核心、也最容易出问题的一环——通信。
说实话,我见过太多项目,算法写得漂亮,控制调得完美,结果一上天,飞机失联了。为什么?通信链路没搞明白。所以这一章,咱们把MAVLink、RTPS、桥接这些概念彻底吃透。
4.1 MAVLink协议解析
MAVLink,全称Micro Air Vehicle Link。说白了,它就是无人机界的“普通话”。
最早是苏黎世联邦理工的团队搞出来的,现在已经是PX4、ArduPilot这些飞控的标配协议。我个人习惯把它分成两代:v1.0和v2.0。
4.1.1 协议结构
MAVLink的消息结构其实很简单。每个消息就是一个数据包,包含起始标志、负载长度、序列号、系统ID、组件ID、消息ID、实际数据,最后是校验位。
我举个例子,你飞控要告诉地面站“我现在的高度是100米”,它会发一条GLOBAL_POSITION_INT消息。消息ID是33,里面装着经纬度、海拔、相对高度这些数据。
关键字段说明:
- 系统ID:区分不同的无人机(比如1号机、2号机)
- 组件ID:区分同一架飞机上的不同设备(飞控、相机、机械臂)
- 消息ID:区分消息类型(心跳、位置、姿态等)
嗯,这里要注意。MAVLink v2.0比v1.0多了个“签名”字段。我在做安全项目时遇到过,有人通过伪造MAVLink消息劫持无人机。v2.0的签名机制就是防这个的。如果你做的是商业产品,建议直接上v2.0。
4.1.2 常见消息类型
| 消息ID | 名称 | 用途 |
|---|---|---|
| 0 | HEARTBEAT | 心跳包,每秒1-2Hz,告诉对方“我还活着” |
| 33 | GLOBAL_POSITION_INT | 全球位置(经纬度、海拔) |
| 30 | ATTITUDE | 姿态信息(横滚、俯仰、偏航) |
| 76 | COMMAND_LONG | 发送指令(起飞、降落、航点) |
我曾经踩过一个坑:心跳包频率太低,地面站以为飞机失联了,触发了紧急降落。后来我把心跳频率调到5Hz,问题解决。所以,频率设置要结合实际场景。
4.2 uXRCE-DDS桥接
好,接下来是重头戏——uXRCE-DDS。这个名字有点绕,我拆开给你讲。
DDS是数据分发服务,工业级通信中间件。ROS2就是用DDS做底层通信的。但DDS太“重”了,飞控这种资源受限的嵌入式设备跑不动。怎么办?
uXRCE-DDS就是解决方案。它把DDS的“客户端”做得极轻量,跑在飞控上,然后通过串口或UDP,跟地面站上的“代理”通信。代理再接入完整的DDS网络。
一句话总结:uXRCE-DDS = 轻量级DDS客户端 + 串口/UDP传输 + 代理桥接。
4.2.1 桥接架构
我画了一张图,帮你理解这个架构:
你看,飞控(PX4)通过串口发出MAVLink数据,地面站(QGC)收到后,通过uXRCE-DDS Agent转成DDS话题,机载计算机上的ROS2节点就能直接订阅了。反过来也一样。
4.2.2 配置示例
我直接给你看一个实际配置。在PX4飞控上启动uXRCE-DDS客户端:
# 在飞控终端(NSH)中启动
uorb start
uxrce_dds_client start -t serial -d /dev/ttyS1 -b 921600
# 在地面站终端启动Agent
MicroXRCEAgent serial --dev /dev/ttyUSB0 -b 921600
注意波特率。我建议用921600,别用115200。为什么?你想想看,多机协同的时候,数据量是单机的N倍。波特率太低,数据根本传不过来。我曾经用115200试过,三架飞机同时传位置数据,延迟直接飙到500ms,根本没法用。
避坑指南:波特率不是越高越好。有些飞控的串口硬件不支持1M以上。我遇到过用2M波特率,结果飞控串口芯片过热,数据全乱码。建议先查硬件手册,再定波特率。
4.3 地面站与机载计算机的通信链路
好,现在链路有了,数据怎么传?这里有几个选择。
4.3.1 串口直连
最简单,也最稳定。飞控的TELEM口直接连机载计算机的UART。距离短(1米以内),适合开发调试。
4.3.2 WiFi/UDP
机载计算机开个WiFi热点,地面站连上来。适合室内测试,但延迟不稳定。我试过,2.4GHz WiFi在干扰大的地方,丢包率能到10%。
4.3.3 数传电台
这才是实战用的。433MHz、915MHz、2.4GHz都有。我个人的经验是:433MHz穿障能力强,但带宽低(一般只有几十kbps);2.4GHz带宽高(能到几Mbps),但距离短。
| 通信方式 | 带宽 | 延迟 | 距离 | 适用场景 |
|---|---|---|---|---|
| 串口直连 | ~1Mbps | <1ms | 1米 | 开发调试 |
| WiFi | ~50Mbps | 10-50ms | 100米 | 室内测试 |
| 433MHz数传 | ~100kbps | 20-100ms | 5公里 | 野外作业 |
| 4G/5G | ~10Mbps | 30-100ms | 不限 | 超视距 |
4.4 带宽与延迟考量
这是实战中最头疼的问题。我直接给你算笔账。
一架无人机,每秒发10条消息:
- 心跳:1条,约20字节
- 位置:5条,每条约50字节
- 姿态:2条,每条约40字节
- 状态:2条,每条约30字节
加起来,每秒约 20 + 250 + 80 + 60 = 410 字节。这是单机。
5架飞机同时传,就是 410 × 5 = 2050 字节/秒。看起来不多,对吧?
但别忘了,这是纯数据。加上协议头、校验、重传,实际占用带宽要翻3-5倍。而且,如果你还要传视频流(哪怕是低分辨率的),带宽需求直接飙升到Mbps级别。
我的建议:
- 控制数据(位置、姿态):用MAVLink,频率10-20Hz足够
- 任务数据(航点、指令):用MAVLink,按需发送
- 传感器数据(图像、点云):用DDS直传,别走MAVLink
延迟方面,记住一个原则:端到端延迟 = 飞控处理延迟 + 串口传输延迟 + 地面站处理延迟 + DDS传输延迟 + 机载计算机处理延迟。
我实测过,一个典型的链路:飞控→串口(921600)→地面站→DDS→机载计算机,端到端延迟大约在5-15ms。对于多机协同来说,这个延迟是可以接受的。但如果超过50ms,你就得检查链路了。
小技巧:用Wireshark抓MAVLink包,看时间戳。如果发现某个消息的发送间隔忽大忽小,说明链路有抖动。我一般会在飞控端加一个时间戳字段,方便排查。
好了,这一章的内容就到这里。通信是基础,基础不牢,地动山摇。下一章我们会讲多机协同的任务分配算法,到时候你会更深刻地理解,为什么通信延迟和带宽这么重要。