3、飞行模式核心状态:手动模式、增稳模式、悬停模式、返航模式、降落模式、紧急停机模式
飞行模式切换,说白了就是飞控的大脑在决定「我现在该干嘛」。我刚开始做飞控那会儿,总觉得模式越多越复杂,后来踩过几次坑才明白——每个模式都有它存在的理由,少一个都不行。
这六个核心状态,我习惯把它们分成两组:操作型模式和自动型模式。手动、增稳、悬停,这三个是你在遥控器上直接操控的;返航、降落、紧急停机,这三个是飞控自己拿主意的。你想想看,这样分是不是清晰多了?
3.1 手动模式(Manual Mode)
手动模式,就是飞控把控制权完全交给你。遥控器的摇杆直接映射到电机输出,没有任何干预。嗯,这里要注意——新手千万别一上来就切手动,我见过太多人因此炸机了。
手动模式的核心逻辑其实很简单:
// 手动模式控制逻辑(伪代码)
motor_output[0] = throttle + roll_pid + pitch_pid + yaw_pid
motor_output[1] = throttle - roll_pid + pitch_pid - yaw_pid
motor_output[2] = throttle + roll_pid - pitch_pid - yaw_pid
motor_output[3] = throttle - roll_pid - pitch_pid + yaw_pid
说白了,这就是最原始的混控输出。PID在这里只做角速度控制,不做角度控制。我个人的习惯是,只有在做特技飞行或者调试传感器时才用手动模式,平时飞都用增稳。
3.2 增稳模式(Stabilize Mode)
增稳模式,是大多数飞友最常用的模式。它跟手动模式最大的区别在于——飞控会帮你把飞机「扶正」。你松杆,飞机就自动回平。
为什么会这样?因为飞控在增稳模式下做了角度控制。它读取陀螺仪和加速度计的数据,算出当前姿态,然后跟目标姿态(也就是摇杆位置)做比较,通过PID把误差消除掉。
| 控制层级 | 手动模式 | 增稳模式 |
|---|---|---|
| 角速度控制 | ✅ 有 | ✅ 有 |
| 角度控制 | ❌ 无 | ✅ 有 |
| 位置控制 | ❌ 无 | ❌ 无 |
| 松杆行为 | 保持当前姿态 | 自动回平 |
我在项目中遇到过一个问题:增稳模式下,如果加速度计数据有偏差,飞机会往一边偏。那时候我排查了好久,最后发现是减震棉老化导致的。所以啊,定期检查传感器状态很重要。
3.3 悬停模式(Loiter / Alt Hold Mode)
悬停模式,说白了就是「定高定点」。飞控不仅帮你稳住姿态,还帮你锁住高度和水平位置。你松开所有摇杆,飞机就乖乖待在空中不动。
这个模式依赖两个关键传感器:
- 气压计:用于测量高度变化,精度大概在±0.5米左右
- GPS或光流:用于测量水平位置偏移
悬停模式的状态机设计,我习惯用三层嵌套PID:
// 悬停模式控制链
位置误差 → 速度目标 → 速度误差 → 角度目标 → 角度误差 → 角速度目标 → 电机输出
↑ ↑ ↑ ↑ ↑
GPS/光流 IMU融合 IMU融合 IMU融合 IMU融合
你想想看,这一层套一层,任何一个环节出问题,悬停效果都会变差。我记得有一次,GPS信号不好,飞机在悬停模式下像喝醉了酒一样晃来晃去。后来我加了GPS健康度检测,信号差的时候自动切回增稳模式。
3.4 返航模式(RTL Mode)
返航模式,是飞控的「救命稻草」。当飞机失去信号或者电池电量不足时,它能自己飞回来。这个模式的核心逻辑就三步:
- 爬升到安全高度:避免撞到障碍物
- 飞回起点:沿着直线或者路径飞回来
- 降落:到达起点后自动降落
返航模式的状态机,我一般这样设计:
// 返航模式状态机
enum RTL_State {
RTL_CLIMB, // 爬升到安全高度
RTL_HOME, // 飞回起点
RTL_DESCEND, // 下降到降落高度
RTL_LAND // 执行降落
};
每个状态都有超时保护和异常处理。比如爬升阶段如果遇到障碍物,就暂停爬升并尝试绕行。这些细节,都是我在一次次炸机中总结出来的。
3.5 降落模式(Land Mode)
降落模式,看起来简单,其实是最容易出问题的模式之一。它的目标就一个——让飞机平稳落地。
降落模式的核心逻辑:
- 以固定速率下降(通常0.5-1米/秒)
- 保持水平位置不变
- 检测落地(通过加速度计或气压计变化)
- 落地后自动锁定电机
还有一个坑——降落模式不能跟手动模式混用。我见过有人想在降落过程中切手动救飞机,结果因为控制逻辑冲突,飞机直接翻了。所以我的设计原则是:降落模式一旦激活,除非切紧急停机,否则不允许切其他模式。
3.6 紧急停机模式(Kill Switch / Emergency Stop)
紧急停机模式,是最后一道防线。它不做任何控制,直接切断电机输出。说白了,就是「宁可炸机,也不能失控」。
这个模式的设计要点:
- 优先级最高:任何模式下都能切进来
- 不可逆:切进来之后,不能直接切回其他模式
- 硬件触发:最好用遥控器上的独立开关,而不是软件逻辑
紧急停机的代码实现,其实就一行:
// 紧急停机
motor_output[0] = motor_output[1] = motor_output[2] = motor_output[3] = 0;
但这一行代码,救过我好几次飞机。嗯,这里要强调一下——紧急停机不是用来救飞机的,是用来减少损失的。该切就切,别犹豫。
3.7 模式切换的避坑指南
最后,我总结几个模式切换时容易踩的坑:
- 切换瞬间的抖动:两个模式的PID参数不同,切换时会有瞬间的跳变。我习惯在切换时做「软切换」,也就是把目标值慢慢过渡过去。
- 传感器失效:比如GPS丢了,悬停模式和返航模式就不能用了。我建议在模式切换前做一次传感器健康度检查。
- 误触开关:遥控器上的模式开关很容易被误碰。我一般会要求「同一个模式保持2帧以上才生效」,防止抖动误触发。
这六个模式,就像飞控的六种性格。你要了解它们各自的脾气,才能用好它们。我个人觉得,把这六个模式的状态机设计好了,飞控的骨架就搭起来了。
公众号:蓝海资料掘金营,微信deep3321