无人机自主飞行里,PX4 配合 ROS 是个很常见的组合。写控制程序前,先得把 PX4 的飞行模式搞清楚——这东西是按控制权逐级分层的。下面我按自己的理解梳理一遍,后面写 Offboard 控制才能心里有数。
你需要知道的几种飞行模式
稳定模式(STABILIZED / MANUAL / ACRO)
纯手动。飞控只负责姿态稳定,不锁位置也不锁高。你推摇杆飞机就动,松手它会回平,但风一吹就飘。特技飞行、紧急接管都靠它。
定高模式(ALTCTL)
高度保持,姿态也稳。飞控把油门通道重新映射成爬升率指令——摇杆中位就定高,上下推控制升降速率。低空侦察、没 GPS 的时候常用。
位置模式(POSCTL)
全自主位置锁定。飞控靠 GPS 或视觉,把飞机定死在三维坐标点。推摇杆控制水平速度,松手立刻刹车悬停。这是最常用的辅助模式,切进 Offboard 前用它过渡很合适。
自动模式(AUTO)
包含任务、返航、降落、起飞等子模式,全部由飞控内部逻辑跑预设任务,不需要外部持续指令。
Offboard 模式
外部控制模式,飞控的位置/姿态/速度期望值全部由外部电脑通过 MAVLink 发过来。外部计算机(比如机载电脑)要以 >10Hz 的频率持续发送设定点,一旦断了,飞控就触发失效保护,自己切到预设的安全模式(RTL 或 LAND)。SLAM、视觉伺服、编队、复杂轨迹都靠它。
ROS 能控制什么?
通过 MAVROS 控制 PX4,无非两种操作:切换模式,或者持续发指令。
- 模式切换:可以切到任何已配置的模式。最关键的当然是
OFFBOARD,切过去才能流式发控制指令。POSCTL常用作安全回退。AUTO.MISSION、AUTO.RTL、AUTO.LAND则用来启动自动任务或返航降落。
服务调用长这样:
rosservice call /mavros/set_mode "base_mode: 0 custom_mode: 'OFFBOARD'"
- 实时控制:只有
OFFBOARD模式接受流式指令。你可以发位置设定点、速度设定点等。其他模式(比如 POSCTL)虽然也能通过mavros/rc/override模拟遥控器信号,但那是非标准做法,不推荐。
所以结论很简单:要正经用 ROS 控制无人机,只能用 Offboard 模式。
我们要做什么
创建一个 px4_offboard_control 功能包,实现:
- 自动起飞到指定高度,悬停一阵,然后飞预设轨迹,最后降落;
- 支持位置控制或速度控制,通过参数切换;
- 内置圆形、方形、螺旋三种轨迹生成器;
- 用状态机管理整个流程:初始化、解锁、起飞、悬停、跟踪轨迹、降落、锁定;
- 配合 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 通信、参数加载、状态机流转、调模式切换和解锁服务,以及主循环。


