免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

PX4 MAVLink 标准模式协议:飞行模式的发现、查询与切换全解析

PX4 MAVLink 标准模式协议:飞行模式的发现、查询与切换全解析 嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本篇基于 PX4 官方文档 standard_modes.md 整理并深入源码。自 PX4 v1.15 起PX4 实现了 MAVLink 标准模式协议Standard Modes Protocol使地面站或外部系统包括通过 PX4 ROS 2 控制接口创建的外部模式能够统一地发现所有可用飞行模式、查询当前模式并以跨飞行栈通用的标准模式枚举来切换模式。读完本文你将掌握协议涉及的全部消息与命令、各类飞行器多旋翼 / 固定翼 / VTOL的标准模式映射表以及 PX4 中从命令下发到导航状态切换的完整源码实现链路。协议概述标准模式与自定义模式在 MAVLink 体系中模式分为两类标准模式Standard Modes各飞行栈普遍支持、行为大致一致的模式例如位置悬停、定高、任务、降落、起飞、安全返航等。地面站可以只依赖标准模式枚举即可对多种飞行栈的飞行器执行相同的操作自定义模式Custom Modes飞行栈私有的模式通过custom_mode整数在 PX4 中即px4_custom_mode位域编码表达。该协议提供的能力包括能力所用消息 / 命令发现系统PX4 及 ROS 2 侧支持的全部模式MAV_CMD_REQUEST_MESSAGE请求AVAILABLE_MODES发现当前模式CURRENT_MODE周期性发送设置标准模式MAV_CMD_DO_SET_STANDARD_MODE推荐方式模式集合变化通知AVAILABLE_MODES_MONITOR此外PX4 也支持通过传统SET_MODE消息设置自定义模式结合AVAILABLE_MODES中的自定义模式信息。需要注意的是文档明确说明在当前版本中MAV_CMD_DO_SET_MODE尚不受支持切换模式应使用MAV_CMD_DO_SET_STANDARD_MODE标准模式或SET_MODE自定义模式。支持的 MAVLink 标准模式及 PX4 映射表PX4 对外宣称支持下列标准飞行模式——即可以调用MAV_CMD_DO_SET_STANDARD_MODE并传入对应的MAV_STANDARD_MODE枚举值来启动这些模式。PX4 内部将其映射到导航状态nav_state。多旋翼MC标准模式标准模式对应 PX4 模式内部导航状态MAV_STANDARD_MODE_POSITION_HOLDMC Position 模式POSCTLMAV_STANDARD_MODE_ALTITUDE_HOLDMC Altitude 模式ALTCTLMAV_STANDARD_MODE_ORBITMC Orbit 模式POSCTL实际导航状态 ORBITMAV_STANDARD_MODE_SAFE_RECOVERYReturn 模式AUTO_RTLMAV_STANDARD_MODE_MISSIONMC Mission 模式AUTO_MISSIONMAV_STANDARD_MODE_LANDMC Land 模式AUTO_LANDMAV_STANDARD_MODE_TAKEOFFMC Takeoff 模式AUTO_TAKEOFF固定翼FW标准模式标准模式对应 PX4 模式内部导航状态MAV_STANDARD_MODE_CRUISEFW Cruise 模式POSCTLMAV_STANDARD_MODE_ALTITUDE_HOLDFW Altitude 模式ALTCTLMAV_STANDARD_MODE_ORBITFW Hold 模式AUTO_LOITERMAV_STANDARD_MODE_SAFE_RECOVERYReturn 模式AUTO_RTLMAV_STANDARD_MODE_MISSIONFW Mission 模式AUTO_MISSIONMAV_STANDARD_MODE_LANDFW Land 模式AUTO_LANDMAV_STANDARD_MODE_TAKEOFFFW Takeoff 模式AUTO_TAKEOFFVTOL 标准模式VTOL 飞行器支持的标准模式同样取决于当前是作为多旋翼飞行还是作为固定翼飞行行为随构型切换而变化标准模式对应 PX4 模式内部导航状态MAV_STANDARD_MODE_ALTITUDE_HOLDFW Altitude 模式ALTCTLMAV_STANDARD_MODE_SAFE_RECOVERYReturn 模式AUTO_RTLMAV_STANDARD_MODE_MISSIONMission 模式AUTO_MISSIONMAV_STANDARD_MODE_LANDLand 模式AUTO_LANDMAV_STANDARD_MODE_TAKEOFFTakeoff 模式AUTO_TAKEOFF注意VTOL 理论上还可在旋翼/固定翼构型下分别支持MAV_STANDARD_MODE_POSITION_HOLDMC、MAV_STANDARD_MODE_CRUISEFW与MAV_STANDARD_MODE_ORBIT但文档明确指出这部分尚未实现——这与下文源码中映射函数对 VTOL 的保守处理一一对应。全飞行器通用标准模式以下标准模式对所有飞行器类型都有映射标准模式对应 PX4 模式内部导航状态MAV_STANDARD_MODE_SAFE_RECOVERYReturn 模式AUTO_RTLMAV_STANDARD_MODE_MISSIONMission 模式AUTO_MISSIONMAV_STANDARD_MODE_LANDLand 模式AUTO_LANDMAV_STANDARD_MODE_TAKEOFFTakeoff 模式AUTO_TAKEOFF源码解析一标准模式 ↔ 导航状态双向映射文档指向的核心实现位于 src/lib/modes/standard_modes.hpp。该头文件定义了与 MAVLinkMAV_STANDARD_MODE枚举完全对齐的 C 枚举// src/lib/modes/standard_modes.hpp enum class StandardMode : uint8_t { NON_STANDARD 0, POSITION_HOLD 1, ORBIT 2, CRUISE 3, ALTITUDE_HOLD 4, SAFE_RECOVERY 5, MISSION 6, LAND 7, TAKEOFF 8, };映射逻辑由两个内联函数完成均需要飞行器类型vehicle_type与是否 VTOLis_vtol作为输入1.getNavStateFromStandardMode()L104-L152——标准模式到导航状态的转换这是设置标准模式路径的核心static inline uint8_t getNavStateFromStandardMode(StandardMode mode, uint8_t vehicle_type, bool is_vtol) { switch (mode) { case StandardMode::SAFE_RECOVERY: return vehicle_status_s::NAVIGATION_STATE_AUTO_RTL; case StandardMode::MISSION: return vehicle_status_s::NAVIGATION_STATE_AUTO_MISSION; case StandardMode::LAND: return vehicle_status_s::NAVIGATION_STATE_AUTO_LAND; case StandardMode::TAKEOFF: return vehicle_status_s::NAVIGATION_STATE_AUTO_TAKEOFF; case StandardMode::ALTITUDE_HOLD: // VTOL 或 纯 MC / 纯 FW 均支持 if (is_vtol || vehicle_type ROTARY_WING || vehicle_type FIXED_WING) { return vehicle_status_s::NAVIGATION_STATE_ALTCTL; } break; case StandardMode::POSITION_HOLD: // 仅非 VTOL 的多旋翼支持VTOL 未实现与文档说明一致 if (!is_vtol vehicle_type ROTARY_WING) { return vehicle_status_s::NAVIGATION_STATE_POSCTL; } break; case StandardMode::CRUISE: // 仅非 VTOL 的固定翼支持 if (!is_vtol vehicle_type FIXED_WING) { return vehicle_status_s::NAVIGATION_STATE_POSCTL; } break; case StandardMode::ORBIT: if (vehicle_type ROTARY_WING) { return vehicle_status_s::NAVIGATION_STATE_ORBIT; } if (vehicle_type FIXED_WING) { return vehicle_status_s::NAVIGATION_STATE_AUTO_LOITER; // FW 的 Orbit 即 Hold/Loiter } break; default: break; } return vehicle_status_s::NAVIGATION_STATE_MAX; // 不支持时返回 MAX }几个关键细节返回值NAVIGATION_STATE_MAX表示该标准模式对当前飞行器类型不适用调用方据此给出失败应答MC 的ORBIT与POSITION_HOLD都最终落到 POSCTL 类导航状态但ORBIT有独立的NAVIGATION_STATE_ORBITFW 的ORBIT则映射为AUTO_LOITER即 Hold/Loiter这解释了文档中Orbit 在 MC 上是 Orbit 模式、在 FW 上是 Hold 模式的说法VTOL 的保守处理POSITION_HOLD与CRUISE均要求!is_vtol因此 VTOL 请求这两个标准模式会返回NAVIGATION_STATE_MAX——正是文档中VTOL 可支持但未实现备注的代码依据。2.getStandardModeFromNavState()L59-L99——导航状态到标准模式的反向转换用于把 PX4 自身的自定义模式包装成标准模式上报给地面站例如CURRENT_MODE消息中的standard_mode字段。无法对应任何标准模式的导航状态返回NON_STANDARD。这种双向映射设计意味着PX4 对外用标准模式呈现自身能力对外部则同时保留完整的自定义模式视图。源码解析二命令处理链路与两条 MAVLink 消息流设置标准模式Commander 中的命令分发当地面站发出MAV_CMD_DO_SET_STANDARD_MODE时MAVLink 模块将其转换为vehicle_command_s传入 Commander。处理逻辑位于 src/modules/commander/Commander.cppcase vehicle_command_s::VEHICLE_CMD_DO_SET_STANDARD_MODE: { mode_util::StandardMode standard_mode (mode_util::StandardMode) roundf(cmd.param1); uint8_t nav_state mode_util::getNavStateFromStandardMode(standard_mode, _vehicle_status.vehicle_type, _vehicle_status.is_vtol); if (nav_state vehicle_status_s::NAVIGATION_STATE_MAX) { answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_FAILED); } else { if (_user_mode_intention.change(nav_state, getSourceFromCommand(cmd))) { answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED); } else { answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_TEMPORARILY_REJECTED); } } }从源码结构可以确认完整的处理语义param1即MAV_STANDARD_MODE枚举值见上一节的映射表Commander 将其转换为内部导航状态若该飞行器类型不支持该标准模式映射结果为NAVIGATION_STATE_MAX直接应答VEHICLE_CMD_RESULT_FAILED否则请求用户模式意图变更_user_mode_intention.change该路径还记录了命令来源getSourceFromCommand成功则应答ACCEPTED失败例如被其他控制源抢占或状态不允许则应答TEMPORARILY_REJECTED。发现模式AVAILABLE_MODES消息流模式发现通过MAV_CMD_REQUEST_MESSAGE请求AVAILABLE_MODES消息触发实现在 src/modules/mavlink/streams/AVAILABLE_MODES.hpp请求参数param2为mode_index。传0表示请求全部模式遍历vehicle_status.valid_nav_states_mask中所有有效导航状态逐一发送传1..N表示只请求第 N 个模式request_message()L144-L198。每条AVAILABLE_MODES消息携带的字段send_single_mode()L86-L142custom_modePX4 的px4_custom_mode位域编码get_px4_custom_mode(nav_state)供传统SET_MODE使用standard_mode由mode_util::getStandardModeFromNavState()计算若该导航状态无法对应标准模式则为MAV_STANDARD_MODE_NON_STANDARDmode_name非标准模式的名字来源——内部模式取自mode_util::nav_state_names[]静态表外部模式External modes来自register_ext_component_reply主题即可由 ROS 2 组件动态注册的模式名properties包含MAV_MODE_PROPERTY_ADVANCED高级模式由mode_util::isAdvanced()判定与MAV_MODE_PROPERTY_NOT_USER_SELECTABLE不可由用户选择当vehicle_status.can_set_nav_states_mask中该导航状态未置位时设置。低速链路的保护全部模式逐一发送时按链路速率计算每帧之间的延迟且以MAX_DELAY_US 2500000 / NAVIGATION_STATE_MAX注释说明为所有可能模式预留最多 2.5 秒避免地面站 ACK 超时为上限L62-L65。模式集合变化通知update_data()L200-L255持续监视register_ext_component_reply、valid_nav_states_mask与can_set_nav_states_mask三类动态变化一旦变化就递增seq随后send()发出带有序列号的AVAILABLE_MODES_MONITOR消息地面站收到后应重新请求全部AVAILABLE_MODES。这正是协议中模式集合变化通知的实现。这一机制是 PX4 将ROS 2 外部模式纳入标准模式协议的入口通过 PX4 ROS 2 控制接口 注册的外部模式会出现在AVAILABLE_MODES列表中并带有注册时的模式名若某外部模式尚未注册不可选择列表中会以(Mode not available)占位。查询当前模式CURRENT_MODE消息流当前模式的周期性上报由 src/modules/mavlink/streams/CURRENT_MODE.hpp 实现mavlink_current_mode_t current_mode{}; current_mode.custom_mode get_px4_custom_mode(vehicle_status.nav_state_display).data; current_mode.intended_custom_mode get_px4_custom_mode(vehicle_status.nav_state_user_intention).data; current_mode.standard_mode (uint8_t) mode_util::getStandardModeFromNavState(vehicle_status.nav_state_display, vehicle_status.vehicle_type, vehicle_status.is_vtol);值得注意的三个字段语义custom_mode基于nav_state_display当前实际导航状态intended_custom_mode基于nav_state_user_intention用户意图模式用于区分期望进入与实际处于的模式standard_mode通过同一套mode_util::getStandardModeFromNavState()映射若当前为 PX4 私有模式则上报NON_STANDARD。从 src/modules/mavlink/mavlink_main.cpp 中各通道流注册表可以确认默认发送频率AVAILABLE_MODES约 0.3 HzCURRENT_MODE约 0.5 Hz。其他可切换模式的 MAVLink 命令除标准模式协议外一些标准模式与自定义模式还可通过更早的传统命令设置尤其在消息允许附带额外参数时更为便利。PX4 支持下列模式切换命令部分仅限特定飞行器类型命令对应模式MAV_CMD_NAV_TAKEOFFTakeoff 模式MAV_CMD_NAV_RETURN_TO_LAUNCHReturn 模式MAV_CMD_NAV_LANDLand 模式MAV_CMD_DO_FOLLOWMC Follow 模式MAV_CMD_DO_FOLLOW_REPOSITION从新位置发起的 Follow 模式MAV_CMD_DO_ORBITMC Orbit 模式MAV_CMD_NAV_VTOL_TAKEOFFVTOL 专用起飞模式MAV_CMD_DO_REPOSITION重定位MAV_CMD_DO_PAUSE_CONTINUE将飞行器置入 Hold/Loiter 以暂停任务MAV_CMD_MISSION_START启动任务文档特别提示了一个容易踩坑的语义差异这些命令早于标准模式协议出现映射到的是飞行器类型特定的自定义模式而非标准模式。也就是说即使某个标准模式对多类飞行器通用传统命令也可能只对特定飞行器生效。原文给出的例子Orbit 标准模式在 MC 上映射为 Orbit 模式、在 FW 上映射为 Hold/Loiter但截至文档撰写时MAV_CMD_DO_ORBIT只会在 MC 上启动 Orbit 模式在 FW 上会被忽略。小结PX4 v1.15 引入的标准模式协议让地面站/外部系统能够以飞行栈无关的方式完成发现 → 查询 → 切换飞行模式的闭环MAV_CMD_REQUEST_MESSAGEAVAILABLE_MODES完成模式发现含 ROS 2 外部模式CURRENT_MODE周期上报当前模式标准 自定义双视图MAV_CMD_DO_SET_STANDARD_MODE完成标准模式切换AVAILABLE_MODES_MONITOR保证模式集合变化时的同步。实现侧的核心只有三处映射函数 src/lib/modes/standard_modes.hpp、命令分发 src/modules/commander/Commander.cpp、消息流 src/modules/mavlink/streams/AVAILABLE_MODES.hpp 与 src/modules/mavlink/streams/CURRENT_MODE.hpp。需要注意的前提限制MAV_CMD_DO_SET_MODE尚不支持、VTOL 对POSITION_HOLD/CRUISE/ORBIT标准模式的支持未实现且具体支持情况以当前版本固件与地面站QGroundControl Daily 构建的实际联调为准。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐OptScale 监控和警报设置实时追踪云成本异常和优化机会 OptScale 监控和警报设置实时追踪云成本异常和优化机会 OptScale 是一款强大的开源 FinOps 和云成本优化工具它不仅能帮助您节省云成后端运维PX4-Autopilot通信协议解析MAVLink消息格式与应用开发终极指南PX4 Autopilot通信协议解析MAVLink消息格式与应用开发终极指南 MAVLink通信协议是PX4 Autopilot自动驾驶系统中最核心的数据交嵌入式物联网机器人自动驾驶智能硬件PX4 飞行模式开发指南内部模式、外部ROS 2模式与模式约束机制详解PX4 飞行模式开发指南内部模式、外部ROS 2模式与模式约束机制详解 飞行模式Flight Mode是 PX4 自动驾驶仪的核心概念——它定义了自动嵌入式物联网机器人自动驾驶智能硬件上一篇WebVOWL基于Web的OWL本体可视化终极指南 下一篇gh_mirrors/vi/vivado-library完全解析FPGA开发者必备的IP核与模块资源库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表