news 2026/9/24 0:05:22

PX4 飞行模式开发指南:内部模式、外部(ROS 2)模式与模式约束机制详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PX4 飞行模式开发指南:内部模式、外部(ROS 2)模式与模式约束机制详解
  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

飞行模式(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_POSCTLNAVIGATION_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_MODEFlightTaskIndex::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.txtflight_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_signalOffboard 心跳有效——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_typefailsafe_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(终止)与DESCENDAUTO_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 modePOSCTL
CRUISE(FW)FW Cruise modePOSCTL
ALTITUDE_HOLDFW/MC Altitude mode / MC Altitude modeALTCTL
ORBIT(MC)MC Orbit mode(FW 映射为 Hold/Loiter)POSCTL / AUTO_LOITER
SAFE_RECOVERY(所有机型)Return modeAUTO_RTL
MISSION(所有机型)Mission modeAUTO_MISSION
LAND(所有机型)Land modeAUTO_LAND
TAKEOFF(所有机型)Takeoff modeAUTO_TAKEOFF

说明:VTOL 机型在各自模式下理论上也可支持CRUISE(FW 态)与POSITION_HOLD/ORBIT(MC 态),但目前尚未实现(见 standard_modes.md 的提示)。

源码实现:标准模式映射定义在 src/lib/modes/standard_modes.hpp,其中的StandardMode枚举与 MAVLinkMAV_STANDARD_MODE定义一致(POSITION_HOLD=1ORBIT=2CRUISE=3ALTITUDE_HOLD=4SAFE_RECOVERY=5MISSION=6LAND=7TAKEOFF=8),getStandardModeFromNavState()nav_state+ 机型类型映射为对应的标准模式,getNavStateFromStandardMode()则实现反向映射(实施映射时应参考该文件)。

此外,部分模式还可以通过更便捷的 MAVLink 命令直接启动,尤其当消息允许附加设置时(例如MAV_CMD_NAV_TAKEOFFMAV_CMD_NAV_RETURN_TO_LAUNCHMAV_CMD_NAV_LANDMAV_CMD_DO_ORBITMAV_CMD_DO_FOLLOWMAV_CMD_NAV_VTOL_TAKEOFFMAV_CMD_DO_REPOSITIONMAV_CMD_DO_PAUSE_CONTINUEMAV_CMD_MISSION_START)。需注意:这些命令早于"标准模式"协议,映射到的是机型特定的自定义模式——例如 Orbit 标准模式在 MC 上是 Orbit、在 FW 上是 Hold/Loiter,但当前MAV_CMD_DO_ORBIT只会在 MC 上启动 Orbit,在 FW 上会被忽略。MAV_CMD_DO_SET_MODE目前暂不支持。

总结:模式的完整生命周期

结合本文内容,一个 PX4 飞行模式从定义到使用的完整链路可以概括为:

  1. 定义:内部模式对应vehicle_status_sNAVIGATION_STATE_*状态,其控制行为由flight_mode_manager模块中的 Flight Task 实现;外部模式通过 PX4 ROS 2 Control Interface 在 ROS 2 中实现。
  2. 约束:在getModeRequirements()(内部模式)或外部模式接口(自动推断)中定义该模式的进入条件,约束通过FailsafeFlagsuORB 消息进入 commander 的解锁/健康检查状态机。
  3. 切换:飞行员通过 RC 开关或地面站(MAVLink 标准模式协议)请求模式切换,FlightModeManager::start_flight_task()根据nav_state与参数(如MPC_POS_MODE)启动对应 Flight Task 生成轨迹设定点。
  4. 保护:约束不满足时禁止解锁/禁止切换/触发故障保护;外部模式崩溃时回退到内部模式。

理解这一架构,是开发者基于 PX4 定制飞行行为、新增自定义模式的前提。深入阅读可继续查看 Flight Tasks 概念、Mode Requirements 自动生成文档 与 PX4 ROS 2 Control Interface。

  • 嵌入式
  • 物联网
  • 机器人
  • 自动驾驶
  • 智能硬件

【免费下载链接】PX4-Autopilot

PX4 Autopilot Software

项目地址:https://gitcode.com/gh_mirrors/px/PX4-Autopilot
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 0:01:00

Flutter数值映射库num_remap在鸿蒙开发中的应用与优化

1. Flutter 三方库 num_remap 鸿蒙适配实战指南在 OpenHarmony 生态中开发动态交互应用时&#xff0c;数值范围映射是个高频需求场景。无论是处理传感器数据、手势操作还是动画效果&#xff0c;都需要将原始数据转换为适合 UI 展示的数值范围。传统的手写映射代码不仅冗长难维护…

作者头像 李华
网站建设 2026/9/23 23:58:34

Python毕业设计评价系统:Flask+SQLite教学质量管理实战

简介&#xff1a;本资源是一套基于Python开发的毕业设计教学质量评价系统完整源码与数据库实现&#xff0c;面向高校教务管理人员、计算机专业毕业设计指导教师及本科毕设项目开发者&#xff0c;旨在解决毕业设计过程中的多角色协同评价、成绩量化分析与教学质量管理难题。压缩…

作者头像 李华
网站建设 2026/9/23 23:54:04

YOLO智慧工地安全检测:7538张图像数据集训练全攻略

简介&#xff1a;这是一套面向智慧工地安全监测场景的YOLO算法数据集&#xff0c;适用于计算机视觉开发者、算法工程师以及施工现场安全管理人员。资源对应7538张真实工地图像&#xff0c;对安全帽、反光衣、头盔、背心、靴子五类安全装备进行了详细标注&#xff0c;图像覆盖不…

作者头像 李华
网站建设 2026/9/23 23:49:12

基于深度学习的量化投资策略:从数据管道到实盘部署的工程实践

简介&#xff1a;这份资源是面向高校学生与量化投资初学者的深度学习实战项目包&#xff0c;适用于毕业设计、期末大作业或人工智能与金融科技交叉方向的课程实践。项目围绕量化投资策略的完整开发流程展开&#xff0c;涵盖数据预处理、模型构建、训练调优以及回测评估等关键环…

作者头像 李华
网站建设 2026/9/23 23:46:36

BP神经网络实战:大学生校园消费预测模型构建与优化

简介&#xff1a;这份资源面向本科及以上阶段、需要完成神经网络课程设计或数据建模练习的学生与研究人员&#xff0c;围绕城乡大学生月平均消费数据&#xff0c;提供一套可直接运行的MATLAB BP神经网络预测方案&#xff0c;用于解决消费趋势拟合与预测问题。压缩包共4个文件&a…

作者头像 李华