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,我就判定为故障。
3.1.2 阈值检测(动态范围校验)
这个更直接。加速度计有它的测量范围,比如±2g、±4g、±8g、±16g。如果输出值超过了设定量程的105%,那基本可以断定传感器已经饱和或者损坏了。
举个例子,你设的量程是±4g,那输出值如果超过4.2g,就应该触发故障报警。
3.2 陀螺仪的故障特征与检测
陀螺仪测量的是角速度。它的故障特征和加速度计类似,但有个很头疼的问题——零偏漂移。
我记得有一次做无人机编队,一架飞机的偏航角在悬停时慢慢偏了30度。查了半天,发现是陀螺仪的零偏在温度变化时漂移了。从那以后,我对陀螺仪的零偏检测就特别上心。
常见的故障特征:
- 零偏过大:静止时输出不为0,且超过阈值。
- 零偏漂移:零偏随时间或温度变化。
- 噪声异常:角速度信号出现高频抖动。
- 卡死:输出值固定不变。
3.2.1 一致性校验(静止检测)
这个方法的核心思想是:当飞行器静止时,陀螺仪的三轴输出应该都接近0。如果某一轴的输出明显不为0,那就说明有问题。
具体做法是:
- 检测飞行器是否处于静止状态(可以通过加速度计的模值来判断,如果|A|接近g,且变化很小,就认为静止)。
- 在静止状态下,采集陀螺仪三轴输出,计算均值。
- 如果均值超过阈值(比如0.5度/秒),就判定为故障。
3.2.2 阈值检测(角速度范围校验)
和加速度计一样,陀螺仪也有量程。比如±250度/秒、±500度/秒、±1000度/秒、±2000度/秒。如果输出值超过了量程的105%,就触发报警。
这里有个细节:陀螺仪在高速旋转时,输出可能会因为非线性而略微超出量程。所以,阈值可以适当放宽到110%。
3.3 综合检测流程
在实际工程中,我不会只用一种方法。我会把一致性校验和阈值检测结合起来,形成一个多级检测流程。
下面是我常用的一套逻辑,画成流程图大家看得更清楚:
这个流程我用了很多年,基本能覆盖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;
}
好了,这一讲就到这里。IMU故障检测是飞控系统安全的基础,希望这些经验能帮到你。下次见。
公众号:蓝海资料掘金营,微信deep3321