INAV 飞行中 OSD 菜单(In-Flight OSD Menu)完全指南:空中实时调参与安全机制

发布时间:2026/10/4 11:58:40
INAV 飞行中 OSD 菜单(In-Flight OSD Menu)完全指南:空中实时调参与安全机制
无人机嵌入式智能硬件【免费下载链接】inavINAV: Navigation-enabled flight control software项目地址https://gitcode.com/gh_mirrors/in/inav点击查看免费下载导读INAV 的In-Flight OSD Menu飞行中 OSD 菜单允许飞行员在飞机处于空中、导航模式接管自主飞行时直接通过 OSD 屏幕调整飞行参数无需降落断电即可完成 PID 调整、速率修改、VTX 功率/频道切换、电池阈值修正等常见调参工作。本文基于仓库中的官方文档 docs/In-Flight OSD Menu.md并深入src/main/cms/cms.c、src/main/io/osd.c等核心源码完整讲解该功能的配置步骤、打开/关闭流程、安全自动关闭机制与底层实现原理帮助你在保住飞行安全的前提下掌握空中调参的完整实战方案。警告飞行中修改参数本身存在固有风险。仅在稳定巡航/悬停阶段、拥有充足高度和空域时进行调整。对 PID 或速率的修改可能立即影响飞行行为。功能概述In-Flight OSD Menu 的核心思路是通过 Configurator 给一个专门的IN FLIGHT MENU飞行模式Flight Mode分配一个 RC 开关。当飞机处于武装Armed状态且已进入某个导航模式Position Hold、Cruise、Loiter 等时将该开关激活并保持 3 秒OSD 菜单即会打开此时摇杆输入从飞行控制切换为菜单导航。这一机制把原本必须在地面完成的调参流程搬到了空中显著提升了调参效率——尤其对于需要反复飞行验证的 PID、速率等参数飞行员可以边飞边调、落地保存。使用前提Requirements要打开飞行中 OSD 菜单必须同时满足以下四个条件缺一不可条件说明飞机必须已武装Armed未武装时无法通过此方式打开菜单必须处于激活的导航模式如 POSHOLDPosition Hold、NAV WP航点、RTH返航等不允许处于 Failsafe 状态Failsafe 激活时菜单无法打开IN FLIGHT MENU 模式开关必须已分配并保持激活由 Configurator 中分配的 AUX 通道开关控制关键行为如果菜单打开期间上述任一条件丢失菜单会立即自动关闭并马上恢复完整的摇杆控制权。配置步骤1. 在 Configurator 中分配 IN FLIGHT MENU 模式打开 INAV Configurator进入Modes模式选项卡。在OSD Modes分区中找到IN FLIGHT MENU。将其分配到一个专用的latching自锁式/两位开关上通常挂在某个 AUX 通道。重要必须使用自锁式开关。菜单只有在开关保持激活位置时才会保持打开将开关拨回关闭位置会立即关闭菜单并恢复全部摇杆控制。从源码可以看到这个模式在固件中被定义为独立的模式盒模式 IDBOXINFLIGHTMENU 62见 src/main/fc/rc_modes.h模式名称与永久 IDIN FLIGHT MENUpermanentId 71见 src/main/fc/fc_msp_box.c这意味着该模式会通过 MSP 正常暴露给 Configurator与其它模式开关的分配方式完全一致。2. 配置并激活一个导航模式至少需要配置并激活一个导航模式如 POSHOLD、NAV WP、RTH 等飞行中菜单才能打开。具体到当前仓库源码打开菜单时的导航模式校验逻辑位于 src/main/cms/cms.c 的cmsIsNavModeActive()static bool cmsIsNavModeActive(void) { return FLIGHT_MODE(NAV_POSHOLD_MODE) || FLIGHT_MODE(NAV_RTH_MODE) || FLIGHT_MODE(NAV_WP_MODE) || FLIGHT_MODE(NAV_ALTHOLD_MODE); }即当前固件中实际校验的模式位为NAV POSHOLD位置保持、NAV RTH返航、NAV WP航点、NAV ALTHOLD高度保持。值得注意官方文档列举的模式中包含NAV CRUISE巡航但源码中cmsIsNavModeActive()并未检查NAV_COURSE_HOLD_MODE。因此在具体机型和固件版本上巡航模式是否满足打开条件建议以实际固件行为为准——最稳妥的做法是在飞行中保持上述四个模式之一处于激活状态。3. 开关硬件要求latching switch再次强调必须使用两位自锁开关。自锁开关在拨到激活位置后保持该状态这与打开菜单所需的持续保持 3 秒条件直接相关。如果使用瞬时开关如按钮飞行中松开后条件立即丢失菜单会随之自动关闭。打开菜单飞到一个稳定的巡航高度并确保导航模式处于激活状态。将IN FLIGHT MENU开关拨到激活位置。OSD 上会显示MENU IN X.X倒计时提示等待菜单打开。3 秒后菜单出现在 OSD 上。注意3 秒保持延迟是刻意设计的——用于防止短暂的开关误触导致菜单意外激活。从源码角度这段 3 秒倒计时由cmsOpenCountdownStartTime状态变量驱动src/main/cms/cms.celse if (IS_RC_MODE_ACTIVE(BOXINFLIGHTMENU) ARMING_FLAG(ARMED) cmsIsNavModeActive() !FLIGHT_MODE(FAILSAFE_MODE)) { if (!cmsMenuSwitchLatched) { if (cmsOpenCountdownStartTime 0) { cmsOpenCountdownStartTime millis(); } else if (millis() - cmsOpenCountdownStartTime 3000) { cmsMenuOpen(); cmsOpenCountdownStartTime 0; rcDelayMs BUTTON_PAUSE; } } }注意这里的三个关键判断与文档使用前提一一对应开关激活 已武装 导航模式激活 无 Failsafe。缺少任一条件时else分支cmsOpenCountdownStartTime会被清零倒计时不会累积菜单自然无法打开。菜单打开时固件根据是否处于飞行中武装状态选择不同的主菜单入口src/main/cms/cms.c飞行中打开cmsOpenedInFlight ARMING_FLAG(ARMED)为真进入专用主菜单menuMainInFlight且保持伺服/电机输出正常工作——因为此时导航模式仍在接管飞行控制地面打开常规 CMS进入menuMain同时禁用伺服输出并置位ARMING_DISABLED_CMS_MENU禁飞标志防止地面调参时伺服乱动。这一区别从根源上保证了飞行中菜单打开时飞行控制不会被中断。关闭菜单菜单可以通过以下几种方式关闭方式说明将开关拨回关闭位置把IN FLIGHT MENU开关拨回非激活位置——立即关闭选择 EXIT在主菜单中导航到 EXIT 条目15 秒无操作超时无任何输入时菜单在 15 秒后自动关闭安全自动关闭任一安全条件丢失时自动关闭见下文15 秒无操作超时在源码中体现为src/main/cms/cms.cif (cmsOpenedInFlight (currentTimeMs - cmsLastInputMs 15000)) { cmsMenuExit(pCurrentDisplay, (void *)CMS_EXIT); return; }cmsLastInputMs在每次摇杆/按键输入时刷新任何按键都会重新计时。安全自动关闭机制触发条件一览菜单打开期间只要检测到以下任一情况菜单都会立即关闭并恢复全部摇杆控制权src/main/cms/cms.cIN FLIGHT MENU开关被拨回关闭位置飞行员主动退出飞机解除武装disarm触发 Failsafe飞行员必须恢复态势感知激活中的导航模式丢失否则摇杆被菜单占用时飞机会失去稳定检测到恐慌性摇杆动作见下节if (cmsOpenedInFlight (!IS_RC_MODE_ACTIVE(BOXINFLIGHTMENU) || !ARMING_FLAG(ARMED) || FLIGHT_MODE(FAILSAFE_MODE) || !cmsIsNavModeActive() || cmsDetectPanicStickMovement(currentTimeMs))) { cmsMenuExit(pCurrentDisplay, (void *)CMS_EXIT); return; }这一整组条件同时承担打开门槛与强制退出双重职责保证菜单的生命周期始终被安全约束住。恐慌摇杆检测Panic Stick Movement原理这是该功能中最精巧的安全设计之一。实现位于 src/main/cms/cms.c 的cmsDetectPanicStickMovement()检测逻辑Roll 和 Pitch 同时偏离中心超过 100 PWM且持续约 150 ms以 50 ms 间隔采样 3 个连续样本采样频率约 20 HzcurrentTimeMs - cmsPanicLastCheckMs 50时直接返回触发阈值PANIC_DUAL_AXIS_THRESHOLD 100即ABS(rxGetChannelValue(ROLL) - 1500) 100 ABS(rxGetChannelValue(PITCH) - 1500) 100连续 3 次满足cmsPanicDualAxisCount 3即判定为恐慌动作立即关闭菜单。这一设计的出发点在于正常的 CMS 菜单导航是严格单轴的——Pitch 仅用于滚动菜单项此时 Roll 保持中心附近最大约 65 PWM 的串扰Roll 仅用于修改数值Pitch 保持中心附近摇杆释放后的弹簧回中也是单轴的。而处于恐慌状态的飞行员本能地紧抓摇杆并猛烈乱动总会同时偏转 Roll 与 Pitch 两个轴且力度很大。因此双轴同时大幅偏转 持续 150 ms这个条件可以在真实导航数据上做到零误报同时在大约 200 ms 内捕捉到几乎所有恐慌模式——这正是文档中能检测到飞行员本能抓杆又不会对正常的单轴菜单导航输入误触发的底层原因。另外源码注释还指出检测状态变量cmsPanicDualAxisCount、cmsPanicLastCheckMs会在每次菜单打开时清零src/main/cms/cms.c避免上一次的部分检测结果残留到下一次会话中造成误关。重要行为说明飞行中的修改仅存于 RAM飞行中所有的调整都不会保存到 EEPROM仅应用于 RAM。要让修改永久生效必须降落、解除武装然后从地面 CMS 的主菜单中执行保存。从源码看退出逻辑中明确区分了两种打开途径src/main/cms/cms.c地面打开的菜单退出时会处理SAVEREBOOT、清除ARMING_DISABLED_CMS_MENU禁飞标志走完整的保存/重启流程飞行中打开的菜单退出时不执行任何保存动作仅做一件事——将cmsMenuSwitchLatched锁存为当前开关状态防止开关仍处于 ON 时菜单立即重新打开src/main/cms/cms.c。因此飞行中调整的 PID、速率等参数在本次飞行中生效落地后必须在 CMS 中显式保存否则重新上电后修改将丢失。电池阈值实时生效按官方文档说明电池电压阈值类参数在飞行中修改后会实时生效OSD 的低压警告会立即反映新阈值无需重启。这使得飞行员可以在巡航阶段根据实际电压表现直接修正告警阈值避免误报或漏报。OSD 状态消息菜单打开倒计时开关保持激活但菜单尚未打开时OSD 显示倒计时提示MENU IN 3.0 MENU IN 2.9 ... MENU IN 0.1 MENU IN 0.0OSD 侧的消息生成位于 src/main/io/osd.c通过独立的cmsMenuBuf缓冲区分帧格式化避免与 RTH、WP 等导航状态消息抢占messageBufuint32_t menuCountdownMs cmsGetOpenCountdownRemaining(); if (menuCountdownMs 0) { static char cmsMenuBuf[16]; unsigned sec menuCountdownMs / 1000; unsigned dec (menuCountdownMs % 1000) / 100; tfp_sprintf(cmsMenuBuf, MENU IN %u.%u, sec, dec); ADD_MSG(cmsMenuBuf); }剩余时间由 src/main/cms/cms.c 的cmsGetOpenCountdownRemaining()提供在倒计时启动后以 0.1 秒粒度递减归零后不再显示。OSD 侧会将其与当前 NAV 状态消息一起通过 OSD 消息轮转机制显示。导航模式缺失提示如果开关保持激活但当前没有激活导航模式OSD 会显示USE NAV MODES FOR MENU该字符串定义于 src/main/io/osd.hOSD_MSG_MENU_NAV_REQ触发条件为开关激活、未在菜单中、且开关尚未锁存src/main/io/osd.c——即开关拨了但条件不满足、菜单也没开起来的状态。超时关闭倒计时当飞行中菜单处于打开状态、距离 15 秒超时只剩不到 10 秒时即最后一次输入距今超过 5 秒OSD 底行会显示CLOSING IN N倒计时src/main/cms/cms.cCLOSING IN 9 CLOSING IN 8 ... CLOSING IN 1这个可视化倒计时会随着每次摇杆输入自动取消帮助飞行员直观掌握剩余的操作时间窗口。源码级实现解析状态机与关键路径模式盒定义与 MSP 编号飞行中菜单完全复用了 CMSConfiguration Menu System框架通过BOXINFLIGHTMENU模式盒作为入口。模式盒定义在 src/main/fc/rc_modes.hMSP 名称与永久 ID71在 src/main/fc/fc_msp_box.c。cmsOpenedInFlight标志src/main/cms/cms.c是区分飞行中打开与地面打开的唯一依据贯穿打开、绘制、退出全流程。开关锁存与防重开退出飞行中菜单时固件会将cmsMenuSwitchLatched置为当前开关状态src/main/cms/cms.c。若开关仍处于 ON菜单不会立即重开只有先拨回 OFF、再拨回 ON 才会触发新的倒计时。OSD 消息逻辑也会依据该标志抑制多余提示src/main/io/osd.c。菜单导航的按键阈值进入菜单后摇杆被解释为方向键。按键判定基于通道值阈值宏src/main/cms/cms.c#define IS_HI(X) (rxGetChannelValue(X) 1750) #define IS_LO(X) (rxGetChannelValue(X) 1250) #define IS_MID(X) (rxGetChannelValue(X) 1250 rxGetChannelValue(X) 1750)即中心区为 1250~1750超出 ±250 PWM 视为有效拨杆按键去抖间隔BUTTON_TIME 250 ms、切换停顿BUTTON_PAUSE 500 ms。这与恐慌检测的 100 PWM 阈值形成明显区分——菜单导航所需的拨杆量远大于 100 PWM因此正常导航不会误触发恐慌检测。SAVE/EXIT 子菜单飞行中菜单同样提供保存/退出子菜单其条目定义于 src/main/cms/cms_menu_saveexit.c-- SAVE/EXIT -- EXIT - 直接退出不保存 SAVEEXIT - 保存并退出 SAVEREBOOT - 保存并重启仅地面可用 BACK - 返回上级菜单结合前述退出逻辑可知飞行中即使选择 SAVE 类条目也不会真正写入 EEPROM——这一设计是刻意的安全策略避免空中保存导致参数持久化异常。实战建议与注意事项养成落地再保存的习惯飞行中的所有修改仅存 RAM。落地后务必进入 CMS 主菜单执行SAVEEXIT或通过 CLIsave否则掉电即丢。开关要选自锁式瞬时开关无法满足保持 3 秒的打开条件也不符合拨回即关的安全设计。进入菜单前先建立稳定状态在巡航/悬停、高度和空域充足时再拨开关菜单打开期间尽量避免大幅机动。注意导航模式的固件差异当前源码只校验 POSHOLD / RTH / WP / ALTHOLD 四种模式位src/main/cms/cms.c是否支持巡航模式请以实际固件版本为准。超时是保险不是常态15 秒无操作自动关闭是兜底机制飞行中调参应有节奏地操作避免长时间停留在菜单里分散注意力。恐慌检测是最后防线若飞行中误操作导致菜单占用摇杆用力同时掰动 Roll 和 Pitch 超过 100 PWM 并保持约 150 ms菜单会立即让出控制权——这是紧急情况下恢复操作的最快途径。通过本文的配置指引与源码解读你可以在保障安全的前提下将 INAV 的飞行中 OSD 菜单用于 PID 精调、速率与 VTX 快速切换等高频调参场景显著提升调试效率与飞行验证的迭代速度。赞分享无人机嵌入式智能硬件【免费下载链接】inavINAV: Navigation-enabled flight control software项目地址https://gitcode.com/gh_mirrors/in/inav点击查看免费下载相关推荐INAV 飞行中参数调整In-flight Adjustments完全指南用 AUX 通道在飞行中实时调参INAV 飞行中参数调整In flight Adjustments完全指南用 AUX 通道在飞行中实时调参 INAV 飞控支持在飞行过程中通过遥控器上的无人机嵌入式智能硬件INAV On Screen DisplayOSD完全指南OSD 系统选型、169 个屏显元素、Pilot 标志与飞行后统计INAV On Screen DisplayOSD完全指南OSD 系统选型、169 个屏显元素、Pilot 标志与飞行后统计 INAVNavigatio无人机嵌入式智能硬件INAV OSD Joystick 模拟指南用 PINIO PWM 驱动 5 键相机 OSD 控制INAV OSD Joystick 模拟指南用 PINIO PWM 驱动 5 键相机 OSD 控制 导读 本文讲解 INAV 如何利用 PINIO 通道的 P无人机嵌入式智能硬件上一篇Gitcoin社区治理完全指南如何参与Quadratic Lands投票决策下一篇网易云音乐歌词提取终极教程5分钟掌握完整使用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考