4、传感器故障诊断(上):GPS/IMU故障模式与诊断算法
各位同学,今天我们进入传感器故障诊断这个硬核话题。说实话,在自动驾驶系统里,传感器就是车的眼睛和耳朵。眼睛花了,耳朵聋了,车还怎么开?所以故障诊断这块,我把它放在整个课程比较靠前的位置,就是因为它太重要了。
今天我们先聊GPS和IMU这对老搭档。为什么把它们放一起?因为在实际工程中,这两个传感器是互补的。GPS提供绝对位置,但更新慢、容易受干扰;IMU提供相对运动,更新快、但会累积误差。两者配合使用,才能保证定位的鲁棒性。
4.1 GPS故障模式:信号丢失、漂移、多路径效应
GPS的故障模式,我归纳起来主要有三种。这三种我在项目里都踩过坑,一个一个说。
4.1.1 信号丢失
信号丢失是最直观的故障。车开进隧道、地下车库、高楼林立的城市峡谷,GPS信号直接就没了。嗯,说白了就是卫星被遮挡了。
我遇到过最极端的情况,是在一个高架桥下面。桥体是钢结构的,GPS信号完全被屏蔽。车在桥下走了大概200米,定位直接跳到了几百米外。那次之后,我就在系统里加了一条硬规则:如果GPS信号强度低于某个阈值,立刻切换到纯IMU推算模式。
- 可见卫星数:通常需要≥4颗才能解算三维位置
- 信号载噪比(C/N0):低于30 dB-Hz时,信号质量不可靠
- 位置精度因子(PDOP):大于6时,几何构型差,定位精度下降
4.1.2 漂移
漂移比信号丢失更隐蔽。信号还在,卫星也能看到,但位置就是慢慢偏了。为什么会这样?大气层延迟、卫星钟差、轨道误差,这些因素叠加起来,就会让GPS位置慢慢飘走。
我记得有一次路测,车在一条笔直的公路上开。GPS显示车辆在车道内正常行驶,但实际车辆已经压到车道线了。这就是典型的漂移故障。后来我们分析,是当天电离层活动比较剧烈,导致信号延迟异常。
| 漂移类型 | 典型特征 | 影响范围 |
|---|---|---|
| 缓慢漂移 | 位置误差随时间线性增长 | 通常<5米/小时 |
| 突发漂移 | 短时间内位置跳变 | 可达10-50米 |
| 周期性漂移 | 与卫星几何构型相关 | 随卫星运动变化 |
4.1.3 多路径效应
多路径效应,说白了就是GPS信号不是直线过来的,而是经过建筑物、地面反射后才到达接收机。反射信号比直射信号多走了一段路,导致测距出现误差。
这个故障在城市环境中特别常见。我做过一个测试,把车停在一栋玻璃幕墙大楼旁边,GPS定位误差直接飙到了30米。玻璃幕墙简直就是GPS信号的反射镜。
4.2 IMU故障模式:零偏、刻度因子、噪声
IMU的故障模式和GPS不太一样。IMU是惯性器件,它的故障更多体现在内部参数的变化上。
4.2.1 零偏
零偏,就是IMU在静止状态下,输出不为零。比如陀螺仪,你把它放在桌子上不动,它应该输出0度/秒,但实际可能输出0.01度/秒。这个偏差虽然小,但积分之后,角度误差会越来越大。
我遇到过最头疼的一次,是IMU的温度漂移。车在夏天暴晒后启动,IMU的温度从40度升到70度,零偏直接翻了一倍。那次之后,我就在系统里加了温度补偿模型。
4.2.2 刻度因子
刻度因子误差,就是IMU输出的比例不对。比如加速度计,实际加速度是1g,它输出0.98g。这个误差在剧烈运动时会特别明显。
嗯,这里要注意:刻度因子误差和零偏是两种不同的误差。零偏是加法误差,刻度因子是乘法误差。诊断的时候要分开处理。
4.2.3 噪声
IMU的噪声是随机的,无法完全消除。但噪声过大的时候,说明IMU可能已经老化了,或者受到了振动干扰。
我个人习惯,在IMU出厂时都会做一次 Allan方差分析,确定噪声的功率谱密度。如果运行过程中噪声水平突然升高,基本可以判定IMU出了问题。
4.3 诊断算法:残差检验
好了,故障模式讲完了,接下来是诊断算法。第一个要讲的是残差检验。这是我最常用的方法,简单有效。
残差检验的核心思想:用传感器测量值和模型预测值做差,如果差值太大,说明传感器可能出问题了。
具体怎么做?我举个例子。假设我们用GPS和IMU做组合导航。卡尔曼滤波器会输出一个预测位置,GPS会输出一个测量位置。两者的差值就是残差。
// 残差计算伪代码
// 预测位置来自IMU积分
predicted_position = imu_integrate(imu_data, last_position);
// 测量位置来自GPS
measured_position = gps_get_position();
// 计算残差
residual = measured_position - predicted_position;
// 判断是否超限
if (norm(residual) > threshold) {
// GPS可能故障
gps_fault_flag = true;
}
这里有个关键问题:阈值怎么设?设太小了,容易误报;设太大了,漏报风险高。我一般用3σ原则,也就是残差的3倍标准差作为阈值。
4.4 诊断算法:一致性校验
一致性校验,说白了就是看多个传感器之间是否「说的一样」。如果GPS说车在东经116度,IMU推算也在东经116度附近,那大概率没问题。如果两个传感器说的差很远,那至少有一个出问题了。
我常用的方法有两种:
4.4.1 传感器间一致性校验
这个方法需要至少两个独立的传感器。比如GPS和IMU,或者两个GPS接收机。
具体做法:
- 计算GPS和IMU的位置差
- 如果差值超过阈值,触发故障标志
- 但无法判断是哪个传感器故障,需要进一步分析
4.4.2 时间一致性校验
这个方法检查传感器自身的时间序列是否合理。比如GPS的位置变化速度,如果一秒钟内位置跳了100米,那肯定有问题。
我曾经遇到过一种情况:GPS信号被干扰,位置数据看起来很正常,但速度信息完全不对。时间一致性校验就能发现这种问题。
// 时间一致性校验示例
// 检查GPS速度是否合理
double gps_speed = calculate_speed(gps_position, dt);
if (gps_speed > MAX_VEHICLE_SPEED * 1.5) {
// 速度异常,GPS可能故障
gps_speed_fault = true;
}
// 检查IMU加速度是否合理
double imu_accel = imu_data.acceleration;
if (abs(imu_accel) > MAX_ACCELERATION * 1.5) {
// 加速度异常,IMU可能故障
imu_accel_fault = true;
}
4.5 小结
今天的内容就到这里。总结一下:
- GPS的三大故障模式:信号丢失、漂移、多路径效应
- IMU的三大故障模式:零偏、刻度因子、噪声
- 诊断算法:残差检验看测量值和预测值的差异
- 诊断算法:一致性校验看多个传感器之间是否一致
下一节我们会讲更高级的诊断方法,比如基于机器学习的故障分类,以及故障发生后的恢复机制。到时候我会分享一个实际项目中的案例,挺有意思的。
好,今天就到这里。有问题随时问我。
公众号:蓝海资料掘金营,微信deep3321