3. 传感器故障检测:IMU(加速度计、陀螺仪)的故障特征与检测方法

好,咱们进入第三讲。这一讲我打算聊聊IMU的故障检测。IMU这东西,说白了就是飞控系统的“眼睛”和“内耳”。加速度计感知姿态,陀螺仪感知角速度。它们要是出了问题,飞控系统就成了“盲人骑瞎马”。

我在项目里见过太多因为IMU故障炸机的情况了。有一次,一架六旋翼在悬停时突然开始“点头”,我一看日志——陀螺仪的零偏在起飞后五分钟内漂移了0.5度/秒。嗯,这就是典型的故障前兆。所以,学会检测IMU故障,是保命技能。

3.1 加速度计的故障特征与检测

加速度计测量的是比力,也就是物体受到的惯性力与重力的合力。正常情况下,在静止或匀速运动时,它只感受重力。所以,它的输出应该是一个模值约为9.8 m/s²的矢量。

常见的故障特征有这些:

  • 卡死/饱和:输出值固定在一个常数,比如一直输出0或最大值。
  • 噪声异常:方差突然变大,信号毛刺多。
  • 零偏漂移:静止时输出不为0,且随时间缓慢变化。
  • 比例因子误差:实际加速度与测量值成比例偏差。

我个人习惯用两种方法来做检测:

3.1.1 一致性校验(三轴模值校验)

这个方法最简单,也最实用。你想想看,在静止状态下,加速度计的三轴输出平方和开根号,应该等于重力加速度g。

公式长这样:

|A| = sqrt(Ax² + Ay² + Az²)

正常情况下,|A|应该在9.8 m/s²附近,允许有±0.2 m/s²的误差(取决于传感器精度)。如果偏差超过阈值,比如大于10.5或小于9.0,我就判定为故障。

我的经验: 阈值别设太死。我在某款低成本IMU上遇到过,静止时模值波动能达到±0.3 m/s²。如果阈值设成±0.1,那系统会一直报故障,根本没法用。建议根据传感器数据手册的典型噪声水平,再留出1.5倍的余量。

3.1.2 阈值检测(动态范围校验)

这个更直接。加速度计有它的测量范围,比如±2g、±4g、±8g、±16g。如果输出值超过了设定量程的105%,那基本可以断定传感器已经饱和或者损坏了。

举个例子,你设的量程是±4g,那输出值如果超过4.2g,就应该触发故障报警。

注意: 在剧烈机动时,加速度计输出确实可能短暂超过量程。所以,阈值检测最好加上“持续超限时间”的判断。比如,连续10ms都超限,才判定为故障。这样可以避免误报。

3.2 陀螺仪的故障特征与检测

陀螺仪测量的是角速度。它的故障特征和加速度计类似,但有个很头疼的问题——零偏漂移。

我记得有一次做无人机编队,一架飞机的偏航角在悬停时慢慢偏了30度。查了半天,发现是陀螺仪的零偏在温度变化时漂移了。从那以后,我对陀螺仪的零偏检测就特别上心。

常见的故障特征:

  • 零偏过大:静止时输出不为0,且超过阈值。
  • 零偏漂移:零偏随时间或温度变化。
  • 噪声异常:角速度信号出现高频抖动。
  • 卡死:输出值固定不变。

3.2.1 一致性校验(静止检测)

这个方法的核心思想是:当飞行器静止时,陀螺仪的三轴输出应该都接近0。如果某一轴的输出明显不为0,那就说明有问题。

具体做法是:

  1. 检测飞行器是否处于静止状态(可以通过加速度计的模值来判断,如果|A|接近g,且变化很小,就认为静止)。
  2. 在静止状态下,采集陀螺仪三轴输出,计算均值。
  3. 如果均值超过阈值(比如0.5度/秒),就判定为故障。
避坑指南: 我曾经遇到过一个问题:飞机在地面静止时,陀螺仪输出正常。但一上电,电机转动产生的振动会导致陀螺仪输出出现虚假的角速度。所以,静止检测一定要在电机未启动时进行,或者使用带通滤波器滤除振动噪声。

3.2.2 阈值检测(角速度范围校验)

和加速度计一样,陀螺仪也有量程。比如±250度/秒、±500度/秒、±1000度/秒、±2000度/秒。如果输出值超过了量程的105%,就触发报警。

这里有个细节:陀螺仪在高速旋转时,输出可能会因为非线性而略微超出量程。所以,阈值可以适当放宽到110%。

3.3 综合检测流程

在实际工程中,我不会只用一种方法。我会把一致性校验和阈值检测结合起来,形成一个多级检测流程。

下面是我常用的一套逻辑,画成流程图大家看得更清楚:

IMU故障综合检测流程图 开始IMU数据采集 步骤1:加速度计模值校验 |A| = sqrt(Ax²+Ay²+Az²) 是否在 [9.6, 10.0] 内? 是否通过? 报故障 步骤2:陀螺仪静止检测 静止时,三轴角速度是否均 < 0.5°/s? 是否通过? 报故障 步骤3:阈值检测 所有轴输出是否在量程的105%以内? IMU正常,继续运行

这个流程我用了很多年,基本能覆盖90%以上的IMU硬件故障。当然,还有一些更高级的检测方法,比如基于卡尔曼滤波器的残差检测,那个我们后面再讲。

3.4 代码实现示例

最后,我贴一段简单的检测代码。这是我在一个Pixhawk项目中用过的,做了简化。核心逻辑就是上面说的那三步。

// IMU故障检测函数
// 返回值:0-正常,1-加速度计故障,2-陀螺仪故障,3-综合故障
int imu_fault_detection(float ax, float ay, float az, 
                        float gx, float gy, float gz) {
    
    // 1. 加速度计模值校验
    float accel_norm = sqrt(ax*ax + ay*ay + az*az);
    if (accel_norm < 9.6f || accel_norm > 10.0f) {
        return 1;  // 加速度计故障
    }
    
    // 2. 陀螺仪静止检测(假设当前为静止状态)
    // 实际应用中需要先判断是否静止
    float gyro_norm = sqrt(gx*gx + gy*gy + gz*gz);
    if (gyro_norm > 0.5f) {  // 阈值0.5度/秒
        return 2;  // 陀螺仪故障
    }
    
    // 3. 阈值检测(假设量程为±2000度/秒)
    if (fabs(gx) > 2100.0f || fabs(gy) > 2100.0f || fabs(gz) > 2100.0f) {
        return 2;  // 陀螺仪超量程
    }
    
    // 全部通过
    return 0;
}
小技巧: 在实际工程中,我建议把故障检测做成一个独立的任务,以100Hz的频率运行。这样既能保证实时性,又不会占用主控制循环的时间。另外,故障标志位最好用“累计计数”的方式,连续检测到N次故障才真正触发报警,可以有效防止偶发噪声导致的误报。

好了,这一讲就到这里。IMU故障检测是飞控系统安全的基础,希望这些经验能帮到你。下次见。


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