故障检测与诊断(FDD)基础:残差生成、阈值设计、基于解析模型的方法
各位同学,咱们今天聊点实在的。
飞控系统里,执行器出故障是家常便饭。电机卡死、舵面卡滞、螺旋桨脱落……这些我都遇到过。有一次在试飞现场,飞机刚离地两米,右副翼舵机就罢工了。幸亏FDD模块及时报警,才没酿成大祸。
所以,故障检测与诊断(FDD)不是锦上添花,是保命用的。
1. 残差生成:故障的“指纹”
说白了,残差就是“实际输出”和“期望输出”之间的差值。
你想想看,一个健康的电机,你给它PWM信号,它就该转出对应的转速。如果实际转速和模型预测的转速对不上,那肯定有问题。
残差 = 实际测量值 - 模型估计值
残差接近0 → 系统正常
残差明显偏离0 → 故障发生
我在项目中常用两种残差生成方式:
- 输出残差:直接比较传感器读数和模型输出。简单粗暴,但容易受噪声干扰。
- 状态残差:用卡尔曼滤波器或观测器估计系统状态,再和实际状态对比。精度更高,但计算量也大。
举个例子,四旋翼的电机故障检测:
// 伪代码:电机转速残差计算
float expected_rpm = motor_model(throttle_command);
float actual_rpm = rpm_sensor.read();
float residual = actual_rpm - expected_rpm;
if (abs(residual) > THRESHOLD) {
fault_flag = true;
}
嗯,这里要注意。残差不是越大越好,也不是越小越好。关键是要能区分“故障”和“正常波动”。
2. 阈值设计:别让误报害了你
阈值设得太小,系统天天误报,飞手会疯掉。
阈值设得太大,故障都烧穿了还没报警,那FDD就形同虚设。
我个人习惯把阈值设计分成三步走:
- 统计正常工况下的残差分布。采集几百组数据,算均值和方差。
- 确定阈值边界。一般用3σ原则,或者根据系统要求设定。
- 加入自适应机制。不同飞行阶段,阈值可以动态调整。
避坑指南
我曾经犯过一个低级错误:把阈值设成固定值。结果飞机在高空低温环境下,传感器噪声变大,残差频繁超限,导致连续误报。后来改成温度补偿的自适应阈值,问题才解决。
阈值设计还有一个关键点:时域窗口。
单点超限可能是噪声,连续N个点超限才是真故障。我一般设3~5个采样点的滑动窗口,能有效滤除毛刺。
| 阈值类型 | 适用场景 | 优缺点 |
|---|---|---|
| 固定阈值 | 工况稳定、噪声已知 | 简单,但适应性差 |
| 自适应阈值 | 工况变化大 | 灵活,但实现复杂 |
| 统计阈值 | 有历史数据支撑 | 可靠,但需要离线训练 |
3. 基于解析模型的方法:把物理规律写进代码
这是FDD里最经典的一类方法。核心思想就是:用数学模型描述系统行为,然后通过残差分析来检测故障。
常用的模型包括:
- 状态空间模型:适合线性系统,用观测器生成残差
- 传递函数模型:适合SISO系统,用参数估计检测变化
- 非线性模型:适合真实飞控系统,比如四旋翼的动力学模型
我给大家画个流程图,把整个FDD的逻辑串起来:
你看这个流程,其实不复杂。关键就两步:建好模型,选对阈值。
注意
模型精度和计算量是矛盾的。模型越精细,残差越干净,但CPU扛不住。我在STM32F4上跑过全阶状态观测器,结果主循环时间从1ms飙到5ms,飞控直接炸了。后来换成降阶观测器,才平衡了精度和实时性。
4. 实战经验:从模型到代码
我给大家分享一个实际案例。
某次做固定翼无人机项目,舵机故障检测。我用了基于传递函数的参数估计方法:
- 建立舵机二阶模型:G(s) = ω² / (s² + 2ζωs + ω²)
- 在线辨识阻尼比ζ和自然频率ω
- 当ζ偏离正常范围超过20%时,判定为故障
这个方法的好处是:不需要额外传感器,只用已有的PWM指令和舵面反馈信号。
但有个坑——激励条件。如果飞机一直平飞,舵机几乎不动,参数根本辨识不出来。我当时的解决办法是:在巡航阶段注入小幅度的扫频信号,既不影响飞行品质,又能持续激励系统。
小技巧
残差生成后,别急着做阈值判断。先做一次低通滤波,把高频噪声滤掉。我一般用截止频率为10Hz的一阶低通,效果不错。
好了,这一章的内容就到这里。FDD是个系统工程,残差生成、阈值设计、模型选择,每一步都影响最终效果。希望大家在实际项目中,多测试、多迭代,找到最适合自己平台的那套方案。
公众号:蓝海资料掘金营,微信deep3321