传感器故障模式分析(上):摄像头与激光雷达
各位同学,今天我们正式进入传感器故障诊断的核心环节。说实话,传感器是智能驾驶的「眼睛」,眼睛出了问题,后面的决策规划再牛也白搭。我个人习惯把传感器故障分成两类:一类是「硬件本身坏了」,另一类是「数据质量不行了」。今天聊的,主要是后者——数据层面的异常。
你想想看,摄像头被泥巴糊住,激光雷达被雨滴干扰,这些都不是硬件彻底报废,但数据已经没法用了。怎么发现?怎么判断?怎么处理?这就是我们要啃的硬骨头。
核心观点:传感器故障诊断,本质上是「数据质量评估」。不是等坏了再修,而是要在数据流中实时发现「不对劲」。
一、摄像头故障模式
摄像头是智能驾驶最常用的传感器,但也是最娇气的。我遇到过一台测试车,大晴天突然报「视觉丢失」,查了半天,结果是前车扬起的灰尘刚好糊在镜头上。嗯,这种偶发故障最头疼。
1. 遮挡故障
遮挡分两种:物理遮挡(泥巴、树叶、贴膜)和光学遮挡(强光直射、逆光)。
诊断方法:
- 图像熵检测:计算图像的信息熵。正常道路场景熵值通常在5-7之间,遮挡后可能降到2以下。我习惯设一个动态阈值,根据当前光照条件自适应调整。
- 边缘密度分析:用Sobel算子提取边缘,正常图像边缘像素占比约8%-15%,遮挡后可能低于3%。
- 一致性校验:对比左右摄像头或与前向雷达的感知结果。如果摄像头说「前面没车」,但雷达说「有车」,那大概率摄像头被遮了。
// 遮挡检测伪代码
float computeEdgeDensity(Mat image) {
Mat gray, edges;
cvtColor(image, gray, COLOR_BGR2GRAY);
Sobel(gray, edges, CV_32F, 1, 0);
int edgePixels = countNonZero(edges > threshold);
return (float)edgePixels / (image.rows * image.cols);
}
// 经验阈值:低于0.03 触发遮挡告警
if (edgeDensity < 0.03) {
triggerFault("CAMERA_OCCLUSION");
}
避坑指南:我曾经在雨夜测试时,发现边缘密度频繁低于阈值。后来才意识到,雨滴本身也会造成边缘模糊。解决方案是加入「雨量传感器信号」作为辅助判断——下雨天适当降低遮挡检测的灵敏度。
2. 曝光异常
曝光问题说白了就是「太亮」或「太暗」。隧道出入口、夜间对向远光灯,都是高发场景。
关键指标:
| 指标 | 正常范围 | 异常表现 |
|---|---|---|
| 平均亮度 | 80-180(8bit图像) | <30 过暗 / >220 过曝 |
| 直方图方差 | >2000 | <500 表示图像过于平坦 |
| 过曝像素占比 | <5% | >20% 触发告警 |
我个人习惯用「直方图双峰检测」来判断曝光是否合理。正常场景的直方图通常有两个峰(暗部+亮部),过曝时只有一个峰挤在255附近。
3. 帧率异常
帧率问题容易被忽视,但影响很大。摄像头标称30fps,实际可能掉到15fps甚至更低。原因可能是:USB带宽不足、ISP处理过载、或者干脆是硬件老化。
诊断策略:
- 统计1秒内实际收到的帧数,与标称帧率对比
- 计算帧间时间戳间隔,正常应稳定在33ms±5ms(30fps)
- 如果连续3秒帧率低于标称值的80%,触发降级
注意:帧率抖动比帧率降低更危险。我遇到过一种情况:帧率在28-32fps之间来回跳,导致目标跟踪的卡尔曼滤波器频繁重置。后来加了「帧率稳定性指数」——计算连续10帧时间戳的方差,超过阈值就告警。
二、激光雷达故障模式
激光雷达比摄像头「抗造」一些,但故障模式更隐蔽。说白了,摄像头坏了你能看到图像花屏,激光雷达坏了你可能只看到点云「少了几根线」——不仔细看根本发现不了。
1. 点云缺失
点云缺失分两种:局部缺失(某几根激光线没数据)和全局缺失(整个帧没数据)。
诊断方法:
- 线束完整性检查:对于16线雷达,检查每根线束的点数是否在正常范围(通常每线200-500点)。如果某根线束点数低于正常值的10%,判定为缺失。
- 距离分布分析:正常点云在近处(0-30m)和远处(30-80m)都有分布。如果所有点都集中在近处,可能是远距离接收器故障。
- 回波率检测:计算「发射脉冲数 / 接收回波数」的比值。正常回波率在60%-90%之间,低于40%说明有系统性问题。
// 线束完整性检测
for (int line = 0; line < NUM_LINES; line++) {
int pointCount = countPointsInLine(pointCloud, line);
float ratio = (float)pointCount / expectedCount[line];
if (ratio < 0.1) {
// 该线束严重缺失
lineHealth[line] = FAULT;
} else if (ratio < 0.5) {
lineHealth[line] = DEGRADED;
}
}
// 如果连续3帧超过30%的线束处于FAULT状态
if (faultLineRatio > 0.3) {
triggerDegradation("LIDAR_LINE_LOSS");
}
经验之谈:我曾经在矿区测试时,发现雷达总是报「线束缺失」。排查后发现是扬尘太大,近处灰尘反射太强,导致接收器饱和。解决方案是加入「近场屏蔽」——对0-2米内的点云做特殊处理,不参与线束完整性统计。
2. 噪点激增
噪点就是「不该出现的点」。雨雪、雾霾、甚至飞虫,都会产生噪点。但最头疼的是「串扰噪点」——多台激光雷达同时工作时,互相干扰产生的假点。
噪点特征:
- 孤立点:周围1米内没有其他点
- 回波强度异常:噪点的反射强度通常远低于正常目标
- 时间不连续:上一帧没有,这一帧突然出现,下一帧又消失
诊断指标:
| 指标 | 计算方法 | 告警阈值 |
|---|---|---|
| 孤立点比例 | 孤立点数 / 总点数 | >15% |
| 平均回波强度 | 所有点强度均值 | <30(正常>50) |
| 帧间一致性 | 连续3帧中同一位置出现点的概率 | <20% |
3. 视场角偏移
这是最危险的故障之一。激光雷达的视场角(FOV)如果发生偏移,你看到的「前方」可能实际上是「左前方」。车辆会朝着错误的方向规划路径。
原因分析:
- 机械振动导致扫描机构松动
- 安装支架变形(尤其是商用车,长期颠簸)
- 温度变化导致光学元件热胀冷缩
诊断方法:
我习惯用「地面平面拟合」来检测FOV偏移。正常雷达扫描到的地面应该是一个平面,如果FOV偏移,地面平面会倾斜或出现扭曲。
// 地面平面拟合检测FOV偏移
// 1. 提取地面点(高度在-0.5m到0.2m之间)
// 2. 用RANSAC拟合平面方程 ax + by + cz + d = 0
// 3. 计算平面法向量与理想法向量(0,0,1)的夹角
float computeGroundAngle(PointCloud cloud) {
Plane groundPlane = ransacFitPlane(cloud, 1000);
Vector3f normal = groundPlane.getNormal();
float angle = acos(normal.dot(Vector3f(0,0,1)));
return angle * 180 / M_PI;
}
// 正常角度 < 2度,超过5度触发告警
if (groundAngle > 5.0) {
triggerFault("LIDAR_FOV_SHIFT");
}
重要提醒:FOV偏移的检测不能只依赖单一方法。我建议同时使用「静态目标校验」——在车辆前方放置已知位置的标定物,定期比对雷达检测到的位置与实际位置。偏移超过0.5度就要考虑重新标定。
三、知识体系总览
下面这张图总结了今天讲的核心内容。你可以把它当作故障诊断的「检查清单」。
好了,今天的内容就到这里。摄像头和激光雷达的故障模式,说白了就是「数据质量出了问题」。诊断的核心思路是:先定义「正常」的指标范围,然后实时监控偏差。下一节我们会继续聊毫米波雷达和超声波雷达的故障模式,以及多传感器融合时的降级策略。
课后思考:如果你同时收到「摄像头遮挡」和「激光雷达点云缺失」两个告警,你会优先处理哪一个?为什么?