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 控制链路与 Offboard 注入点 遥控器 / 地面站 RC / QGC 机载计算机 ROS2 / MAVSDK commander 模式管理 / 解锁 Offboard 状态机 navigator 任务 / RTL / 自动模式 mc_pos_control 位置 → 姿态期望 Offboard setpoint 入口 mc_att_control 姿态 → 力矩/推力 mixer + 电调 PWM / DShot 电机转速输出 Offboard 注入点 外部节点发布 TrajectorySetpoint / VehicleAttitudeSetpoint 经 uORB 或 MAVLink 进入 mc_pos_control / mc_att_control commander 校验 Offboard 心跳与模式切换条件

三、飞行模式:控制权归属与切换条件

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/视觉定点悬停、航拍
Missionnavigator 执行航点QGC 航点文件自动巡检、测绘
Offboard外部节点生成 setpointROS2 / 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 节点的前提。只有把“谁在控制、控制什么、失效后怎么办”这三件事想清楚,代码才能真正安全地飞起来。