【PX4+ROS完全指南】从零实现无人机Offboard控制:模式解析与实战
本文详细解析PX4飞控系统的6种核心飞行模式,重点介绍通过ROS实现Offboard控制的完整方案。文章提供可直接运行的ROS功能包,包含自动起飞、悬停、轨迹跟踪(圆形/方形/螺旋)和降落功能,采用状态机设计确保安全。核心内容包括PX4飞行模式层级解析、ROS控制接口说明、代码架构设计(含轨迹生成器)、参数配置及安全注意事项。该方案支持位置/速度双控制模式,经过SITL仿真测试,可用于科研、比赛等
引言
无人机自主飞行是机器人领域的热门方向,而PX4作为功能强大的开源飞控,配合ROS(机器人操作系统)的灵活性与生态,成为实现高级自主飞行的黄金组合。然而,许多初学者对PX4的飞行模式理解不清,更不知道如何通过ROS编写可靠的Offboard控制程序。
本文将带你彻底搞懂PX4 6大核心飞行模式,实现无人机的自动起飞、悬停、轨迹跟踪(圆形/方形/螺旋)与降落。
亮点一览:
-
✅ 深度解析PX4飞行模式(稳定/定高/位置/自动/Offboard)
-
✅ 明确ROS可控制的模式与指令接口
-
✅ 完整的ROS功能包(C++实现,状态机设计)
-
✅ 支持位置控制与速度控制双模式
-
✅ 内置圆形、方形、螺旋轨迹生成器
-
✅ 详细的安全机制与失效保护配置
无论你是准备参加比赛、做科研,还是想入门无人机开发,这篇文章都将是你宝贵的参考资料。
第一部分:PX4飞行模式深度剖析
PX4的飞行模式可以看作一个控制权逐级递增的层级结构。理解这些模式是编写控制程序的前提。
1. 稳定模式(STABILIZED / MANUAL / ACRO)
-
核心特点:纯手动姿态控制。飞控仅保证机体自身姿态稳定,但不进行位置或高度锁定。
-
操控方式:摇杆控制俯仰/横滚角;油门直接控制升力。松开摇杆,飞机会回正到水平,但会随风漂移。
-
应用场景:起飞、降落、特技飞行、紧急手动接管。
2. 定高模式(ALTCTL)
-
核心特点:高度保持 + 姿态稳定。飞控将油门通道重映射为爬升率指令。
-
操控方式:俯仰/横滚摇杆控制姿态和水平速度;油门摇杆中位时维持高度,上下推动控制爬升/下降速率。
-
应用场景:低空侦察、无GPS或光流情况下的高度稳定飞行。
3. 位置模式(POSCTL)
-
核心特点:全自主位置与高度锁定。飞控使用GPS/视觉定位将飞机稳定在固定的三维坐标点。
-
操控方式:俯仰/横滚摇杆控制水平速度;油门摇杆控制垂直速率。松开摇杆,飞机立即刹车并悬停。
-
应用场景:最常用、最安全的辅助模式,是进入Offboard模式前的理想过渡。
4. 自动模式(AUTO)
包括任务模式(MISSION)、返航模式(RTL)、降落模式(LAND)、起飞模式(TAKEOFF)等。由飞控内部逻辑执行预设任务,无需外部持续指令。
5. Offboard模式
-
核心特点:外部控制模式。飞控的位置/姿态/速度期望值完全由通过MAVLink接收的外部指令设定。这是ROS/PX4集成的核心接口。
-
工作方式:外部计算机(如机载电脑)以>10Hz频率持续发送设定点指令。一旦指令流中断,飞控触发失效保护,自动切换到预设安全模式(如RTL或LAND)。
-
应用场景:SLAM建图、视觉伺服、集群编队、复杂轨迹跟踪等所有需要高级算法的场景。
第二部分:ROS可控制的模式分析
通过ROS(通常借助MAVROS)控制PX4,主要有两种方式:模式切换和直接指令发送。
1. 可切换的模式
MAVROS理论上可以切换到任何已配置的飞行模式,最常用于:
-
OFFBOARD:最关键的模式,切换到此模式才能发送流式控制指令。 -
POSCTL:作为Offboard前的准备,或安全回退模式。 -
AUTO.MISSION/AUTO.RTL/AUTO.LAND:启动自动任务、触发返航或降落。
服务调用示例:
rosservice call /mavros/set_mode "base_mode: 0 custom_mode: 'OFFBOARD'"
2. 可发送实时控制指令的模式
| 模式 | 是否接受ROS流式控制 | 控制方式 |
|---|---|---|
OFFBOARD |
是 | 发送setpoint_position/setpoint_velocity等指令 |
POSCTL/ALTCTL |
否(可模拟RC) | 通过mavros/rc/override模拟遥控器输入,不推荐 |
| 其他 | 否 | 仅能通过服务切换模式,不能实时控制 |
结论: 实现ROS程序控制的唯一标准方法是使用Offboard模式。
第三部分:项目概述
我们将创建一个名为px4_offboard_control的ROS功能包,实现以下功能:
-
自动起飞:上升至指定高度并悬停。
-
悬停等待:稳定数秒后开始轨迹飞行。
-
轨迹跟踪:支持圆形、方形、螺旋三种预设轨迹。
-
速度/位置控制可选:通过参数切换控制模式。
-
状态机管理:安全处理各阶段转换。
-
失效保护:与PX4的Offboard超时保护无缝配合。
技术栈:ROS Melodic/Noetic、C++14、MAVROS、PX4 SITL、Eigen、TF2。
第四部分:代码结构设计
整体架构
px4_offboard_control/
├── CMakeLists.txt
├── package.xml
├── launch/
│ └── offboard_control.launch # 主启动文件
├── config/
│ └── params.yaml # 参数配置文件
├── include/
│ └── px4_offboard_control/
│ └── trajectory_generator.h # 轨迹生成器头文件
└── src/
├── offboard_control.cpp # 主控制节点(含状态机)
└── trajectory_generator.cpp # 轨迹生成器实现
核心类设计
TrajectoryGenerator:负责生成各种轨迹点,并提供从当前位置到目标点的速度指令计算(P控制器)。
OffboardControl:主控制类,包含:
-
ROS通信(订阅状态/位置,发布设定点/轨迹)
-
状态机(初始化、解锁、起飞、悬停、轨迹跟踪、降落、锁定)
-
参数加载
-
模式切换/解锁服务调用
-
主循环控制逻辑
状态机流转图
INIT -> ARMING -> TAKEOFF -> HOVER -> FOLLOW_TRAJECTORY -> LAND -> DISARM -> 结束
每个状态都有超时或条件判断,确保安全转换。
第五部分:核心代码详解
1. 轨迹生成器(trajectory_generator.cpp)
生成圆形轨迹:
std::vector<geometry_msgs::PoseStamped> generateCircleTrajectory(
const geometry_msgs::PoseStamped& start_pose,
double radius, double height, int points, int num_loops) {
std::vector<geometry_msgs::PoseStamped> traj;
for (int loop = 0; loop < num_loops; ++loop) {
for (int i = 0; i < points; ++i) {
double angle = 2.0 * M_PI * i / points;
pose.pose.position.x = start_pose.pose.position.x + radius * cos(angle);
pose.pose.position.y = start_pose.pose.position.y + radius * sin(angle);
pose.pose.position.z = height;
// 使无人机始终指向圆心(可选)
double yaw = atan2(-sin(angle), -cos(angle));
pose.pose.orientation = getQuaternionFromYaw(yaw);
traj.push_back(pose);
}
}
return traj;
}
速度指令计算:使用简单的P控制器,将位置误差转换为速度指令,并限制最大速度。
2. 主控制节点(offboard_control.cpp)
状态机处理示例(起飞状态):
void handleTakeoffState(ros::Rate& rate) {
geometry_msgs::PoseStamped target_pose;
target_pose.pose.position.z = home_pose_.pose.position.z + takeoff_height_;
if (use_position_control_) {
local_pos_pub_.publish(target_pose);
if (fabs(current_pose_.pose.position.z - target_pose.pose.position.z) < pos_tolerance_) {
ROS_INFO("Reached takeoff altitude");
control_state_ = HOVER;
}
} else if (use_velocity_control_) {
auto vel_cmd = trajectory_gen_.calculateVelocityCommand(current_pose_, target_pose, ...);
local_vel_pub_.publish(vel_cmd);
if (vel_cmd.twist.linear.z == 0) {
control_state_ = HOVER;
}
}
}
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;
}
bool arm(bool arm) {
mavros_msgs::CommandBool srv;
srv.request.value = arm;
return arming_client_.call(srv) && srv.response.success;
}
主循环:以20Hz运行,根据当前状态调用对应的处理函数,并持续发送设定点以维持Offboard模式。
第六部分:配置与参数说明
参数文件(params.yaml)
# 基本参数
takeoff_height: 2.0
hover_duration: 5.0
pos_tolerance: 0.1
# 控制模式(只能选一个)
use_position_control: true # 位置控制模式
use_velocity_control: false # 速度控制模式
# 轨迹类型(circle / square / spiral)
trajectory_type: "circle"
# 速度限制
max_linear_vel: 1.0
max_angular_vel: 0.5
# 可视化
publish_trajectory: true
Launch文件(offboard_control.launch)
启动MAVROS和Offboard控制节点,可传参:
<arg name="trajectory_type" default="circle"/>
<arg name="takeoff_height" default="2.0"/>
...
<node name="offboard_control" pkg="px4_offboard_control" type="offboard_control" output="screen">
<param name="trajectory_type" value="$(arg trajectory_type)"/>
...
</node>
第七部分:编译与运行
环境要求
-
Ubuntu 18.04/20.04
-
ROS Melodic/Noetic
-
PX4-Autopilot(用于SITL仿真)
-
MAVROS
编译步骤
cd ~/catkin_ws
catkin_make
source devel/setup.bash
运行仿真
roslaunch px4_offboard_control offboard_control.launch trajectory_type:=circle
将看到无人机自动起飞、悬停、执行圆形轨迹,最后降落。
第八部分:测试与结果
测试场景:
-
圆形轨迹(半径2m,高度3m)
-
方形轨迹(边长4m)
-
螺旋轨迹(最大半径3m,最大高度5m)
观察指标:
-
轨迹跟踪精度(<0.2m误差)
-
状态转换平滑性
-
Offboard模式保持(无超时断开)
可视化:程序会发布/planned_trajectory话题,可在RViz中显示路径。
第九部分:安全注意事项
-
真机飞行前务必在SITL中充分测试。
-
设置PX4失效保护参数:
-
COM_RCL_EXCEPT:允许在遥控器丢失时仍保持Offboard(谨慎)。 -
COM_OF_LOSS_T:Offboard指令超时后切换到什么模式(建议设为21或20,即降落或返航)。
-
-
确保GPS信号良好(真机),或使用视觉定位。
-
保持紧急切换能力:遥控器设置为Position模式,以便随时接管。
-
代码中增加心跳机制:持续发送指令,并监控
mavros/state中的armed和mode,异常时自动降落。
第十部分:总结与扩展
本文详细解析了PX4飞行模式,并提供了一个完整的ROS Offboard控制实现。你可以在此基础上:
-
扩展更多轨迹:如八字形、自定义路径点。
-
添加传感器融合:结合VIO或激光雷达实现室内导航。
-
实现集群控制:多机协同。
-
集成视觉算法:目标跟踪、避障。
参考文献:
-
PX4用户指南
-
MAVROS文档
-
ROS Wiki
作者:佳木逢钺
日期:2026年3月8日
版权:本文为原创文章,转载请附原文链接。
更多推荐



所有评论(0)