第四章:双余度切换逻辑设计

各位同学,今天我们来聊聊双余度飞控里最核心的一个环节——切换逻辑。说白了,就是主飞控和备份飞控之间,什么时候换班、怎么换班、换得多快。我做了这么多年飞控,见过不少因为切换逻辑没设计好,导致空中“翻车”的案例。嗯,这一章咱们就把这块硬骨头啃下来。

4.1 主备切换策略:谁说了算?

双余度系统,不是简单放两块板子就完事了。你得定个规矩:正常情况下谁干活,出问题了谁来顶。我个人习惯把策略分成三种:

  • 冷备份策略:备份机平时不上电,或者上电但不跑控制律。主控挂了,备份才启动。好处是省电、干扰少,坏处是切换慢,备份机启动需要时间。我早期在一个无人机项目里用过,结果主控死机后,备份机启动花了3秒,飞机直接掉了50米高度……后来再也不敢用了。
  • 温备份策略:备份机跑着同样的软件,但不输出控制信号。主控一挂,备份立刻接管。切换时间可以控制在100ms以内。这是目前工业界最常用的方案。
  • 热备份策略:两台同时输出,通过表决器选一路。切换几乎是瞬时的,但硬件成本高,而且两路信号不一致时容易打架。我记得有个客户非要搞热备份,结果两路传感器噪声不一样,表决器来回切,舵面抖得像筛糠。

我的建议:对于大多数固定翼和旋翼无人机,温备份是最稳妥的选择。既保证了切换速度,又不会因为两路同时输出而引入额外问题。

4.2 切换条件设计:什么时候该换人?

切换条件设计,是双余度系统里最容易出幺蛾子的地方。你想想看,如果条件设得太松,主控都冒烟了还不切换,那备份机就是个摆设;如果设得太紧,传感器一个抖动就切换,系统反而更不稳定。我总结下来,核心就三个机制:心跳检测、超时机制、表决逻辑。

4.2.1 心跳检测——你还在吗?

心跳检测,说白了就是主控定期发一个“我还活着”的信号给备份机。这个信号可以是GPIO电平翻转,也可以是CAN总线上的特定报文。我个人习惯用50Hz的心跳频率,也就是每20ms发一次。

// 伪代码示例:心跳发送任务
void heartbeat_task(void)
{
    while(1)
    {
        heartbeat_pin_toggle();  // 翻转心跳引脚电平
        vTaskDelay(pdMS_TO_TICKS(20));  // 20ms周期
    }
}

备份机那边,会开一个定时器来监视这个心跳。如果连续几个周期没收到,就认为主控挂了。这里有个关键参数:连续丢失次数。设成3次比较合理——丢失1次可能是干扰,丢失2次要警惕,丢失3次基本可以判定主控出问题了。

避坑指南:我曾经遇到过一个情况,心跳线被电磁干扰拉低了,备份机误判主控挂了,直接切换。结果主控其实好好的,两台机器开始“抢方向盘”。后来我加了硬件滤波和软件去抖,才解决这个问题。

4.2.2 超时机制——给你时间,但别太久

超时机制和心跳检测是配套的。心跳检测是“有没有收到”,超时机制是“收到的是不是及时”。举个例子,主控可能还在发心跳,但CPU负载过高,导致心跳报文延迟了。这时候超时机制就要起作用。

我一般会设两级超时:

  • 软超时:超过1.5倍心跳周期没收到,触发警告,但不切换。记录日志,方便事后排查。
  • 硬超时:超过3倍心跳周期没收到,触发切换。这个阈值不能太短,否则系统太敏感;也不能太长,否则故障扩散。
参数 推荐值 说明
心跳周期 20ms 50Hz,兼顾实时性和CPU开销
软超时阈值 30ms 1.5倍周期,触发警告
硬超时阈值 60ms 3倍周期,触发切换
连续丢失次数 3次 防误判

4.2.3 表决逻辑——到底听谁的?

表决逻辑是双余度系统里最烧脑的部分。尤其是当两台机器都在运行,但输出不一致时,你得决定听谁的。我常用的表决策略有三种:

  • 优先级表决:默认听主控的,只有主控明确报故障时才切到备份。简单粗暴,但主控如果“谎报军情”就麻烦了。
  • 交叉比较表决:两台机器互相比较输出,差值超过阈值就报警。如果只有一台超差,切到另一台;如果两台都超差,保持当前状态并报警。这个方案比较可靠,但需要两台机器之间有高速通信。
  • 三取二表决:这个其实需要三余度,但双余度里可以引入“虚拟第三票”——比如用IMU的加速度计数据作为参考。如果主控和备份的输出不一致,看哪个更符合IMU的物理约束。

注意:表决逻辑一定要考虑“共因故障”。如果两台机器用的是同一批传感器、同一版软件,那一个bug可能同时干掉两台。我见过最惨的案例是,主备两台飞控的陀螺仪都焊反了方向,表决结果完全一致——但都是错的。

4.3 切换时间指标:多快才算快?

切换时间,是衡量双余度系统性能的核心指标。但“切换时间”到底从哪算到哪?我一般把它拆成三段:

  1. 故障检测时间:从故障发生到备份机确认主控故障。这个时间取决于心跳周期和连续丢失次数。按上面的配置,最长是 20ms × 3 = 60ms。
  2. 切换执行时间:从备份机决定接管到输出稳定。包括切换控制律、更新状态估计、输出舵面信号。这个时间一般在 10ms~50ms 之间,取决于软件架构。
  3. 系统稳定时间:从切换完成到飞行状态恢复平稳。这个时间最难量化,取决于飞机的动态特性和切换时的飞行状态。

对于大多数中小型无人机,我建议的总切换时间目标如下:

飞行阶段 目标切换时间 说明
悬停/低速 < 200ms 姿态变化慢,时间可以宽松些
巡航 < 100ms 需要快速响应,防止掉高
机动/起降 < 50ms 最严苛的阶段,几乎不能有中断

我的经验:实际项目中,我一般把故障检测时间控制在 60ms 以内,切换执行时间控制在 20ms 以内。这样即使加上一些余量,总切换时间也能压在 100ms 以内。对于大多数飞控应用来说,这个指标已经足够安全了。

4.4 核心逻辑流程图

下面这张图,是我自己画的双余度切换逻辑流程图。它把心跳检测、超时机制、表决逻辑串在了一起。你仔细看一遍,基本就能理解整个切换过程了。

双余度切换逻辑流程图 主控发送心跳 备份机接收心跳 超时? 重置丢失计数器 丢失计数器 +1 ≥3次? 继续监视 执行主备切换

嗯,这张图其实已经说得很清楚了。主控定期发心跳,备份机收不到就计数,连续丢3次就切换。简单、可靠、不容易出幺蛾子。我这些年做过的项目,90%都是用的这个逻辑框架。

最后说一句:切换逻辑设计,不要追求花哨。越简单越可靠。你想想看,飞机在天上,最怕的就是飞控自己“想太多”。把心跳检测、超时机制、表决逻辑这三个基本功做扎实了,双余度系统就成功了一大半。


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