3. 故障检测与诊断(FDD)基础:残差生成、阈值设计、基于模型的诊断方法
各位同学,咱们今天聊点实在的。故障检测与诊断,简称 FDD,说白了就是给飞行器装个「体检系统」。我做了这么多年飞控,最怕的不是算法写不出来,而是飞机出问题了,你压根不知道它哪儿疼。
这一节,咱们就掰开揉碎了讲讲 FDD 的三个核心:残差怎么生成、阈值怎么设计、以及基于模型的诊断到底怎么玩。嗯,都是我在项目里踩过坑、填过土的东西。
3.1 残差生成——故障的「指纹」
残差是什么?说白了就是「期望」和「现实」的差值。你期望电机转 5000 RPM,实际传感器告诉你只有 4800,那这 200 的差就是残差。故障来了,残差就会异常。
我个人习惯把残差生成分成三类:
- 基于输出残差:直接拿传感器测量值减去模型估计值。简单粗暴,但模型不准时容易误报。
- 基于状态残差:用观测器(比如龙伯格观测器)重构系统状态,再和实际状态比较。我在做四旋翼执行器故障检测时,最喜欢用这种方法。
- 基于新息残差:卡尔曼滤波里的新息序列,天然就是残差。我记得有一次调试,新息突然跳变,我一看就知道是陀螺仪挂了。
核心公式(输出残差):
r(t) = y(t) - ŷ(t)
其中:
r(t) —— 残差向量
y(t) —— 实际测量值
ŷ(t) —— 模型预测值
我的经验:残差生成时,别忘了做归一化处理。不同传感器的量纲差异很大,角速度残差和加速度残差直接放一起比较,你会疯掉的。我一般会除以测量噪声的标准差,让残差变成无量纲的「标准分数」。
3.2 阈值设计——别让飞机「一惊一乍」
阈值设得太小,飞机天天误报,你根本没法飞。阈值设得太大,故障都烧穿了它还没报警。嗯,这里面的门道不少。
我总结了几种常用的阈值设计方法:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 固定阈值 | 噪声特性稳定的系统 | 实现简单,计算量小 | 适应性差,容易误报/漏报 |
| 自适应阈值 | 飞行状态变化大的场景 | 随工况调整,鲁棒性好 | 需要在线计算,稍复杂 |
| 统计假设检验 | 需要定量分析时 | 有严格的统计学依据 | 需要知道噪声分布 |
| 多级阈值策略 | 区分故障严重程度 | 可分级报警,便于决策 | 参数整定工作量大 |
避坑指南:我曾经在一个项目中,直接用固定阈值检测电机故障。结果悬停时好好的,一做大机动动作,残差直接飙到阈值以上,误报不断。后来改成自适应阈值——根据油门量和角速度动态调整阈值,问题才解决。你想想看,大机动时残差本来就大,阈值也得跟着涨才行。
自适应阈值的一个简单实现思路:
// 伪代码:自适应阈值计算
float adaptive_threshold(float base_threshold, float control_input, float rate) {
float scale = 1.0 + 0.2 * abs(control_input) + 0.1 * abs(rate);
return base_threshold * scale;
}
3.3 基于模型的诊断方法——给飞机「把脉」
基于模型的方法,核心思想就是:拿一个数学模型当「健康基准」。飞机正常时,实际行为和模型预测应该差不多。一旦偏差大了,就说明出问题了。
我个人把这类方法分成三个流派:
3.3.1 参数估计法
说白了就是在线辨识系统参数。比如电机的力矩系数、桨叶的升力系数。正常情况下这些参数是已知的,一旦参数变了——比如桨叶断了导致升力系数下降——残差就会报警。
我记得有一次做六旋翼容错控制,一个电机因为轴承磨损,力矩系数下降了 15%。参数估计法在故障发生 0.3 秒后就检测到了,比直接看转速残差快了将近一倍。
3.3.2 状态估计法
用观测器或卡尔曼滤波估计系统状态,然后比较估计值和测量值。这个方法的好处是:你不需要知道故障的具体模型,只要状态估计够准,任何异常都能抓到。
举个例子:
// 卡尔曼滤波新息计算(简化版)
void kalman_update(float z_meas, float &x_est, float &P) {
// 预测
float x_pred = A * x_est + B * u;
float P_pred = A * P * A' + Q;
// 新息(残差)
float innovation = z_meas - C * x_pred;
// 如果 innovation 超过 3σ,判定为故障
if (abs(innovation) > 3.0 * sqrt(C * P_pred * C' + R)) {
fault_flag = 1;
}
// 更新
float K = P_pred * C' / (C * P_pred * C' + R);
x_est = x_pred + K * innovation;
P = (1 - K * C) * P_pred;
}
关键点:状态估计法的核心是「解析冗余」——用数学模型代替物理冗余传感器。你想想看,一个 IMU 坏了,但通过另外两个 IMU 和动力学模型,你照样能估计出姿态。这就是解析冗余的魅力。
3.3.3 等价空间法
这个方法比较数学,但很优雅。它通过构造一个「等价空间」,把系统输入输出投影到这个空间里。正常情况下投影为零,故障时投影非零。说白了就是找一个「故障放大镜」。
我在做多旋翼传感器故障诊断时,用过等价空间法检测加速度计偏置故障。效果不错,但计算量比卡尔曼滤波大一些。如果你的飞控算力够,可以试试。
3.4 残差评价与决策逻辑
生成残差、设计阈值之后,还得有个决策逻辑。总不能残差一超阈值就立马切降落吧?
我常用的决策策略:
- 连续超限判定:残差连续 N 步超过阈值,才判定为故障。N 一般取 3~5,防止噪声引起的误报。
- 累计和(CUSUM):对残差进行累计,适合检测缓慢变化的故障。比如电机效率逐渐下降。
- 多残差投票:多个残差同时报警才确认故障。我在六旋翼上用过,一个传感器坏了,其他五个「投票」确认,误报率几乎为零。
一个小技巧:决策逻辑里加个「去抖计时器」。残差超阈值后,等 50ms 再确认。这 50ms 能过滤掉 90% 以上的瞬态干扰。我曾经因为没加这个,飞机在阵风里疯狂报警,差点把飞控搞死机。
3.5 实际工程中的坑与对策
做 FDD 这么多年,我踩过的坑能写本书。挑几个典型的说说:
- 模型不准导致残差漂移:你建的模型和真实飞机总有差距,残差天生就不为零。对策是加个「偏置补偿」,在线估计模型误差。
- 噪声特性随时间变化:电池电压下降、温度变化,传感器噪声都会变。固定阈值肯定不行,得用自适应阈值或在线噪声估计。
- 故障和扰动的混淆:一阵大风刮过来,残差也会跳。怎么区分是故障还是扰动?我的做法是看残差的频率特性——扰动通常是低频的,故障往往有特定的频率特征。
血的教训:有一次我在实验室调试,飞机刚离地就报「电机故障」,我查了半天,发现是地面效应导致升力模型不准,残差超了。从那以后,我每次做 FDD 都会先做「无故障基线测试」——让飞机在正常状态下飞一遍,记录残差的统计特性,再用这个统计特性去设计阈值。说白了,你得先知道「正常」长什么样,才能判断「异常」。
好了,这一节的内容就到这儿。残差生成、阈值设计、基于模型的诊断,这三板斧你拿好了,多旋翼的故障检测基本就能搞定大半。剩下的就是多练、多试、多踩坑——嗯,踩坑也是一种学习。