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。结果就是——地面站显示「连接中…」然后超时。排查了半小时才发现是波特率没对齐。记住:物理波特率必须和数传模块/串口转接板的能力匹配。

配置串口的步骤其实就三步:

  1. 确定你要用哪个物理串口(TELEM1、TELEM2、GPS 口等)。
  2. 设置 MAV_X_CONFIG 指向该串口,MAV_X_MODE 选 Normal。
  3. 设置 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 包发出去。

💡 我的经验: 如果你用 QGC 通过 UDP 连接飞控,QGC 默认监听端口是 14550(遥测)和 14540(任务规划)。飞控端(比如树莓派)需要把串口数据转发到这些端口。我习惯用 mavlink-router 来做这件事,后面会细说。

UDP 链路的典型拓扑是这样的:

UDP/TCP 通信链路拓扑 PX4 飞控 串口输出 MAVLink 树莓派/机载电脑 mavlink-router UDP/TCP QGC 地面站 监听 14550 说明: 1. 飞控通过串口输出 MAVLink 到机载电脑(树莓派)。 2. 机载电脑运行 mavlink-router,将串口数据转为 UDP 包。 3. 地面站通过 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(备用地面站)。
🔑 关键点: mavlink-router 默认会把所有 MAVLink 消息广播到所有配置的端点。如果你只想转发特定消息(比如只转发心跳和姿态),可以用 MavlinkFilter 参数。但我个人建议,初期先全量转发,等系统稳定了再考虑过滤。

4.3.2 运行与调试

启动路由器:

sudo systemctl start mavlink-router

或者前台运行看日志:

sudo mavlink-routerd -c /etc/mavlink-router/main.conf

如果地面站连不上,我一般先检查三件事:

  1. 串口设备是否存在:ls -l /dev/ttyAMA0,确认飞控已上电。
  2. 端口是否被占用:netstat -tulpn | grep 14550,确保没有其他程序占着。
  3. 防火墙是否放行:sudo ufw allow 14550/udp。
⚠️ 我曾经踩过的坑: 有一次在野外调试,地面站死活连不上飞控。查了半天,发现树莓派的 WiFi 信号弱,UDP 包全丢了。后来换成有线网络,问题解决。所以——无线链路一定要做丢包测试,别等到飞起来才发现。

4.4 三种链路的对比与选型建议

最后,我整理了一个对比表,方便你根据项目需求选择:

链路类型 适用场景 优点 缺点
串口直连 调试、短距离(< 2m) 简单、稳定、延迟低 距离受限、需要物理线缆
UDP 遥控遥测、多地面站 速度快、支持广播 可能丢包、无重传
TCP 参数下载、日志传输 可靠、不丢包 延迟稍高、连接管理复杂

我个人建议:日常调试用串口直连,飞行测试用 UDP + mavlink-router,需要传大文件时切到 TCP。这样既保证了实时性,又兼顾了可靠性。

嗯,这一章的内容就到这儿。链路配置是基础中的基础,但也是最容易出问题的地方。你把这些搞明白了,后面讲消息协议、自定义扩展时,才能跑得起来。