PX4 与 ROS 无人机 Offboard 控制:模式解析与轨迹跟踪实战
PX4 作为开源飞控的代表,配合 ROS 的生态灵活性,是实现高级自主飞行的黄金组合。但在实际开发中,很多开发者对飞行模式的理解不够深入,导致 Offboard 控制程序不稳定。本文将结合实战经验,梳理 PX4 核心飞行模式,并提供一套完整的 C++ 实现方案。
理解 PX4 飞行模式层级
编写控制程序前,必须明确控制权归属。PX4 的模式本质上是控制权逐级递增的结构。
基础手动模式
- 稳定模式 (STABILIZED):仅保证姿态稳定,不锁位置。摇杆控制俯仰/横滚角,松开回正但会漂移。适合起飞、降落或紧急接管。
- 定高模式 (ALTCTL):高度保持 + 姿态稳定。油门通道重映射为爬升率指令。适合无 GPS 环境下的低空侦察。
- 位置模式 (POSCTL):全自主位置与高度锁定。使用 GPS/视觉定位将飞机稳定在三维坐标点。松开摇杆立即悬停。这是进入 Offboard 前的理想过渡状态。
自动与外部控制模式
- 自动模式 (AUTO):执行预设任务(如 MISSION, RTL, LAND),无需外部持续指令。
- Offboard 模式:外部控制模式。飞控的位置/姿态/速度期望值完全由通过 MAVLink 接收的外部指令设定。这是 ROS/PX4 集成的核心接口。注意,一旦指令流中断(通常>10Hz),飞控会触发失效保护,自动切换至安全模式。
ROS 集成与控制接口
通过 MAVROS 控制 PX4,主要有两种方式:模式切换和直接指令发送。要实现流畅的轨迹跟踪,必须切换到 OFFBOARD 模式。
模式切换服务
bool setMode(std::string mode) {
mavros_msgs::SetMode srv;
srv.request.custom_mode = mode;
return set_mode_client_.call(srv) && srv.response.mode_sent;
}
调用 /mavros/set_mode 服务即可切换。最常用的是 OFFBOARD,也可回退到 POSCTL 作为安全兜底。
实时指令发送
| 模式 | 是否接受 ROS 流式控制 | 控制方式 |
|---|---|---|
| OFFBOARD | 是 | 发送 setpoint_position / setpoint_velocity |
| POSCTL/ALTCTL | 否 | 需模拟 RC 输入,不推荐用于自动化 |
结论很明确:实现 ROS 程序控制的唯一标准方法是使用 Offboard 模式。
项目架构设计
我们构建一个名为 px4_offboard_control 的功能包,采用 C++14 标准。核心目标是实现自动起飞、悬停等待、轨迹跟踪(圆形/方形/螺旋)及安全降落。
目录结构
px4_offboard_control/
├── launch/offboard_control.launch
├── config/params.yaml
├── include/px4_offboard_control/trajectory_generator.h
└── src/offboard_control.cpp
└── trajectory_generator.cpp


