4、地面站与飞控的通信链路:串口通信配置、UDP/TCP链路、MAVLink路由器
好,咱们进入第四章。这一章聊的是地面站和飞控之间怎么「说话」。说白了,就是数据怎么从飞控的串口出来,经过各种网络,最终跑到你电脑上的 QGroundControl 里。
我刚开始接触 PX4 时,总觉得通信链路很简单——不就是一根 USB 线连上吗?后来发现,真到了实际部署,串口参数配不对、UDP 端口冲突、路由器崩溃……各种坑等着你。嗯,咱们今天就把这些链路挨个捋一遍。
4.1 串口通信配置——最基础也最容易翻车
串口是飞控和外部设备通信的「老本行」。PX4 飞控通常有多个 UART(比如 TELEM1、TELEM2、GPS 口),每个口都可以跑 MAVLink。
我个人习惯,拿到一块新飞控,第一件事就是检查 MAV_* 参数。你可以在 QGC 的参数列表里搜 MAV,会看到类似这样的配置:
| 参数名 | 默认值 | 说明 |
|---|---|---|
MAV_0_CONFIG |
TELEM1 | MAVLink 实例 0 绑定的串口 |
MAV_0_RATE |
1200 | 目标波特率(单位:B/s) |
MAV_0_MODE |
Normal | 数据流模式(Normal/Onboard/Camera) |
SER_TELEM1_BAUD |
57600 | 串口物理波特率 |
SER_TELEM1_BAUD 设了 921600,但数传模块只支持 57600。结果就是——地面站显示「连接中…」然后超时。排查了半小时才发现是波特率没对齐。记住:物理波特率必须和数传模块/串口转接板的能力匹配。
配置串口的步骤其实就三步:
- 确定你要用哪个物理串口(TELEM1、TELEM2、GPS 口等)。
- 设置
MAV_X_CONFIG指向该串口,MAV_X_MODE选 Normal。 - 设置
SER_TELEM1_BAUD(或其他对应串口的波特率参数)。
你想想看,如果飞控上接了数传模块,通常 TELEM1 口默认就是 MAVLink 输出,直接配好波特率就能用。但如果你要用 GPS 口跑 MAVLink(比如接树莓派),就得手动把 MAV_1_CONFIG 改成 GPS 口。
4.2 UDP/TCP 链路——从串口到网络的跨越
串口直连虽然稳定,但距离有限。实际项目中,飞控往往通过数传电台或 4G 模块连到地面站,这时候就需要 UDP 或 TCP 了。
UDP 和 TCP 的区别,我简单说:
- UDP:无连接,速度快,但可能丢包。适合实时性要求高的遥控遥测。
- TCP:有连接,保证不丢包,但延迟稍高。适合参数下载、日志传输。
在 PX4 里,UDP/TCP 链路通常不是飞控直接处理的,而是通过一个中间设备——比如树莓派、或者你的电脑——来转发。飞控本身只通过串口输出 MAVLink,然后由外部设备把串口数据打包成 UDP 包发出去。
14550(遥测)和 14540(任务规划)。飞控端(比如树莓派)需要把串口数据转发到这些端口。我习惯用 mavlink-router 来做这件事,后面会细说。
UDP 链路的典型拓扑是这样的:
4.3 MAVLink 路由器(mavlink-router)——链路的「交通警察」
mavlink-router 是 Intel 开源的一个小工具,专门用来在串口和网络之间转发 MAVLink 数据。说白了,它就是个「中间人」:从串口读数据,然后按规则发给多个 UDP 或 TCP 端点。
我为什么推荐它?因为在实际项目中,你往往需要同时连接多个地面站——比如主控台一台电脑、监控台一台平板、甚至还有一个手机 APP。mavlink-router 可以轻松做到一对多转发。
4.3.1 安装与配置
在树莓派上安装很简单:
git clone https://github.com/mavlink-router/mavlink-router.git
cd mavlink-router
meson setup build
ninja -C build
sudo ninja -C build install
装好后,配置文件通常放在 /etc/mavlink-router/main.conf。我贴一个我常用的配置:
[General]
DebugLogLevel = 1
[UartEndpoint to_fc]
Device = /dev/ttyAMA0
Baud = 57600
[UdpEndpoint to_gcs]
Mode = Normal
Address = 0.0.0.0
Port = 14550
[UdpEndpoint to_secondary]
Mode = Normal
Address = 0.0.0.0
Port = 14560
这个配置做了三件事:
- 从
/dev/ttyAMA0(串口)以 57600 波特率读取飞控数据。 - 转发到 UDP 端口
14550(主地面站)。 - 同时转发到 UDP 端口
14560(备用地面站)。
MavlinkFilter 参数。但我个人建议,初期先全量转发,等系统稳定了再考虑过滤。
4.3.2 运行与调试
启动路由器:
sudo systemctl start mavlink-router
或者前台运行看日志:
sudo mavlink-routerd -c /etc/mavlink-router/main.conf
如果地面站连不上,我一般先检查三件事:
- 串口设备是否存在:
ls -l /dev/ttyAMA0,确认飞控已上电。 - 端口是否被占用:
netstat -tulpn | grep 14550,确保没有其他程序占着。 - 防火墙是否放行:
sudo ufw allow 14550/udp。
4.4 三种链路的对比与选型建议
最后,我整理了一个对比表,方便你根据项目需求选择:
| 链路类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 串口直连 | 调试、短距离(< 2m) | 简单、稳定、延迟低 | 距离受限、需要物理线缆 |
| UDP | 遥控遥测、多地面站 | 速度快、支持广播 | 可能丢包、无重传 |
| TCP | 参数下载、日志传输 | 可靠、不丢包 | 延迟稍高、连接管理复杂 |
我个人建议:日常调试用串口直连,飞行测试用 UDP + mavlink-router,需要传大文件时切到 TCP。这样既保证了实时性,又兼顾了可靠性。
嗯,这一章的内容就到这儿。链路配置是基础中的基础,但也是最容易出问题的地方。你把这些搞明白了,后面讲消息协议、自定义扩展时,才能跑得起来。