2. 飞行模式基础概念:理解PX4中飞行模式的定义、分类及状态机模型
各位同学,欢迎来到第二章。这一章我们聊聊飞行模式的基础概念。说实话,很多新手一上来就急着调参数、写代码,结果连最基本的模式切换逻辑都没搞明白——嗯,我在项目里见过太多这样的案例了。
飞行模式,说白了就是飞控系统的一组预设行为。你想想看,无人机在不同场景下需要不同的控制策略:起飞时希望它稳稳当当,巡航时希望它自主导航,降落时又需要精确控制。这些不同的行为集合,就是飞行模式。
2.1 飞行模式的定义
在PX4中,每个飞行模式本质上是一组控制律参数 + 状态机状态 + 传感器融合策略的组合。我个人习惯把飞行模式理解成「飞控的思维模式」——它决定了飞控如何解读遥控器输入、如何处理传感器数据、如何输出控制指令。
核心定义:飞行模式 = 控制律配置 + 状态机状态 + 输入映射规则
举个例子,同样是打满油门杆,在手动模式下飞控直接输出油门值给电机;在定高模式下飞控会计算当前高度与目标高度的偏差,自动调整油门;在任务模式下飞控甚至可能忽略你的油门杆输入,完全按照预设航线飞行。
为什么会这样?因为不同模式对「油门杆」这个输入信号的解释方式完全不同。这就是飞行模式存在的意义——改变飞控对输入信号的解读方式。
2.2 飞行模式的三大分类
PX4把飞行模式分成三大类:手动模式、辅助模式、自动模式。这个分类不是随便分的,它对应着不同的自动化程度和飞行员介入程度。
| 分类 | 自动化程度 | 飞行员介入 | 典型模式 |
|---|---|---|---|
| 手动模式 | 低 | 完全控制 | 手动/特技 |
| 辅助模式 | 中 | 部分控制 | 定高/悬停/返航 |
| 自动模式 | 高 | 极少介入 | 任务/降落/起飞 |
2.2.1 手动模式
手动模式下,飞控几乎不做任何干预。你推杆它就倾斜,你松杆它就保持当前姿态——注意,是保持姿态,不是保持位置。我记得有一次调试,一个学员在手动模式下松了杆,飞机直接飘走了,他一脸懵地问「为什么它不悬停?」——嗯,手动模式本来就不悬停。
手动模式适合有经验的飞手做特技飞行,或者做飞控调试时的原始数据采集。我个人建议新手不要轻易尝试纯手动模式,除非你在模拟器上练过几百个小时。
2.2.2 辅助模式
辅助模式是实际项目中最常用的。它介于手动和自动之间,飞控帮你做一些「脏活累活」。比如定高模式,你只需要控制前后左右,高度由飞控自动维持。我在项目中遇到过很多次,客户要求「既要灵活又要稳定」,这时候辅助模式就是最佳选择。
辅助模式的核心特点是:飞控接管部分自由度。具体接管哪些自由度,取决于你选择的模式:
- 定高模式:接管Z轴(高度),X/Y轴由飞行员控制
- 悬停模式:接管X/Y/Z三轴,但偏航由飞行员控制
- 返航模式:接管位置控制,自动飞回起飞点
避坑指南:我曾经在定高模式下遇到过一个问题——GPS信号不好时,高度控制会变得很不稳定。后来我养成了一个习惯:在切换辅助模式前,先检查传感器状态。特别是GPS和气压计的健康状态,这两个是辅助模式的「眼睛」。
2.2.3 自动模式
自动模式下,飞控完全接管控制权。你只需要告诉它「做什么」,它自己决定「怎么做」。任务模式就是典型的自动模式——你上传一条航线,飞控自动完成起飞、巡航、拍照、降落等一系列动作。
自动模式的核心是任务规划。你需要提前定义好航点、动作、条件。我在做农业植保项目时,经常用自动模式让无人机按照预设航线喷洒农药,一飞就是半小时,全程不需要人工干预。
2.3 状态机模型
理解了分类,我们来看看飞行模式背后的「大脑」——状态机模型。PX4的飞行模式切换不是随便跳的,它遵循一套严格的状态机逻辑。
说白了,状态机就是一组「如果...那么...」的规则集合。比如:
- 如果当前是手动模式,且收到切换指令,那么进入辅助模式
- 如果当前是辅助模式,且检测到故障,那么进入降落模式
- 如果当前是自动模式,且任务完成,那么进入悬停模式
下面我用一张SVG图来展示PX4飞行模式的核心状态机模型:
这张图展示了PX4飞行模式切换的核心逻辑。你注意看,所有模式最终都可以回到手动模式——这是安全设计的关键。我曾经在调试时遇到过自动模式卡死的情况,幸好手动接管机制还在,不然飞机就飞丢了。
2.4 模式切换的实际逻辑
在PX4源码中,模式切换由 commander 模块负责。它维护一个状态机,每次循环检查是否有模式切换请求。切换请求可以来自:
- 遥控器通道:通过RC通道映射,比如通道5控制模式切换
- 地面站指令:通过MAVLink协议发送切换命令
- 内部事件:比如电池电量低、GPS丢失等触发自动切换
下面是一段简化的模式切换代码逻辑:
// PX4 commander 模块简化逻辑
if (rc_channels_updated()) {
uint8_t mode_channel = get_rc_channel(5); // 通道5控制模式
switch (mode_channel) {
case 0: set_mode(MANUAL); break;
case 1: set_mode(ALTITUDE); break;
case 2: set_mode(POSITION); break;
case 3: set_mode(MISSION); break;
}
}
// 故障保护自动切换
if (battery_voltage < LOW_BATTERY_THRESHOLD) {
set_mode(RTL); // 自动返航
}
重要提醒:模式切换不是瞬间完成的。PX4在切换模式时会做一系列安全检查:检查传感器状态、检查GPS精度、检查电池电量。如果条件不满足,切换请求会被拒绝。我曾经遇到过在GPS信号差的时候尝试切换到悬停模式,结果切换失败,飞机直接失控——从那以后,我每次切换模式前都会先看一眼GPS状态。
2.5 实际项目中的模式选择建议
说了这么多理论,最后给点实际建议。我在多个项目中总结了一套模式选择策略:
- 起飞阶段:用辅助模式(定高或悬停),让飞控帮你稳住飞机
- 巡航阶段:用自动模式(任务模式),让飞控按航线飞行
- 降落阶段:用辅助模式或自动模式,看你对降落精度的要求
- 应急情况:随时准备切回手动模式,这是最后的保险
你想想看,如果全程用手动模式,飞手会非常累;如果全程用自动模式,遇到突发情况又来不及反应。所以实际项目中,我通常会在遥控器上设置三个模式切换通道:一个切手动、一个切辅助、一个切自动。这样无论什么情况,都能快速切换到合适的模式。
好了,这一章的内容就到这里。飞行模式的概念是PX4开发的基石,后面的章节我们会深入每个模式的具体实现和参数配置。记住一句话:理解模式,就是理解飞控的思维方式。
公众号:蓝海资料掘金营,微信deep3321