飞行模式基础概念:PX4/ArduPilot常见飞行模式与切换底层逻辑

各位同学,欢迎来到第三章。前面我们聊了MAVLink协议怎么跟飞控对话,但真正干活的时候,你总得告诉飞机「你现在该干嘛」——这就是飞行模式要解决的问题。

说白了,飞行模式就是一套预设好的行为逻辑。你切换一个模式,相当于告诉飞控:「接下来按这套规则来接管控制权」。我最早接触这个的时候,总觉得模式就是几个名字,后来自己调参炸过几次机,才真正理解每个模式背后那套逻辑有多重要。

核心认知:飞行模式 = 控制律 + 传感器融合 + 用户输入映射 的三合一封装。切换模式,本质上是切换这三者的组合方式。

3.1 PX4 常见飞行模式

PX4的模式设计偏「功能模块化」。它把控制权拆成几个层级:位置控制、速度控制、姿态控制。你选什么模式,就决定了用户遥控器能控制到哪个层级。

模式名称 控制层级 典型用途 我踩过的坑
Manual / Stabilized 姿态控制 手动飞行、飞手训练 新手容易误以为它「稳」,其实只是帮你把飞机姿态回中
Altitude Control 高度 + 姿态 定高悬停、航拍 气压计受气流影响大,室内慎用
Position Control 位置 + 高度 + 姿态 定点悬停、精细操控 GPS信号差时自动降级为AltCtrl
Auto / Mission 全自动航点 航线飞行、测绘 航点转弯半径没设好,飞机容易冲出航线
RTL (Return to Launch) 自动返航 紧急情况、低电量 返航高度设太低,撞楼的事故我见过好几次
Offboard 外部指令控制 机载计算机控制、视觉追踪 心跳超时3秒自动切回降落模式,别问我怎么知道的

我的习惯:每次飞新飞机,我都会先在Stabilized模式下确认遥控器映射正确,再切到Position模式。别一上来就Auto,地面站上看数据没问题,上天就不一定了。

3.2 ArduPilot 常见飞行模式

ArduPilot的模式命名跟PX4不太一样,但底层逻辑是相通的。它更强调「用户控制权」和「自动化的混合程度」。我个人觉得ArduPilot的模式切换逻辑更灵活,但配置起来也更绕。

模式名称 控制层级 典型用途 避坑指南
Stabilize 姿态控制 手动飞行、特技 松杆不会悬停,会漂移
AltHold 高度 + 姿态 定高悬停 油门中位需要校准,否则上下窜
Loiter 位置 + 高度 + 姿态 定点悬停、航拍 GPS精度差时Loiter会画圈
Auto 全自动航点 航线飞行、测绘 航点间速度参数要单独设
RTL 自动返航 紧急情况、低电量 返航路径不避障,小心高压线
Guided 外部指令控制 机载计算机控制、一键起飞 Guided模式下遥控器还能接管,别慌

重要提醒:ArduPilot的Stabilize模式跟PX4的Stabilized不是一回事。ArduPilot的Stabilize是纯姿态增稳,没有高度保持;PX4的Stabilized是带自稳的。跨平台切换时一定要重新熟悉手感。

3.3 模式切换的底层逻辑

好了,模式名字你记住了,但切换的时候飞控内部到底发生了什么?这才是今天最核心的部分。

我画了一张图,把模式切换的完整链路拆开给你看。

飞行模式切换底层逻辑流程图 用户切换指令 RC通道 / MAVLink COMMAND 模式管理器 (NavCmd) 安全检查 (Arm/Pre-arm) 控制律模块切换 (MC/FC) 混控器 → 电机/舵机 关键点:安全检查不通过 → 模式切换被拒绝 → 保持当前模式

你看,整个链路其实就五步:

  1. 用户触发切换——通过遥控器拨杆或者地面站发MAVLink指令。
  2. 指令进入模式管理器——飞控的NavCmd模块会解析你要切到什么模式。
  3. 安全检查——这是最容易忽略的一步。飞控会检查当前状态:飞机解锁了吗?GPS信号够吗?高度数据有效吗?任何一项不满足,切换就会被拒绝。
  4. 控制律切换——安全检查通过后,飞控才会把控制权交给对应模式的控制律。比如从Stabilize切到Loiter,控制律就从「姿态增稳」切换到「位置保持」。
  5. 混控输出——新的控制律计算出电机/舵机指令,飞机开始按新模式飞行。

我曾经遇到过一个案例:有个学员在Loiter模式下切RTL,飞机没反应。排查了半天,发现是RTL的返航高度参数设了200米,但飞机当前高度只有10米,安全检查认为「爬升高度过大」直接拒绝了切换。嗯,参数校验这块,飞控比你想象的严格。

3.4 PX4 vs ArduPilot 模式切换差异

两个固件在模式切换上有个本质区别,我直接给你列个表对比:

对比维度 PX4 ArduPilot
切换触发方式 RC通道映射 + MAVLink指令 RC通道映射 + MAVLink指令 + 辅助开关
安全检查粒度 按模式独立配置(如:Loiter要求GPS) 全局检查 + 模式特定检查
切换失败处理 保持当前模式,输出错误码 保持当前模式,蜂鸣器报警
模式数量上限 最多6个模式(通过RC通道) 最多10个模式(通过RC通道)
我个人的偏好 逻辑清晰,适合研发调试 灵活度高,适合复杂任务

一个小技巧:调试阶段,我习惯把PX4的COM_FLIGHT_EVENTS参数打开,这样每次模式切换失败,地面站都会收到明确的错误文本。ArduPilot的话,看STATUSTEXT消息就行。

3.5 模式切换的MAVLink报文

最后,我们看看实际在MAVLink层面,模式切换长什么样。你想想看,当你在地面站点了一下「Loiter」按钮,背后其实只发了一条指令:

// 发送模式切换指令(MAVLink 2 格式)
mavlink_message_t msg;
mavlink_command_long_t cmd = {0};

cmd.target_system    = 1;      // 目标飞控ID
cmd.target_component = 1;      // 目标组件ID
cmd.command          = MAV_CMD_DO_SET_MODE;  // 指令ID
cmd.param1           = 1;      // 基础模式:MAV_MODE_FLAG_CUSTOM_MODE_ENABLED
cmd.param2           = 4;      // 自定义模式:Loiter (ArduPilot) / Position (PX4)
cmd.param3           = 0;      // 子模式(一般填0)
cmd.param4           = 0;      // 保留

mavlink_msg_command_long_encode(1, 1, &msg, &cmd);
// 然后通过串口/UDP发送 msg

就这么简单?对,就这么简单。但飞控收到后,会走我们刚才画的那一整条链路。所以你看,MAVLink只是传令兵,真正的决策在飞控内部。

注意:param2的值在不同固件里不一样。ArduPilot的Loiter是4,PX4的Position Control是4,但PX4的Offboard是6。千万别写死,一定要从飞控的AUTOPILOT_VERSION消息里动态获取模式映射表。