3. PX4飞控基础

PX4 是 Jetson 机载计算平台最常见的飞控固件之一。理解 PX4 的内部架构、模块间通信方式、对外通信协议以及参数体系,是后续把 Jetson 的视觉、规划、控制指令安全接入飞行控制回路的前提。本节从“飞控内部怎么运转”出发,逐步过渡到“飞控如何与外部计算机对话”,最后落到参数配置这一实操入口。

一、PX4 的分层架构

PX4 采用分层、模块化的实时架构,可以粗略分为四层:最底层是 硬件与驱动层,负责传感器、PWM/CAN 输出、串口等外设访问;其上是 传感器与状态估计层,包括 IMU、磁力计、气压计数据融合,输出姿态与位置估计;再往上是 控制与导航层,包含姿态控制器、位置控制器、混控器与飞行模式状态机;最上层是 应用与通信层,包括 commander、navigator、mavlink 以及各类任务模块。

这些模块并不是通过函数调用直接耦合,而是运行在独立的线程或任务中,通过发布/订阅消息总线交换数据。这种设计让 PX4 具备良好的可扩展性:新增一个模块只需订阅所需话题、发布自己的话题,而不必修改其他模块。

PX4 分层架构与 uORB 消息总线 应用与通信层 commander navigator mavlink logger / 任务模块 外部应用接口 uORB 发布 / 订阅消息总线(Topic 数据流) 控制与导航层 姿态控制器 位置控制器 混控器 飞行模式状态机 传感器与状态估计层 IMU / 磁力计 / 气压 EKF2 状态估计 姿态 / 位置输出 硬件与驱动层:传感器驱动 / PWM / CAN / 串口

二、uORB 消息机制

uORB 是 PX4 内部的异步发布/订阅中间件。每个数据流称为一个 Topic,例如 sensor_combined、vehicle_attitude、vehicle_local_position、vehicle_command。发布者写入数据,订阅者按需读取,双方不需要知道对方存在。

uORB 的关键特性包括:

  • 异步解耦:模块之间通过 Topic 通信,降低耦合,便于替换和扩展。
  • 多订阅者:同一 Topic 可被多个模块订阅,例如姿态数据同时供控制器、日志和 MAVLink 使用。
  • 固定频率与更新率:每个 Topic 有典型发布频率,订阅者按自身周期读取最新数据。
  • 可观测性:通过 uorb top、listener 等命令可实时查看 Topic 频率与内容。

在调试时,常用以下命令查看消息流:

# 查看所有 Topic 的发布频率
uorb top

# 监听某个 Topic 的最新数据
listener vehicle_attitude

# 查看某模块订阅/发布关系
uorb status
理解 uORB 的一个实用视角:把每个 Topic 想象成一块“公告板”,模块只负责往公告板上贴最新数据,或从公告板上读取自己关心的数据,而不直接互相喊话。

三、MAVLink 协议与外部通信

MAVLink 是 PX4 与地面站、机载计算机、伴飞计算机之间通信的标准协议。它采用二进制帧格式,包含系统 ID、组件 ID、消息 ID 和载荷,具有轻量、可靠、可扩展的特点。PX4 中的 mavlink 模块负责把内部 uORB 消息转换为 MAVLink 消息,并通过串口、UDP 或 TCP 发送出去。

典型数据流是双向的:

  • 下行:飞控把姿态、位置、电池、GPS 等状态以 MAVLink 消息发给地面站或 Jetson。
  • 上行:地面站或 Jetson 发送指令,如解锁、切换模式、上传航点、发送速度或位置设定值。

在 Jetson 与 PX4 集成场景中,常见连接方式是串口(如 /dev/ttyTHS1)或 UDP。配置时需关注波特率、协议实例和端口映射:

# 查看 MAVLink 实例状态
mavlink status

# 典型串口配置参数
MAV_1_CONFIG = TELEM 2
MAV_1_MODE   = Onboard
SER_TEL2_BAUD = 921600
MAVLink 消息频率过高会占用串口带宽并增加飞控负载。集成时应按需配置消息流,而不是把所有 Topic 都以最高频率外发。

四、飞控参数配置入门

PX4 参数系统是飞控行为的“配置中心”。每个参数有名称、类型、默认值和取值范围,保存在飞控存储中,重启后仍然有效。参数可以通过 QGroundControl、MAVSDK 或命令行修改。

常用参数操作命令如下:

# 查看参数
param show MAV_1_CONFIG

# 修改参数
param set MAV_1_CONFIG 2

# 保存参数
param save

# 查看所有参数
param show

下面列出与 Jetson 集成最相关的一批参数,便于快速定位:

参数 作用 典型值/说明
MAV_1_CONFIG 指定 MAVLink 实例使用的物理端口 TELEM 2 / Ethernet 等
MAV_1_MODE MAVLink 工作模式 Normal / Onboard / Magic
SER_TEL2_BAUD 串口波特率 921600 常用于 Jetson 高速链路
COM_RC_IN_MODE 遥控器输入模式 影响是否允许外部控制
NAV_RCL_ACT 失控保护动作 Return / Land / Hold
EKF2_AID_MASK EKF2 外部辅助源使能 GPS、视觉、光流等

五、案例与常见误区

假设我们要把 Jetson 接入 PX4,让 Jetson 通过 MAVLink 发送速度设定值。一个可用的最小流程是:先确认串口物理连接与波特率一致,再设置 MAV_1_CONFIG 和 MAV_1_MODE=Onboard,保存并重启飞控;然后在 Jetson 侧用 MAVSDK 或 pymavlink 连接对应端口,订阅 ATTITUDE、LOCAL_POSITION_NED,并发送 SET_POSITION_TARGET_LOCAL_NED。整个过程要确保飞控处于允许外部控制的模式,并设置好失控保护。

常见误区包括:

  • 把 uORB 和 MAVLink 混为一谈:uORB 是飞控内部总线,MAVLink 是对外协议,二者层次不同。
  • 只改参数不保存:param set 后未执行 param save,重启即丢失。
  • 忽略消息频率:Jetson 订阅过多高频消息,导致串口拥塞、控制延迟增大。
  • 未配置失控保护:外部控制链路中断后飞控行为不可预期,存在安全风险。
掌握 PX4 的关键路径是:先理解分层架构与 uORB 数据流,再理解 MAVLink 如何把内部状态映射为外部消息,最后通过参数把通信链路和控制权限配置正确。这三步打通后,Jetson 与 PX4 的集成才有稳定基础。