4. 机载计算与飞控通信
Jetson 机载计算机与 PX4 飞控之间的通信,是整个机载计算系统的“神经中枢”。无论上层运行的是视觉避障、目标跟踪还是自主导航算法,最终都要通过一条可靠的链路把控制指令送到飞控,并从飞控取回姿态、位置、电池等状态数据。本章围绕三种典型通信方式(串口、UDP、TCP)以及两种主流开发框架(MAVSDK、MAVROS)展开,帮助读者建立从物理连接到软件调用的完整认知。
一、核心原理:MAVLink 是共同语言
PX4 与机载计算机之间并不直接“说人话”,而是使用 MAVLink 协议。MAVLink 是一种轻量级的二进制消息协议,每条消息包含消息 ID、载荷和校验字段。串口、UDP、TCP 只是承载 MAVLink 报文的“运输通道”,协议内容本身不变。理解这一点非常关键:换通信方式时,业务代码几乎不用改,改的只是连接字符串和链路配置。
三种通道的定位差异如下:
- 串口(UART):物理直连,延迟最低、最稳定,是飞控与机载计算机之间的首选链路,典型速率为 921600 或 1500000 bps。
- UDP:无连接、开销小,适合局域网内多机通信、地面站与机载程序并存,允许丢包但要求实时性。
- TCP:面向连接、可靠有序,适合需要确认送达的配置类或非实时任务,但重传机制会带来抖动。
通道选择口诀:飞控直连用串口,机间组网用 UDP,可靠传输用 TCP。三者可以同时存在,PX4 支持多路 MAVLink 实例并行输出。
二、方法流程:从物理连接到软件调用
以最常见的串口直连为例,完整流程分为四步:
- 硬件连接:将 PX4 的 TELEM2 口(TX/RX/GND)接到 Jetson 的 UART 引脚,注意交叉连接 TX↔RX,共地。
- 配置飞控:在 QGroundControl 中设置
MAV_1_CONFIG为 TELEM2,MAV_1_MODE为 Onboard,波特率SER_TELEM2_BAUD设为 921600。 - 确认设备节点:Jetson 上通常为
/dev/ttyTHS1,需将用户加入 dialout 组并关闭串口控制台占用。 - 启动应用:用 MAVSDK 或 MAVROS 连接该设备节点,开始收发消息。
# 查看串口设备与权限
ls -l /dev/ttyTHS*
sudo usermod -aG dialout $USER
# 关闭占用串口的 nvgetty 服务(Jetson 常见坑)
sudo systemctl stop nvgetty
sudo systemctl disable nvgetty
三、MAVSDK 与 MAVROS 的安装与基本使用
MAVSDK 是官方维护的轻量级 SDK,提供 C++、Python 等多语言绑定,接口简洁,适合直接编写机载应用。MAVROS 则是 ROS 生态的桥接包,把 MAVLink 消息转成 ROS 话题与服务,适合已有 ROS 架构的项目。
# 安装 MAVSDK-Python
pip install mavsdk
# 连接串口并读取姿态
from mavsdk import System
import asyncio
async def main():
drone = System()
await drone.connect(system_address="serial:///dev/ttyTHS1:921600")
async for att in drone.telemetry.attitude_euler():
print(att.roll_deg, att.pitch_deg, att.yaw_deg)
asyncio.run(main())
# 安装 MAVROS(Ubuntu 20.04 + ROS Noetic)
sudo apt install ros-noetic-mavros ros-noetic-mavros-extras
sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh
# 启动并连接 UDP
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
| 对比项 | MAVSDK | MAVROS |
|---|---|---|
| 语言支持 | C++ / Python / 多语言 | ROS 节点(C++/Python) |
| 依赖环境 | 轻量,无需 ROS | 依赖 ROS 1/2 |
| 接口风格 | 异步 API,简洁直观 | 话题 / 服务 / 参数 |
| 适用场景 | 独立机载程序、快速原型 | ROS 机器人系统集成 |
| 连接示例 | serial:///dev/ttyTHS1:921600 | udp://:14540@127.0.0.1:14557 |
四、案例场景:视觉跟踪任务的链路搭建
假设 Jetson 上运行一个目标跟踪程序,需要把速度指令发给 PX4。推荐链路为:PX4 TELEM2 → 串口 → Jetson,MAVSDK 负责发送 Offboard 速度指令并订阅姿态;同时通过 UDP 把状态转发给地面站用于监控。这样既保证了控制链路的低延迟,又保留了调试观测通道。
在 Offboard 模式下,必须持续以高于 2 Hz 的频率发送设定值,否则 PX4 会自动退出 Offboard 并切回位置模式,这是初学者最常见的“飞机突然不听话”原因。
五、误区与复盘
- 误区一:串口权限没配好。表现为
Permission denied,需加入 dialout 组并重新登录。 - 误区二:TX/RX 未交叉。表现为完全收不到心跳包,用示波器或回环测试可快速定位。
- 误区三:UDP 端口冲突。MAVROS 与 MAVSDK 同时占用 14540 会互相抢包,应错开端口。
- 误区四:波特率不匹配。飞控与机载端必须一致,否则收到的是乱码。
排障顺序建议:先确认物理连接与权限,再确认波特率与端口,最后检查 MAVLink 心跳是否到达。用
mavlink status(PX4 控制台)或 MAVSDK 的 connect() 超时日志可以快速判断链路是否建立。
掌握本章内容后,读者应能根据任务需求独立选择通信通道,完成 MAVSDK 或 MAVROS 的安装与最小可运行示例,并具备定位常见链路故障的能力。这是后续实现自主飞行、视觉伺服等高级功能的基础。