2. 无人机与PX4基础
在进入 PX4 ROS2 外部控制与 Offboard 开发之前,必须先建立对无人机系统、PX4 飞控架构、飞行模式以及 Offboard 模式定位的整体认知。很多初学者一上来就写 ROS2 节点发送 setpoint,结果飞机不解锁、模式切不进去、甚至出现失控风险,根本原因往往不是代码问题,而是对 PX4 的控制链路和模式状态机理解不足。本节将围绕四个核心问题展开:无人机由哪些部分组成、PX4 内部如何组织控制、飞行模式如何决定控制权归属、Offboard 模式适合什么场景。
一、无人机系统组成:从机架到机载计算机
一架典型的 PX4 四旋翼无人机可以划分为五个层次:机械与动力层、传感与估计层、飞控与执行层、通信与载荷层、地面与外部控制层。机械与动力层包括机架、电机、电调、螺旋桨和电池,负责产生升力与姿态力矩;传感与估计层包括 IMU、磁力计、气压计、GPS、光流、视觉里程计等,负责提供状态观测;飞控与执行层以 Pixhawk 系列飞控为核心,运行 PX4 固件,完成姿态与位置控制并输出 PWM/DShot 信号;通信与载荷层包括数传、遥控接收机、机载计算机(如树莓派、Jetson、RK3588)和任务载荷;地面与外部控制层包括 QGroundControl、MAVSDK、ROS2 节点等。
在 Offboard 开发中,机载计算机与飞控之间通常通过 UART 或 USB 连接,运行 MAVLink 协议;ROS2 侧通过 px4_msgs 与 micro-ROS 或 px4_ros_com 桥接,实现 uORB 消息与 ROS2 话题的互转。理解这条链路,是后续调试 Offboard 的基础。
二、PX4 飞控架构:模块化与 uORB 消息总线
PX4 采用模块化架构,各功能以独立模块运行在 NuttX 或 Linux 上,通过 uORB 发布/订阅消息总线通信。核心模块包括:sensors 负责传感器采集,ekf2 负责状态估计,commander 负责模式管理与解锁逻辑,navigator 负责任务与 RTL 等自动模式,mc_pos_control 与 mc_att_control 负责多旋翼位置与姿态控制,mavlink 负责与地面站和外部设备通信。
控制链路可以概括为:遥控器或外部 setpoint 进入 commander 与 navigator,生成期望位置或姿态,经 mc_pos_control 转换为姿态期望,再经 mc_att_control 转换为力矩与推力,最后由 mixer 分配给各电机。Offboard 模式下,外部节点通过 MAVLink 或 uORB 注入 setpoint,接管位置或姿态期望的生成环节。
三、飞行模式:控制权归属与切换条件
PX4 的飞行模式决定了“谁在控制飞机”。常见模式包括:Manual/Stabilized(手动/自稳,遥控器直接控制姿态)、Altitude(定高)、Position(定点,GPS 或视觉定位)、Mission(自动任务)、Return(返航)、Hold(悬停)、Takeoff/Land(起降)以及 Offboard(外部控制)。模式切换由 commander 统一管理,必须满足解锁状态、估计器有效、遥控器信号或 Offboard 心跳等条件。
需要特别注意的是,Offboard 模式并不是“绕过飞控”,而是把期望位置/姿态的生成权交给外部节点,底层姿态控制、混控、失效保护仍由 PX4 负责。因此 Offboard 节点必须持续以不低于 2Hz 的频率发送 setpoint,否则 commander 会触发失效保护并退出 Offboard。
| 模式 | 控制权归属 | 典型输入 | 适用场景 |
|---|---|---|---|
| Stabilized | 飞控稳定姿态,遥控器给姿态 | RC 摇杆 | 手动飞行、调试 |
| Position | 飞控闭环位置,遥控器给速度 | RC + GPS/视觉 | 定点悬停、航拍 |
| Mission | navigator 执行航点 | QGC 航点文件 | 自动巡检、测绘 |
| Offboard | 外部节点生成 setpoint | ROS2 / MAVSDK | 视觉伺服、编队、避障 |
四、Offboard 模式的定义与适用场景
Offboard 模式的定义可以概括为:PX4 将位置、速度、加速度或姿态期望的生成权移交给外部系统,外部系统通过 MAVLink 或 uORB 以固定频率发送 setpoint,PX4 负责底层姿态控制与电机输出。它适合以下场景:
- 视觉伺服与目标跟踪:相机识别目标后实时生成速度或位置指令。
- 多机编队与集群:外部规划器统一分配各机 setpoint。
- 动态避障与轨迹重规划:激光雷达或深度相机触发局部避障。
- 科研验证:自定义控制算法、强化学习策略部署。
- 精准起降与对接:视觉标记引导末端接近。
常见误区:把 Offboard 当成“完全自主”。实际上 Offboard 仍受 PX4 失效保护约束:setpoint 超时、估计器失效、电池低电量、遥控器切回 Manual 都会导致模式退出。开发时必须实现心跳监控与安全降落逻辑。
五、实操要点与复盘清单
在 QGroundControl 中切换 Offboard 前,通常需要先解锁并切换到 Position 或 Hold 模式,再通过 MAVLink 命令切换。以下是一个典型的 MAVSDK 切换片段:
// 等待飞控连接
await drone.connect(system);
// 解锁
await drone.action.arm();
// 切换到 Offboard
await drone.offboard.setVelocityNed(new VelocityNedYaw(0, 0, -1, 0));
await drone.offboard.start();
// 持续发送 setpoint,频率 >= 2Hz
while (running) {
await drone.offboard.setVelocityNed(new VelocityNedYaw(1, 0, 0, 0));
await sleep(0.1);
}
复盘清单:① 是否已解锁并满足估计器有效?② setpoint 频率是否稳定大于 2Hz?③ 坐标系是否为 NED/FRD?④ 是否有遥控器接管与紧急降落预案?⑤ 日志中 commander 是否报 Offboard 超时?
理解无人机系统组成、PX4 模块化架构、飞行模式的控制权归属以及 Offboard 的注入点与约束,是后续编写 ROS2 Offboard 节点的前提。只有把“谁在控制、控制什么、失效后怎么办”这三件事想清楚,代码才能真正安全地飞起来。