第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 / ArduPilot uXRCE-DDS Client (串口/UDP) MAVLink 地面站 QGroundControl uXRCE-DDS Agent (DDS桥接) DDS 机载计算机 Jetson / Raspberry Pi ROS2节点 (视觉/规划/控制) uXRCE-DDS桥接架构 飞控通过MAVLink与地面站通信 地面站通过DDS与机载计算机通信 uXRCE-DDS桥接两者,实现数据互通

你看,飞控(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包,看时间戳。如果发现某个消息的发送间隔忽大忽小,说明链路有抖动。我一般会在飞控端加一个时间戳字段,方便排查。

好了,这一章的内容就到这里。通信是基础,基础不牢,地动山摇。下一章我们会讲多机协同的任务分配算法,到时候你会更深刻地理解,为什么通信延迟和带宽这么重要。


专注资料整理