3、飞行模式核心状态:手动模式、增稳模式、悬停模式、返航模式、降落模式、紧急停机模式

飞行模式切换,说白了就是飞控的大脑在决定「我现在该干嘛」。我刚开始做飞控那会儿,总觉得模式越多越复杂,后来踩过几次坑才明白——每个模式都有它存在的理由,少一个都不行。

这六个核心状态,我习惯把它们分成两组:操作型模式自动型模式。手动、增稳、悬停,这三个是你在遥控器上直接操控的;返航、降落、紧急停机,这三个是飞控自己拿主意的。你想想看,这样分是不是清晰多了?

3.1 手动模式(Manual Mode)

手动模式,就是飞控把控制权完全交给你。遥控器的摇杆直接映射到电机输出,没有任何干预。嗯,这里要注意——新手千万别一上来就切手动,我见过太多人因此炸机了。

⚠️ 警告:手动模式下,飞控不提供任何姿态稳定。如果你松杆,飞机会保持当前姿态继续运动,不会自动回平。我曾经在测试时忘了切回增稳模式,结果飞机直接翻了180度,还好及时切了紧急停机。

手动模式的核心逻辑其实很简单:

// 手动模式控制逻辑(伪代码)
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)

返航模式,是飞控的「救命稻草」。当飞机失去信号或者电池电量不足时,它能自己飞回来。这个模式的核心逻辑就三步:

  1. 爬升到安全高度:避免撞到障碍物
  2. 飞回起点:沿着直线或者路径飞回来
  3. 降落:到达起点后自动降落
⚠️ 重要提醒:返航模式依赖GPS。如果起飞时GPS没锁定,返航模式就是废的。我曾经在树林里飞,GPS信号被树冠遮挡,返航时飞机直接飞偏了。所以我现在每次起飞前,都会确认GPS锁定状态。

返航模式的状态机,我一般这样设计:

// 返航模式状态机
enum RTL_State {
    RTL_CLIMB,      // 爬升到安全高度
    RTL_HOME,       // 飞回起点
    RTL_DESCEND,    // 下降到降落高度
    RTL_LAND        // 执行降落
};

每个状态都有超时保护和异常处理。比如爬升阶段如果遇到障碍物,就暂停爬升并尝试绕行。这些细节,都是我在一次次炸机中总结出来的。

3.5 降落模式(Land Mode)

降落模式,看起来简单,其实是最容易出问题的模式之一。它的目标就一个——让飞机平稳落地。

降落模式的核心逻辑:

  • 以固定速率下降(通常0.5-1米/秒)
  • 保持水平位置不变
  • 检测落地(通过加速度计或气压计变化)
  • 落地后自动锁定电机
💡 经验之谈:我建议在降落模式中加入「地面效应补偿」。当飞机离地面很近时(比如1米以内),地面效应会导致飞机突然飘起来或者下沉。我一般会在高度低于1米时,把下降速率减半,同时增加积分项的限幅。

还有一个坑——降落模式不能跟手动模式混用。我见过有人想在降落过程中切手动救飞机,结果因为控制逻辑冲突,飞机直接翻了。所以我的设计原则是:降落模式一旦激活,除非切紧急停机,否则不允许切其他模式。

3.6 紧急停机模式(Kill Switch / Emergency Stop)

紧急停机模式,是最后一道防线。它不做任何控制,直接切断电机输出。说白了,就是「宁可炸机,也不能失控」。

这个模式的设计要点:

  • 优先级最高:任何模式下都能切进来
  • 不可逆:切进来之后,不能直接切回其他模式
  • 硬件触发:最好用遥控器上的独立开关,而不是软件逻辑
⚠️ 血的教训:我曾经把紧急停机设计成「长按3秒触发」,结果有一次飞机失控,我按了3秒没反应,等反应过来已经撞树了。现在我都是设计成「拨动开关立即触发」,0延迟。

紧急停机的代码实现,其实就一行:

// 紧急停机
motor_output[0] = motor_output[1] = motor_output[2] = motor_output[3] = 0;

但这一行代码,救过我好几次飞机。嗯,这里要强调一下——紧急停机不是用来救飞机的,是用来减少损失的。该切就切,别犹豫。

3.7 模式切换的避坑指南

最后,我总结几个模式切换时容易踩的坑:

  • 切换瞬间的抖动:两个模式的PID参数不同,切换时会有瞬间的跳变。我习惯在切换时做「软切换」,也就是把目标值慢慢过渡过去。
  • 传感器失效:比如GPS丢了,悬停模式和返航模式就不能用了。我建议在模式切换前做一次传感器健康度检查。
  • 误触开关:遥控器上的模式开关很容易被误碰。我一般会要求「同一个模式保持2帧以上才生效」,防止抖动误触发。

这六个模式,就像飞控的六种性格。你要了解它们各自的脾气,才能用好它们。我个人觉得,把这六个模式的状态机设计好了,飞控的骨架就搭起来了。


公众号:蓝海资料掘金营,微信deep3321