一说起无人机自主飞行,PX4 加 ROS 几乎成了标准方案。PX4 作为开源飞控生态完整,ROS 又让开发者可以在机载电脑上自由组合算法。但很多刚接触的人会在两个地方卡住:一是搞不清 PX4 那一堆飞行模式到底有什么区别,二是不知道从 ROS 侧怎么可靠地控制飞机。
我写这篇文章,就是想把这部分经验串起来——先帮你理清 PX4 的飞行模式,尤其是 Offboard 的工作机制,然后给出一个完整的 ROS 功能包,实现自动起飞、悬停、轨迹跟踪(圆形/方形/螺旋)和降落。代码用 C++ 和 MAVROS,在 SITL 仿真里跑通,真机移植前稍微改改参数就能用。
PX4 飞行模式:控制权从低到高
PX4 的飞行模式可以看成控制权逐级上升的阶梯。理解这一点,你就知道什么时候该用什么模式,以及 Offboard 的位置在哪。
稳定模式(STABILIZED / MANUAL / ACRO)
这是最底层的手动模式。飞控只保证机体姿态稳定,不管位置、不管高度。你推摇杆,飞机跟着转;松开摇杆,飞机回平,但会被风吹走。油门直接对应电机出力。
通常用在起飞、降落辅助,或者你想耍特技的时候。紧急切手动也靠它。
定高模式(ALTCTL)
飞控开始接管高度,但不控制水平位置。此时油门通道被重新映射为爬升率指令,摇杆中位就是悬停。左右手还是管姿态和水平速度。
这个模式在低空侦察或者 GPS 挂掉时有用,因为有气压计就能勉强维持高度。
位置模式(POSCTL)
这是最常用的辅助模式。飞控用 GPS 或视觉定位把飞机钉在一个 3D 点上。摇杆控制的是水平速度和垂直速度,手一松飞机立刻刹车悬停。
在真正切到 Offboard 之前,我一般习惯先切到位置模式确认定位正常,再发 Offboard 指令。
自动模式(AUTO)
这下面包含任务模式(MISSION)、返航(RTL)、降落(LAND)、起飞(TAKEOFF)等。它们由飞控内建逻辑跑预设任务,不需要外部持续喂指令。
Offboard 模式
这才是 ROS 集成最关键的地方。在这个模式下,飞控的姿态、位置或速度期望值完全由外部计算机通过 MAVLink 发送。换句话说,你可以写 C++ 代码直接接管飞机。
不过它有硬性约束:外部电脑必须以 ≥10Hz 的频率持续下发设定点。一旦指令流断掉,飞控的失效保护会立即触发,切到预设的安全模式(通常是 RTL 或 LAND)。所以你的控制循环一定要稳,而且最好让发布频率远高于 10Hz,我一般用 20Hz。
凡是需要 SLAM 建图、视觉伺服、编队、复杂轨迹跟踪的场景,都离不开 Offboard。
ROS 侧怎么操控:模式切换与指令发送
通过 MAVROS,你可以做两类操作:切换飞行模式,或者发送实时控制指令。
模式切换理论上可以切到任何已配置的模式。最常用的几个:
OFFBOARD:切过去之后才能发送流式命令。POSCTL:作为准备或安全的回退。AUTO.MISSION/AUTO.RTL/AUTO.LAND:启动自动任务。
切换用服务调用,一行命令就行:
rosservice call /mavros/set_mode "base_mode: 0 custom_mode: 'OFFBOARD'"
实时控制只有 Offboard 模式接受。别的模式(比如 POSCTL)你虽然可以靠模拟遥控器信号(mavros/rc/override)间接控制,但那又绕又不可靠,不推荐。
简单说:想用程序控制飞机,就只用 Offboard。
做一个完整的 Offboard 控制包
我建了个 ROS 包叫 px4_offboard_control,用状态机把起飞、轨迹、降落串起来,方便你按自己的需求改轨迹和参数。
功能:
- 自动起飞到指定高度
- 悬停等待几秒
- 按预设轨迹飞行(圆形、方形、螺旋)


