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 实例并行输出。
Jetson 与 PX4 的三种 MAVLink 通信通道 PX4 飞控 MAVLink 实例 TELEM1 / TELEM2 Jetson 机载计算机 MAVSDK / MAVROS 应用算法 串口 UART:/dev/ttyTHS1 · 921600 bps UDP:udp://:14540 · 无连接 TCP:tcp://192.168.1.10:5760 · 可靠 串口特性 低延迟 · 高稳定 · 点对点 UDP 特性 低开销 · 可广播 · 允许丢包 TCP 特性 可靠有序 · 有重传 · 抖动大

二、方法流程:从物理连接到软件调用

以最常见的串口直连为例,完整流程分为四步:

  1. 硬件连接:将 PX4 的 TELEM2 口(TX/RX/GND)接到 Jetson 的 UART 引脚,注意交叉连接 TX↔RX,共地。
  2. 配置飞控:在 QGroundControl 中设置 MAV_1_CONFIG 为 TELEM2,MAV_1_MODE 为 Onboard,波特率 SER_TELEM2_BAUD 设为 921600。
  3. 确认设备节点:Jetson 上通常为 /dev/ttyTHS1,需将用户加入 dialout 组并关闭串口控制台占用。
  4. 启动应用:用 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 的安装与最小可运行示例,并具备定位常见链路故障的能力。这是后续实现自主飞行、视觉伺服等高级功能的基础。