4、IMU故障诊断与处理(上):加速度计故障特征提取、阈值检测法、滑动窗口滤波诊断

各位工程师朋友,大家好。今天我们开始聊IMU的故障诊断。IMU这东西,说白了就是飞控系统的“感觉器官”。它要是出了问题,飞机就像人闭着眼睛走路,迟早要摔跟头。

我个人习惯把IMU故障诊断分成上下两讲。这一讲我们聚焦加速度计,下一讲再聊陀螺仪。为什么先讲加速度计?因为在我多年的排故经验里,加速度计出问题的概率其实比陀螺仪高不少。尤其是那些低成本MEMS传感器,受振动、温度影响特别大。

4.1 加速度计故障特征提取

先说说故障特征。你想想看,一个正常的加速度计,输出应该是什么样的?

在静态条件下,三轴输出应该满足:

sqrt(Ax² + Ay² + Az²) ≈ g (9.8 m/s²)

这个公式很基础,但非常实用。我在项目中遇到过好几次,有人拿着数据来找我,说传感器坏了。我一看,模值偏离g很多,但三轴各自看又没什么异常。这就是典型的“模值校验”没做。

常见的加速度计故障特征,我归纳为以下几类:

故障类型 特征表现 典型原因
硬故障 输出恒定值(如0或满量程) 芯片损坏、断线
偏置漂移 静态输出偏离g值,且缓慢变化 温度变化、老化
噪声异常 输出跳动剧烈,方差明显增大 电源干扰、振动耦合
比例因子误差 动态响应与实际加速度不成比例 制造公差、冲击损伤

嗯,这里要注意一点。硬故障其实最好诊断,因为特征很明显。但偏置漂移和噪声异常,往往容易被忽视。我见过一个案例,飞机在空中突然开始震荡,查了半天,结果是加速度计偏置慢慢漂了0.1g。0.1g啊,在控制回路里就是个大问题。

4.2 阈值检测法

阈值检测法,是最简单、最直接的诊断方法。说白了就是设个上下限,超出就报警。

具体怎么做?我一般分三步:

  1. 确定正常范围:根据传感器手册和实际测试,确定各轴输出的正常范围。
  2. 设置阈值:通常取正常范围的±10%~20%作为报警阈值。
  3. 实时比较:每个采样周期检查当前值是否在阈值内。

举个例子,假设加速度计量程为±2g,正常静态输出应在0.9g~1.1g之间。那么阈值可以设为:

// 阈值检测伪代码
#define ACC_LOW_THRESHOLD  0.8f  // 下限
#define ACC_HIGH_THRESHOLD 1.2f  // 上限

bool check_acc_threshold(float acc_norm) {
    if (acc_norm < ACC_LOW_THRESHOLD || acc_norm > ACC_HIGH_THRESHOLD) {
        return false;  // 故障
    }
    return true;  // 正常
}

我曾经在一个项目中,只用阈值检测法就抓到了三次传感器故障。有一次是飞控板进水,加速度计输出直接变成了0.5g。阈值一设,立马报警。

注意:阈值不能设得太紧,也不能太松。太紧容易误报,太松容易漏报。我建议先采集一段正常飞行数据,用统计方法确定阈值。比如取均值±3σ,效果就不错。

4.3 滑动窗口滤波诊断

阈值检测法虽然简单,但有个致命弱点——它对瞬时噪声太敏感。你想想看,如果传感器只是被拍了一下,输出瞬间跳变,阈值检测就会误报。这时候就需要滑动窗口滤波了。

滑动窗口滤波的核心思想是:不只看当前一个点,而是看一段时间内的数据趋势。具体做法是维护一个固定长度的数据窗口,每次新数据进来,就计算窗口内的统计特征。

我常用的滑动窗口诊断方法有两种:

4.3.1 滑动均值检测

计算窗口内数据的平均值,用这个平均值来做阈值判断。这样可以滤掉高频噪声。

// 滑动均值检测
#define WINDOW_SIZE 10

float buffer[WINDOW_SIZE];
int index = 0;
float sum = 0.0f;

bool sliding_mean_check(float new_value) {
    // 更新窗口
    sum -= buffer[index];
    buffer[index] = new_value;
    sum += new_value;
    index = (index + 1) % WINDOW_SIZE;
    
    // 计算均值
    float mean = sum / WINDOW_SIZE;
    
    // 阈值判断
    if (mean < 0.8f || mean > 1.2f) {
        return false;
    }
    return true;
}

4.3.2 滑动方差检测

这个更有意思。有时候均值正常,但方差突然变大,说明传感器在“抖动”。这在飞行中是很危险的信号。

// 滑动方差检测
bool sliding_variance_check(float new_value) {
    // 先计算均值
    float mean = calculate_sliding_mean(new_value);
    
    // 计算方差
    float variance = 0.0f;
    for (int i = 0; i < WINDOW_SIZE; i++) {
        variance += (buffer[i] - mean) * (buffer[i] - mean);
    }
    variance /= WINDOW_SIZE;
    
    // 方差阈值判断
    if (variance > VARIANCE_THRESHOLD) {
        return false;  // 噪声过大
    }
    return true;
}
我的经验:窗口大小的选择很关键。窗口太小,滤波效果差;窗口太大,响应延迟。我一般取10~20个采样点,对应100Hz采样率就是0.1~0.2秒的延迟,这个延迟在飞控里是可以接受的。

4.4 知识体系总览

为了让大家更直观地理解这一讲的内容,我画了一张流程图。它展示了加速度计故障诊断的整体逻辑:

加速度计故障诊断流程 原始加速度数据 故障特征提取(模值、偏置、噪声) 阈值检测法 滑动窗口滤波诊断 硬故障 / 偏置漂移 噪声异常 / 趋势变化 故障判定与应急处理

这张图把整个诊断流程串起来了。从原始数据进来,先做特征提取,然后根据情况选择阈值检测或滑动窗口滤波,最后输出故障判定结果。我个人习惯在实际项目中两种方法都用,互为备份。

核心要点回顾:

  • 加速度计故障特征包括硬故障、偏置漂移、噪声异常、比例因子误差
  • 阈值检测法简单高效,适合硬故障诊断
  • 滑动窗口滤波能有效抑制噪声,适合检测趋势性变化
  • 窗口大小一般取10~20个采样点,平衡滤波效果和响应速度

好了,这一讲的内容就到这里。加速度计的故障诊断,说白了就是“看特征、设阈值、做滤波”这三板斧。但别小看这三板斧,用好了能解决90%的问题。下一讲我们继续聊陀螺仪的故障诊断,到时候会涉及更复杂的逻辑,比如一致性校验和交叉验证。


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