3、模式切换机制:RC遥控器、地面站、任务脚本触发模式切换的原理与配置

PX4飞控的模式切换是安全策略中最核心的交互入口。无论是操作员通过RC遥控器手动切换、地面站发送指令,还是任务脚本按预设逻辑自动切换,其底层都遵循“指令来源→通信链路→模式管理模块→执行器输出”的统一路径。理解这一机制,不仅有助于正确配置参数,更能在失控或紧急情况下快速判断“为什么模式没切过去”或“为什么模式被意外切换”。本章将从原理、配置、实战与误区四个维度展开。

指令来源层 通信与解析层 执行与反馈层 RC遥控器 RC_CHANNELS / AUX通道 PWM / SBUS / CRSF 地面站 (QGC) MAVLink 指令 MAV_CMD_DO_SET_MODE 任务脚本 / 机载逻辑 Offboard / 任务指令 MAVLink / uORB Commander 模块 模式仲裁 / 状态机 Navigator / 任务管理器 航点任务 / 自动模式 MC/FC 姿态控制器 内环 / 外环控制 混控器 / 执行器 PWM / DShot / CAN 状态反馈 vehicle_status / uORB 安全保护逻辑 RC失联 / 电池 / 地理围栏 模式切换本质:Commander 根据指令源优先级与安全条件,更新 vehicle_status.nav_state RC 通道映射 → RC_MAP_MODE_SW / RC_MAP_LOITER_SW / RC_MAP_ACRO_SW

上图展示了PX4模式切换的完整链路。三个主要指令源(RC遥控器、地面站、任务脚本)通过不同通信协议进入飞控,经过Commander模块仲裁后,最终改变飞行模式并驱动执行器。值得注意的是,Commander模块是唯一的模式状态机管理者,所有来源的切换请求都必须经过它的合法性校验,包括当前飞行阶段、是否已解锁、是否满足最小高度等安全条件。

3.1 核心原理:Commander状态机与模式仲裁

PX4的Commander模块(src/modules/commander)维护一个全局状态机,核心数据结构为vehicle_status_s中的nav_state字段。该字段定义了当前飞行模式(如手动、定高、位置、任务、返航等)。任何模式切换请求,最终都会调用commander_set_mode()函数,该函数内部执行一系列安全检查:

  • 解锁状态检查:若飞行器未解锁(arming_state不为ARMED),则只能切换至地面待机模式(MANUAL或STABILIZED),不允许直接进入自动任务模式。
  • 模式合法性检查:例如,在固定翼飞行中切换到“垂直起降”模式,若当前空速过低,则拒绝切换并返回错误码。
  • 优先级仲裁:RC遥控器通道映射的开关具有最高优先级,其次是地面站MAVLink指令,最后是任务脚本。但存在例外——当RC失联(RC_LOSS)且设置了失控保护时,失控保护逻辑会强制覆盖所有指令源。

从代码层面看,模式切换的入口函数为commander_handle_command(),它接收来自不同来源的vehicle_command_s消息。每条消息包含command字段(如MAV_CMD_DO_SET_MODE)、param1(自定义模式)、param2(基础模式)等参数。Commander解析后,与当前状态进行比对,决定是否执行切换。

关键代码路径(简化):

// 来自RC通道的切换请求
if (rc_channels.channels[RC_MAP_MODE_SW] > 0.9f) {
    new_mode = vehicle_status_s::NAV_STATE_AUTO_MISSION;
} else if (rc_channels.channels[RC_MAP_MODE_SW] < -0.9f) {
    new_mode = vehicle_status_s::NAV_STATE_POSCTL;
}
// 来自MAVLink的切换请求
if (cmd.command == MAV_CMD_DO_SET_MODE) {
    new_mode = (uint8_t)cmd.param2;
}
// 最终统一调用
commander_set_mode(new_mode, source);

3.2 三种触发方式的配置与操作流程

3.2.1 RC遥控器触发

RC遥控器是最常用、最可靠的模式切换方式。PX4通过参数RC_MAP_MODE_SW指定一个AUX通道作为模式切换开关。典型配置流程如下:

  1. 硬件连接:将遥控器上的三段开关接入接收机的AUX1~AUX6通道(通常使用AUX1或AUX2)。
  2. 参数设置:在QGroundControl中设置RC_MAP_MODE_SW为对应的AUX通道号(如2表示AUX2)。同时设置RC_MAP_LOITER_SW(定高/悬停开关)和RC_MAP_ACRO_SW(特技开关)。
  3. 通道校准:在遥控器校准页面,确保三段开关在三个位置分别输出-1、0、+1(对应PWM 1000、1500、2000)。
  4. 模式映射:在QGC的“飞行模式”设置界面,将开关的三个位置分别映射为“手动/自稳”、“定高”、“任务”等模式。

RC切换的响应时间通常在20~50ms内,因为信号直接通过uORB消息rc_channels传递,无需经过MAVLink封装。但需要注意,RC切换的优先级低于失控保护。例如,当RC信号丢失时,即使开关位置在“任务”档,飞控也会按COM_RC_LOSS_ACT参数执行返航或降落。

3.2.2 地面站触发

地面站(QGroundControl)通过MAVLink协议发送MAV_CMD_DO_SET_MODE指令。该指令包含两个关键参数:

  • param1:自定义模式(如PX4_CUSTOM_MAIN_MODE_AUTO)
  • param2:子模式(如PX4_CUSTOM_SUB_MODE_AUTO_MISSION)

