飞行模式基础概念: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 模式切换的底层逻辑
好了,模式名字你记住了,但切换的时候飞控内部到底发生了什么?这才是今天最核心的部分。
我画了一张图,把模式切换的完整链路拆开给你看。
你看,整个链路其实就五步:
- 用户触发切换——通过遥控器拨杆或者地面站发MAVLink指令。
- 指令进入模式管理器——飞控的NavCmd模块会解析你要切到什么模式。
- 安全检查——这是最容易忽略的一步。飞控会检查当前状态:飞机解锁了吗?GPS信号够吗?高度数据有效吗?任何一项不满足,切换就会被拒绝。
- 控制律切换——安全检查通过后,飞控才会把控制权交给对应模式的控制律。比如从Stabilize切到Loiter,控制律就从「姿态增稳」切换到「位置保持」。
- 混控输出——新的控制律计算出电机/舵机指令,飞机开始按新模式飞行。
我曾经遇到过一个案例:有个学员在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消息里动态获取模式映射表。