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飞行模式状态机模型 手动模式 Manual/Stabilized 辅助模式 Altitude/Position 自动模式 Mission/Landing 故障保护 Failsafe/Land 切换指令 任务开始 传感器故障 任务失败 手动接管 图例: 手动 辅助 自动 故障 箭头方向表示模式切换路径

这张图展示了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 实际项目中的模式选择建议

说了这么多理论,最后给点实际建议。我在多个项目中总结了一套模式选择策略:

  1. 起飞阶段:用辅助模式(定高或悬停),让飞控帮你稳住飞机
  2. 巡航阶段:用自动模式(任务模式),让飞控按航线飞行
  3. 降落阶段:用辅助模式或自动模式,看你对降落精度的要求
  4. 应急情况:随时准备切回手动模式,这是最后的保险

你想想看,如果全程用手动模式,飞手会非常累;如果全程用自动模式,遇到突发情况又来不及反应。所以实际项目中,我通常会在遥控器上设置三个模式切换通道:一个切手动、一个切辅助、一个切自动。这样无论什么情况,都能快速切换到合适的模式。

好了,这一章的内容就到这里。飞行模式的概念是PX4开发的基石,后面的章节我们会深入每个模式的具体实现和参数配置。记住一句话:理解模式,就是理解飞控的思维方式


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