地面站切换的典型场景是:操作员在电脑前观察航拍画面,发现任务航线偏离,立即点击“暂停任务”按钮,此时QGC发送MAV_CMD_DO_SET_MODE将模式切换为POSCTL(位置控制)。该方式的优点是可视化、可精确指定模式,但缺点是依赖数传链路稳定性。若数传延迟超过500ms,切换指令可能超时,因此PX4设置了COM_MAV_SYS_ID和COM_MAV_PROTO_VER参数来确保链路兼容性。

经验提醒:地面站切换模式时,务必确认数传信号强度(RSSI)大于30%。在强电磁干扰环境下(如高压线附近),建议优先使用RC切换,因为2.4G RC链路通常比433MHz数传更抗干扰。

3.2.3 任务脚本触发

任务脚本(Offboard模式或任务指令)是自动化飞行的核心。PX4支持两种脚本触发方式:

  • 航点任务中的自动切换:在QGC中规划任务时,可在航点之间插入“模式切换”动作(如从AUTO_MISSION切换到AUTO_RTL)。这通过MAVLink的MAV_CMD_DO_SET_MODE嵌入任务队列实现。
  • Offboard模式:外部机载计算机(如树莓派)通过MAVLink持续发送SET_POSITION_TARGET_LOCAL_NED消息,同时将模式切换为OFFBOARD。此模式要求飞控持续收到指令,若超过COM_OF_LOSS_T(默认1秒)未收到新指令,将触发失控保护。

任务脚本切换的配置重点在于NAV_ACC_RAD(航点到达半径)和MIS_YAW_ERR(偏航角误差阈值)。若设置过小,飞行器可能因达不到精度而无法触发下一个模式切换指令,导致任务卡死。

3.3 案例拆解:RC失联后模式切换的完整链路

背景与约束:某植保无人机在农田执行任务,飞行高度30m,距离起飞点200m。RC遥控器使用2.4G频段,数传使用433MHz。操作员站在田埂边,遥控器天线朝向飞行器。

初始现象:飞行器突然从AUTO_MISSION模式切换为AUTO_RTL(自动返航),但操作员并未拨动任何开关。

关键数据:日志显示vehicle_status.nav_state在T+10.2秒从4(AUTO_MISSION)变为6(AUTO_RTL)。同时rc_channels.rc_lost标志位在T+9.8秒置为true。

分析判断:

  1. RC失联标志触发,说明2.4G链路中断。可能原因:遥控器电池电量不足导致发射功率下降,或飞行器背对操作员导致天线遮挡。
  2. 由于COM_RC_LOSS_ACT参数设置为1(返航),Commander在检测到RC失联后,自动将模式切换为AUTO_RTL。
  3. 数传链路正常,因此地面站仍能收到飞行器状态,但无法干预模式切换(因为RC失联保护优先级更高)。

实际操作步骤:

  • 操作员立即检查遥控器电量,发现电量仅剩15%,更换电池后重新对频。
  • 飞行器在返航途中,因风速超过COM_WIND_MAX(默认10m/s),触发“返航风大”警告,但未改变模式。
  • 飞行器成功降落至起飞点,nav_state切换为MANUAL(手动),等待操作员接管。

结果对比:若COM_RC_LOSS_ACT设置为0(保持当前模式),飞行器将继续执行任务直至电池耗尽,可能导致坠机。本次事件中,返航保护挽救了飞行器。

复盘经验:

  • 每次起飞前检查RC信号强度(QGC的RC RSSI显示),低于60%时禁止飞行。
  • 设置COM_RC_LOSS_ACT为1(返航)比2(降落)更安全,因为返航可以避开障碍物。
  • 在任务脚本中增加“RC失联后自动返航”的冗余逻辑,防止参数配置错误。

3.4 常见误区与总结复盘

误区 后果 正确做法
将RC_MAP_MODE_SW设置为0(禁用) 无法通过RC切换模式,只能依赖地面站 至少映射一个三段开关,并设置RC_MAP_MODE_SW为对应通道
地面站切换模式时未检查数传延迟 指令超时,模式未切换,飞行器继续原模式 使用MAV_CMD_ACK确认指令已执行,或改用RC切换
任务脚本中频繁切换模式 Commander状态机抖动,可能导致控制中断 模式切换间隔至少2秒,且避免在转弯点切换
忽略COM_RC_LOSS_ACT与NAV_RCL_ACT的区别 RC失联后行为不符合预期 前者控制RC失联行为,后者控制RC失联后任务行为,需同时配置

总结复盘:模式切换机制的核心是理解Commander的仲裁逻辑。RC遥控器提供最高优先级的人工干预,地面站适合地面监控与调试,任务脚本实现自动化。在实际工程中,建议采用“RC为主、地面站为辅、脚本兜底”的混合策略。每次飞行前,务必在地面站“飞行模式”页面验证所有开关位置对应的模式是否正确,并检查vehicle_status日志中的模式切换时间戳,确保无异常跳变。

风险提示:切勿在飞行中同时使用多个指令源频繁切换模式。例如,操作员一边拨动RC开关,一边点击地面站按钮,可能导致Commander收到冲突指令。PX4的仲裁机制会拒绝后到的指令,但可能造成短暂的模式抖动。建议在团队作业中明确分工:一人负责RC,一人负责地面站,且通过通话确认操作顺序。