3. PX4飞控基础
PX4 是 Jetson 机载计算平台最常见的飞控固件之一。理解 PX4 的内部架构、模块间通信方式、对外通信协议以及参数体系,是后续把 Jetson 的视觉、规划、控制指令安全接入飞行控制回路的前提。本节从“飞控内部怎么运转”出发,逐步过渡到“飞控如何与外部计算机对话”,最后落到参数配置这一实操入口。
一、PX4 的分层架构
PX4 采用分层、模块化的实时架构,可以粗略分为四层:最底层是 硬件与驱动层,负责传感器、PWM/CAN 输出、串口等外设访问;其上是 传感器与状态估计层,包括 IMU、磁力计、气压计数据融合,输出姿态与位置估计;再往上是 控制与导航层,包含姿态控制器、位置控制器、混控器与飞行模式状态机;最上层是 应用与通信层,包括 commander、navigator、mavlink 以及各类任务模块。
这些模块并不是通过函数调用直接耦合,而是运行在独立的线程或任务中,通过发布/订阅消息总线交换数据。这种设计让 PX4 具备良好的可扩展性:新增一个模块只需订阅所需话题、发布自己的话题,而不必修改其他模块。
二、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
三、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
四、飞控参数配置入门
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 订阅过多高频消息,导致串口拥塞、控制延迟增大。
- 未配置失控保护:外部控制链路中断后飞控行为不可预期,存在安全风险。