拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 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 等飞行模式VTOLVTOL 模式行为取决于其当前处于多旋翼态还是固定翼态驾驶模式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 ModesPX4 外部模式是使用 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.cppOrbit、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、mocapmode_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_WARNmode_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分支体现。例如 MissionNAVIGATION_STATE_AUTO_MISSION与 HoldAUTO_LOITER、ReturnAUTO_RTL在固定翼机型上使用_relaxed版本的位置约束global_position_relaxed/local_position_relaxed而在多旋翼上要求完整可靠的global_position/local_positionmode_requirements.cpp。原因是固定翼在位置精度较差时仍能安全飞行。TakeoffAUTO_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 ProtocolPX4 自 v1.15 起实现了 MAVLink Standard Modes Protocol。该协议可用于发现所有模式与当前模式以及设置当前模式包括通过 PX4 ROS 2 Control Interface 创建的外部模式。协议核心能力包括通过MAV_CMD_REQUEST_MESSAGEAVAILABLE_MODES发现系统PX4 与 ROS 2 侧支持的所有模式通过CURRENT_MODE发现当前模式通过MAV_CMD_DO_SET_STANDARD_MODE推荐设置标准模式MAV_STANDARD_MODE通过AVAILABLE_MODES_MONITOR在模式集合变化时获得通知。标准模式到 PX4 内部模式的映射节选自 Standard Modes Protocol标准模式MAV_STANDARD_MODEPX4 模式内部模式POSITION_HOLDMCMC Position modePOSCTLCRUISEFWFW Cruise modePOSCTLALTITUDE_HOLDFW/MC Altitude mode / MC Altitude modeALTCTLORBITMCMC Orbit modeFW 映射为 Hold/LoiterPOSCTL / AUTO_LOITERSAFE_RECOVERY所有机型Return modeAUTO_RTLMISSION所有机型Mission modeAUTO_MISSIONLAND所有机型Land modeAUTO_LANDTAKEOFF所有机型Takeoff modeAUTO_TAKEOFF说明VTOL 机型在各自模式下理论上也可支持CRUISEFW 态与POSITION_HOLD/ORBITMC 态但目前尚未实现见 standard_modes.md 的提示。源码实现标准模式映射定义在 src/lib/modes/standard_modes.hpp其中的StandardMode枚举与 MAVLinkMAV_STANDARD_MODE定义一致POSITION_HOLD1、ORBIT2、CRUISE3、ALTITUDE_HOLD4、SAFE_RECOVERY5、MISSION6、LAND7、TAKEOFF8getStandardModeFromNavState()将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-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门