传感器故障模式分析(上):摄像头与激光雷达

各位同学,今天我们正式进入传感器故障诊断的核心环节。说实话,传感器是智能驾驶的「眼睛」,眼睛出了问题,后面的决策规划再牛也白搭。我个人习惯把传感器故障分成两类:一类是「硬件本身坏了」,另一类是「数据质量不行了」。今天聊的,主要是后者——数据层面的异常。

你想想看,摄像头被泥巴糊住,激光雷达被雨滴干扰,这些都不是硬件彻底报废,但数据已经没法用了。怎么发现?怎么判断?怎么处理?这就是我们要啃的硬骨头。

核心观点:传感器故障诊断,本质上是「数据质量评估」。不是等坏了再修,而是要在数据流中实时发现「不对劲」。

一、摄像头故障模式

摄像头是智能驾驶最常用的传感器,但也是最娇气的。我遇到过一台测试车,大晴天突然报「视觉丢失」,查了半天,结果是前车扬起的灰尘刚好糊在镜头上。嗯,这种偶发故障最头疼。

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度就要考虑重新标定。

三、知识体系总览

下面这张图总结了今天讲的核心内容。你可以把它当作故障诊断的「检查清单」。

传感器故障模式分析(上) 摄像头故障 遮挡故障 曝光异常 帧率异常 图像熵检测 边缘密度分析 直方图分析 帧间时间戳校验 激光雷达故障 点云缺失 噪点激增 视场角偏移 线束完整性检查 回波率检测 孤立点分析 地面平面拟合 核心原则:实时数据质量评估 + 多传感器一致性校验

好了,今天的内容就到这里。摄像头和激光雷达的故障模式,说白了就是「数据质量出了问题」。诊断的核心思路是:先定义「正常」的指标范围,然后实时监控偏差。下一节我们会继续聊毫米波雷达和超声波雷达的故障模式,以及多传感器融合时的降级策略。

课后思考:如果你同时收到「摄像头遮挡」和「激光雷达点云缺失」两个告警,你会优先处理哪一个?为什么?


专注资料整理