2. PX4飞控基础
要在PX4上运行机载神经网络控制器,第一步不是写网络,而是理解PX4“怎么组织软件、怎么传递数据、怎么切换控制权、怎么与外部计算单元对话”。本节围绕这五个关键词展开:PX4架构、uORB消息机制、飞行模式、MAVLink协议与机载控制接口。它们共同决定了神经网络控制器的接入点、数据来源、输出通道与安全边界。
一、PX4架构:分层与模块化
PX4采用“中间件+模块”的分层架构。最底层是NuttX实时操作系统与硬件驱动,负责传感器采集、PWM/CAN/UART等外设访问;中间层是uORB发布/订阅总线,所有模块通过它交换数据;上层是飞行控制栈,包括传感器融合(EKF2)、位置/姿态控制器(mc_pos_control、mc_att_control)、导航与任务管理(navigator)、以及commander状态机。模块之间不直接调用,而是通过uORB解耦,这使得替换或新增一个控制模块成为可能。
对神经网络控制而言,关键认识是:PX4的控制链路是“估计—控制—混控—输出”。神经网络通常替换或增强其中的姿态/位置控制环节,而不是直接写执行器。因此必须清楚自己接入的是哪一层,输入是什么估计量,输出是什么期望量。
二、uORB消息机制:数据总线
uORB是PX4的发布/订阅消息系统。每个话题(topic)有固定数据结构,发布者写、订阅者读,支持多对多、带时间戳、可设置更新频率。常用话题包括:sensor_combined、vehicle_attitude、vehicle_local_position、vehicle_status、manual_control_setpoint、actuator_controls_0等。神经网络控制器一般订阅状态类话题,发布控制类话题。
# 在PX4终端查看话题
uorb top
listener vehicle_attitude
listener vehicle_local_position
# 自定义模块中订阅与发布(伪代码)
orb_subscribe(ORB_ID(vehicle_attitude));
orb_advertise(ORB_ID(vehicle_attitude_setpoint));
三、飞行模式与控制权
PX4飞行模式决定“谁在控制、控制什么”。常见模式有:Manual/Stabilized(手动姿态)、Altitude(定高)、Position(定点)、Offboard(外部控制)、Auto Mission(自动任务)、Return(返航)等。神经网络控制器通常运行在Offboard模式或作为自定义模块嵌入Position/Attitude链路。
Offboard模式的核心是:外部通过MAVLink或机载模块以一定频率发送setpoint,PX4检查超时与有效性后执行。若超时,PX4会触发失效保护。因此神经网络控制器的输出频率、超时策略、失效回退必须与commander状态机一致。
四、MAVLink协议与机载控制接口
MAVLink是PX4与地面站、伴飞计算机通信的轻量协议。常用消息包括:HEARTBEAT、ATTITUDE、LOCAL_POSITION_NED、SET_POSITION_TARGET_LOCAL_NED、SET_ATTITUDE_TARGET、COMMAND_LONG等。机载控制接口主要有三条路径:
- MAVLink Offboard:伴飞计算机通过串口/UDP发送setpoint,适合快速验证。
- uORB自定义模块:在PX4内部新增模块,直接订阅/发布话题,延迟最低,适合神经网络实时控制。
- ROS 2 + microRTPS/XRCE-DDS:通过DDS桥接uORB与ROS 2,适合复杂感知与学习系统。
| 接口方式 | 典型延迟 | 适用场景 | 安全回退 |
|---|---|---|---|
| MAVLink Offboard | 中(10–50 ms) | 快速原型、地面站联调 | 超时自动退出Offboard |
| uORB自定义模块 | 低(1–5 ms) | 机载神经网络实时控制 | 模块内检测状态并切回原生控制 |
| ROS 2 + XRCE-DDS | 中低 | 感知+学习+控制闭环 | 桥接超时与模式管理 |
五、案例:神经网络姿态控制器的接入流程
假设要在PX4上接入一个神经网络姿态控制器,推荐流程如下:
- 确认输入:订阅
vehicle_attitude与vehicle_angular_velocity,获取姿态四元数与角速度。 - 确认输出:发布
vehicle_attitude_setpoint或vehicle_rates_setpoint,由PX4混控输出。 - 模式管理:通过
vehicle_status判断当前飞行模式,仅在Offboard或自定义模式下接管。 - 安全监控:设置看门狗,若输入超时或输出越界,立即停止发布并请求回退。
- 日志记录:使用
logger记录输入、输出与网络推理耗时,便于复盘。
actuator_controls。这会绕过PX4的姿态/位置控制与失效保护,极易导致失控。正确做法是输出“期望姿态/期望角速度/期望推力”,让PX4完成混控与安全约束。六、复盘与检查清单
- 是否明确神经网络接入的是位置环、姿态环还是角速度环?
- 订阅话题的时间戳是否检查?超时阈值是否小于PX4失效保护时间?
- 输出是否经过限幅与变化率限制?
- 是否能在
vehicle_status变化时正确让出控制权? - 是否用
uorb top确认话题频率与CPU占用? - 是否在SITL中先验证,再上真机?