- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
飞行模式(Flight Mode)是 PX4 自动驾驶仪的核心概念——它定义了自动驾驶仪如何响应用户输入并控制机体运动,是所有飞控行为的入口。本文面向开发者,完整解析 PX4 飞行模式体系的三大支柱:模式的分类与支持矩阵、飞控内部模式(Internal Modes)与机载计算机外部模式(External Modes,基于 ROS 2)的实现与选型、以及决定"何种条件下允许进入某模式"的模式约束(Mode Requirements)机制,最后介绍 PX4 v1.15 起实现的 MAVLink 标准模式协议。读完本文,你将掌握模式从"定义"到"启用"再到"与地面站交互"的完整链路,并能在仓库源码中定位到每一处关键实现。
飞行模式的基本概念与分类
在 PX4 中,模式("flight modes"、"drive modes" 等)是控制自动驾驶仪如何响应用户输入、如何控制机体运动的特殊运行状态。根据自动驾驶仪提供的控制级别/类型,模式被粗略分为三组:
- 手动模式(Manual):飞手通过遥控器直接控制,自动驾驶仪提供最少的辅助(如 Stabilized、Acro)。
- 辅助模式(Assisted):自动驾驶仪在部分通道上提供稳定或位置保持(如 Altitude、Position)。
- 自动模式(Auto):自动驾驶仪完全接管,按照任务、返航或着陆逻辑飞行(如 Mission、Return、Land、Takeoff)。
飞行员通过遥控器上的模式开关(RC 通道映射)或地面站(GCS)在模式之间切换。模式既可以在飞控上实现为 PX4 内部模式,也可以在一台机载计算机上实现为 PX4 外部(ROS 2)模式。从地面站(MAVLink)的视角看,模式的来源无法区分——这正是设计外部模式接口的目的之一。
支持的模式总览
并非所有模式在所有机型上都可用(或有意义),且同一模式在不同机型上的行为可能不同。PX4 内部模式的文档按机型分组,各机型模式入口如下:
- 飞行模式(多旋翼):Position、Altitude、Acro、Manual/Stabilized、Orbit、Follow Me、Mission、Hold、Return、Land、Takeoff、Descend 等;
- 飞行模式(固定翼):Manual、Stabilized、Acro、Altitude、Cruise、Guided Course、Hold、Mission、Return、Land、Takeoff、Descend 等;
- 飞行模式(VTOL):VTOL 模式行为取决于其当前处于多旋翼态还是固定翼态;
- 驾驶模式(Rover 地面车):Manual、Mission、Return 等;
- 基本配置 > 飞行模式:面向用户的模式分配与 RC 开关配置指南。
从源码角度看,PX4 内部模式最终都对应vehicle_status_s中的NAVIGATION_STATE_*枚举值(如NAVIGATION_STATE_POSCTL、NAVIGATION_STATE_AUTO_MISSION),模式约束系统正是围绕这些枚举展开的,详见下文 模式约束。
内部模式与外部模式:如何选择
除少数例外,一个模式既可以在飞控(FC)上实现,也可以在机载计算机上实现。两种路线的取舍如下。
PX4 外部模式不能用于以下场景:
- 需要运行在没有机载计算机的载具上的模式;
- 需要底层访问、严格时序和/或高更新率要求的模式,例如实现直接电机控制的多旋翼模式;
- 安全关键模式,例如 Return 模式——一旦 ROS 2 进程崩溃,系统必须立即回退到安全的内部模式;
- 任何无法使用 ROS的情况。
除上述情况外,应优先考虑外部模式,其优势包括:
- 更易实现:无需处理底层嵌入式约束(如受限的栈大小);
- 更易维护:集成 API 小而明确且稳定;
- 更易跨版本移植:飞控上的自定义 PX4 模式在不同 PX4 版本间移植往往很困难,因为飞行模式常使用被视为内部接口、允许变更的接口;而外部模式的 API 稳定;
- 更健壮:ROS 2 模式进程终止会回退到内部飞行模式,而内部模式崩溃则可能直接导致坠机;
- 可覆盖已有模式:外部模式可以覆盖现有模式以提供更高级的功能,甚至可以覆盖安全关键模式——若 ROS 2 模式崩溃,将自动切回原始内部模式;
- 更丰富的开发环境:拥有更高层的功能、更好的特性编程环境,以及大量可用的 Linux/ROS 库;
- 更强的计算能力:可进行更高级的处理(如计算机视觉)。
需要说明的是:用于创建外部模式的 PX4 ROS 2 Control Interface 首次出现在 PX4 v1.15 中,目前仍被视为实验性功能,存在一些限制,但会持续演进和增强。
PX4 外部模式(External Modes)
PX4 外部模式是使用 PX4 ROS 2 Control Interface 以 ROS 2 编写的模式(具体实现指引见该链接)。其运行在机载计算机上,通过稳定、明确定义的接口与飞控交互:
- 外部模式通过该接口发布期望轨迹/设定点,飞控上的
flight_mode_manager等模块负责接收并执行; - 模式约束(Mode Requirements)由外部模式自动推断(见下文对比);
- 地面站通过 MAVLink 标准模式协议可以发现外部模式(见 MAVLink 集成),从而在外部与内部模式之间对地面站保持透明。
PX4 内部模式(Internal Modes)
模式与飞行任务(Flight Task)的关系
内部模式运行在飞控上。某个模式在任意时刻的具体控制行为,由 Flight Task(飞行任务) 决定——一个模式可以定义一个或多个任务,任务定义了模式行为的变体,例如输入是被视为加速度设定点还是速度设定点。
任务的选用通常由参数定义,并在 src/modules/flight_mode_manager/FlightModeManager.cpp 的start_flight_task()中根据nav_state和参数选择。例如多旋翼 Position 模式(NAVIGATION_STATE_POSCTL)根据参数MPC_POS_MODE在FlightTaskIndex::ManualPosition(值 0)与FlightTaskIndex::ManualAcceleration(值 4,默认)之间切换(FlightModeManager.cpp);Orbit、Follow Me 等任务在非受限 Flash 构建下才会被启用(#if !defined(CONSTRAINED_FLASH))。
FlightModeManager 是导航与控制工作队列(nav_and_controllers)上的一个 WorkItem,在本地位置(vehicle_local_position)更新时被唤醒,运行Run()→start_flight_task()生成轨迹设定点(FlightModeManager.cpp)。若没有任何任务能够启动,则进入FlightTaskIndex::Failsafe作为兜底(FlightModeManager.cpp)。
开发者如需创建自定义内部模式对应的新飞行任务,可参考 Flight Tasks 文档 的完整流程:在src/modules/flight_mode_manager/tasks下按约定命名目录(如MyTask)并创建FlightTaskMyTask.{hpp,cpp}与CMakeLists.txt,重写基类 FlightTask 的activate()/update()虚方法,将任务加入src/modules/flight_mode_manager/CMakeLists.txt的flight_tasks_all列表,最后通过参数(如MPC_POS_MODE)在FlightModeManager.cpp的 switch 中启用任务。
模式约束(Mode Restrictions)
某些模式只在特定的起飞前/飞行中条件下才有意义。例如,没有手动控制器(RC/摇杆)的系统不应使用手动控制模式。PX4 模式可以将这些条件指定为约束(restrictions)。
内部模式的约束类型列在 FailsafeFlags uORB 主题的 "Per mode requirements" 部分(见 msg/FailsafeFlags.msg),原文如下:
# Per-mode requirements mode_req_angular_velocity mode_req_attitude mode_req_local_alt mode_req_local_position mode_req_local_position_relaxed mode_req_global_position mode_req_mission mode_req_offboard_signal mode_req_home_position mode_req_wind_and_flight_time_compliance # if set, mode cannot be entered if wind or flight time limit exceeded mode_req_prevent_arming # if set, cannot arm while in this mode mode_req_manual_control mode_req_other # other requirements, not covered above (for external modes)各约束(requirements)的完整语义,可参考仓库中自动生成的 Mode Requirements 页面。下表整理了每个约束的含义、典型传感器来源与示例:
| 约束 | 含义 / 满足条件示例 |
|---|---|
mode_req_angular_velocity | 角速度(陀螺仪)有效 |
mode_req_attitude | 姿态/位姿有效(IMU,或理论上来自动捕系统) |
mode_req_local_position | 相对 EKF2 原点('0' 点)的位置有效(GNSS、VIO、mocap) |
mode_req_local_position_relaxed | 相对 EKF2 原点的位置,但接受较差精度(典型:光流)。起飞时置零后仅积分流数据,绝对位置可能很不准但"聊胜于无" |
mode_req_global_position | 全局坐标系的位置测量更新(GNSS,或本地位置 + 全局参考映射到 EKF 原点) |
mode_req_global_position_relaxed | 全局位置更新但接受较差精度(本地位置 + 映射到 EKF2 原点的全局参考) |
mode_req_local_alt | 相对 EKF2 原点('0')的本地高度有效(气压计经 GNSS 高度长期修正、距离传感器) |
mode_req_mission | 自动驾驶仪存储中有有效任务(仅 Mission 模式要求;可用上次任务,无需重新上传) |
mode_req_offboard_signal | Offboard 心跳有效——MAVLinkSET_ATTITUDE_TARGET/SET_POSITION_TARGET_LOCAL_NED/SET_POSITION_TARGET_GLOBAL_INT未超时,Offboard 模式专属 |
mode_req_home_position | 全局 Home 参考已设置(Return 模式的特定要求) |
mode_req_wind_and_flight_time_compliance | 风况与飞行时间安全合规限制。当估计风速超过COM_WIND_MAX(且COM_WIND_MAX_ACT设置为比警告更强的动作)或飞行时间超过COM_FLT_TIME_MAX时,阻止进入该模式。两个限制默认均禁用;由故障保护触发的模式豁免(另见COM_WIND_WARN) |
mode_req_prevent_arming | 该模式阻止解锁。选中该模式时机体无法解锁,如 Land、Orbit、Return 等只能在飞行中进入、不能起飞于其中的模式 |
mode_req_manual_control | 需要摇杆输入。手动控制可来自 RC 系统(RC 驱动 → 通道映射/校准 →manual_control_input)或摇杆(MAVLinkMANUAL_CONTROL消息 →manual_control_input);由COM_RC_IN_MODE参数选择输入源并发布为manual_control_setpoint。所选源未超时即视为满足 |
mode_req_other | 其他要求,未被现有标志覆盖(用于外部模式) |
约束不满足时的行为:
- 在模式被选中的情况下,禁止解锁(arming not allowed);
- 已解锁时,无法切换到该模式;
- 已解锁且该模式处于选中状态时,将触发相应的故障保护(如手动控制要求对应 RC 丢失)。故障保护行为的配置见 Safety (Failsafe) Configuration。
以下为手动控制标志(mode_req_manual_control)对应的流程示意图:
注:上图取自 PX4 ROS 2 Control Interface > Failsafes and mode requirements。约束与概念与内部模式完全一致(只是定义位置不同)。主要区别在于:ROS 2 模式会推断(infer)应当使用的约束,而 PX4 源码中的模式必须显式指定它们。
约束在源码中的定义:getModeRequirements()
所有模式的约束统一在 src/modules/commander/ModeUtil/mode_requirements.cpp 的getModeRequirements()中设置。该函数接收vehicle_type与failsafe_flags_s &flags,先将所有mode_req_*位图清零,然后为每个NAVIGATION_STATE_*状态调用setRequirement()按位设置对应标志(mode_requirement |= 1u << nav_state)。
从源码中可以观察到几个关键事实:
- 机型相关的差异由
vehicle_type分支体现。例如 Mission(NAVIGATION_STATE_AUTO_MISSION)与 Hold(AUTO_LOITER)、Return(AUTO_RTL)在固定翼机型上使用_relaxed版本的位置约束(global_position_relaxed/local_position_relaxed),而在多旋翼上要求完整可靠的global_position/local_position(mode_requirements.cpp)。原因是固定翼在位置精度较差时仍能安全飞行。 - Takeoff(
AUTO_TAKEOFF)仅在旋翼机型上要求local_position——固定翼可以在没有本地位置的情况下起飞(mode_requirements.cpp)。 AUTO_RTL额外设置mode_req_home_position(需要 Home 位置)与mode_req_prevent_arming(不能在 Return 模式中解锁起飞)(mode_requirements.cpp)。NAVIGATION_STATE_TERMINATION(终止)与DESCEND、AUTO_LAND等状态设置了prevent_arming,防止在降落/终止等状态中解锁。- 文件中
static_assert(vehicle_status_s::NAVIGATION_STATE_MAX == 31, "update mode requirements")确保新增导航状态时开发者必须同步更新本函数。
当你新增一个内部模式时,必须在该方法中为其添加合适的约束。约束本身通过failsafe_flags_suORB 消息(见 msg/FailsafeFlags.msg)由 commander 的解锁/健康检查状态机消费,从而把"模式要求"与"解锁/故障保护"行为串联起来。
MAVLink 集成(Standard Modes Protocol)
PX4 自 v1.15 起实现了 MAVLink Standard Modes Protocol。该协议可用于发现所有模式与当前模式,以及设置当前模式,包括通过 PX4 ROS 2 Control Interface 创建的外部模式。
协议核心能力包括:
- 通过
MAV_CMD_REQUEST_MESSAGE+AVAILABLE_MODES发现系统(PX4 与 ROS 2 侧)支持的所有模式; - 通过
CURRENT_MODE发现当前模式; - 通过
MAV_CMD_DO_SET_STANDARD_MODE(推荐)设置标准模式(MAV_STANDARD_MODE); - 通过
AVAILABLE_MODES_MONITOR在模式集合变化时获得通知。
标准模式到 PX4 内部模式的映射(节选自 Standard Modes Protocol):
| 标准模式(MAV_STANDARD_MODE) | PX4 模式 | 内部模式 |
|---|---|---|
POSITION_HOLD(MC) | MC Position mode | POSCTL |
CRUISE(FW) | FW Cruise mode | POSCTL |
ALTITUDE_HOLD | FW/MC Altitude mode / MC Altitude mode | ALTCTL |
ORBIT(MC) | MC Orbit mode(FW 映射为 Hold/Loiter) | POSCTL / AUTO_LOITER |
SAFE_RECOVERY(所有机型) | Return mode | AUTO_RTL |
MISSION(所有机型) | Mission mode | AUTO_MISSION |
LAND(所有机型) | Land mode | AUTO_LAND |
TAKEOFF(所有机型) | Takeoff mode | AUTO_TAKEOFF |
说明:VTOL 机型在各自模式下理论上也可支持
CRUISE(FW 态)与POSITION_HOLD/ORBIT(MC 态),但目前尚未实现(见 standard_modes.md 的提示)。
源码实现:标准模式映射定义在 src/lib/modes/standard_modes.hpp,其中的StandardMode枚举与 MAVLinkMAV_STANDARD_MODE定义一致(POSITION_HOLD=1、ORBIT=2、CRUISE=3、ALTITUDE_HOLD=4、SAFE_RECOVERY=5、MISSION=6、LAND=7、TAKEOFF=8),getStandardModeFromNavState()将nav_state+ 机型类型映射为对应的标准模式,getNavStateFromStandardMode()则实现反向映射(实施映射时应参考该文件)。
此外,部分模式还可以通过更便捷的 MAVLink 命令直接启动,尤其当消息允许附加设置时(例如MAV_CMD_NAV_TAKEOFF、MAV_CMD_NAV_RETURN_TO_LAUNCH、MAV_CMD_NAV_LAND、MAV_CMD_DO_ORBIT、MAV_CMD_DO_FOLLOW、MAV_CMD_NAV_VTOL_TAKEOFF、MAV_CMD_DO_REPOSITION、MAV_CMD_DO_PAUSE_CONTINUE、MAV_CMD_MISSION_START)。需注意:这些命令早于"标准模式"协议,映射到的是机型特定的自定义模式——例如 Orbit 标准模式在 MC 上是 Orbit、在 FW 上是 Hold/Loiter,但当前MAV_CMD_DO_ORBIT只会在 MC 上启动 Orbit,在 FW 上会被忽略。MAV_CMD_DO_SET_MODE目前暂不支持。
总结:模式的完整生命周期
结合本文内容,一个 PX4 飞行模式从定义到使用的完整链路可以概括为:
- 定义:内部模式对应
vehicle_status_s的NAVIGATION_STATE_*状态,其控制行为由flight_mode_manager模块中的 Flight Task 实现;外部模式通过 PX4 ROS 2 Control Interface 在 ROS 2 中实现。 - 约束:在
getModeRequirements()(内部模式)或外部模式接口(自动推断)中定义该模式的进入条件,约束通过FailsafeFlagsuORB 消息进入 commander 的解锁/健康检查状态机。 - 切换:飞行员通过 RC 开关或地面站(MAVLink 标准模式协议)请求模式切换,
FlightModeManager::start_flight_task()根据nav_state与参数(如MPC_POS_MODE)启动对应 Flight Task 生成轨迹设定点。 - 保护:约束不满足时禁止解锁/禁止切换/触发故障保护;外部模式崩溃时回退到内部模式。
理解这一架构,是开发者基于 PX4 定制飞行行为、新增自定义模式的前提。深入阅读可继续查看 Flight Tasks 概念、Mode Requirements 自动生成文档 与 PX4 ROS 2 Control Interface。
- 嵌入式
- 物联网
- 机器人
- 自动驾驶
- 智能硬件
【免费下载链接】PX4-Autopilot
PX4 Autopilot Software
相关推荐
PX4 飞行模式配置指南:将飞行模式与功能开关映射到遥控器通道
PX4 飞行模式配置指南:将飞行模式与功能开关映射到遥控器通道 本篇指南讲解如何在 PX4 Autopilot 中把 飞行模式 (Position、Missio
嵌入式物联网机器人自动驾驶智能硬件AirSim 飞行控制器指南:simple_flight、PX4 HITL/SITL 配置与无飞控模式
AirSim 飞行控制器指南:simple_flight、PX4 HITL/SITL 配置与无飞控模式 本篇技术指南围绕 AirSim 的飞行控制器(Fligh
自动驾驶人工智能深度学习强化学习计算机视觉科研无人机开发者进阶:PX4-Autopilot自定义飞行模式开发实例
无人机开发者进阶:PX4 Autopilot自定义飞行模式开发实例 🚀 掌握PX4飞行模式开发,打造专属无人机智能飞行体验! PX4 Autopilot作为业
嵌入式物联网机器人自动驾驶智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考