感知模块调试:激光雷达点云调试、摄像头图像调试、毫米波雷达调试

感知模块,说白了就是自动驾驶系统的「眼睛」。眼睛要是花了,后面的规划控制全是白搭。我这些年调试感知模块踩过的坑,比走过的路还多。今天咱们就一个一个来捋清楚。

一、激光雷达点云调试

激光雷达点云,是感知系统里最可靠的数据源之一。但可靠归可靠,调试起来照样让人头疼。

1. 点云畸变问题

你有没有遇到过这种情况:明明是一堵笔直的墙,点云显示出来却是弯的?

这就是点云畸变。原因很简单——激光雷达在旋转扫描时,车辆本身也在运动。每一帧点云里的点,其实是在不同时刻、不同位置采集的。

核心思路:用IMU或轮速计的里程计信息,把每个点补偿到同一时刻的坐标系下。

我在项目中遇到过最离谱的一次,是车辆过减速带时点云直接「炸开」了。后来发现是IMU的震动滤波参数没调好,低频震动被当成了真实运动。

// 点云畸变补偿伪代码
for each point in cloud:
    // 获取该点的时间戳
    t = point.timestamp - cloud.start_timestamp
    // 根据时间差,插值得到该时刻的位姿
    pose = interpolate_pose(odometry, t)
    // 将点变换到起始时刻坐标系
    point_corrected = pose.inverse() * point

我的习惯:调试时先录一段静止场景的数据。如果静止场景下点云还有畸变,那就是雷达本身或驱动的问题,别急着调算法。

2. 点云滤波参数调优

原始点云数据量太大,直接处理CPU扛不住。所以得滤波。但滤波参数调不好,要么滤掉了有效目标,要么保留了太多噪声。

常用的滤波方法就这几个:

  • 体素滤波(Voxel Filter)——降采样,控制点云密度
  • 直通滤波(PassThrough Filter)——切掉不需要的高度/距离范围
  • 半径滤波(Radius Filter)——去除孤立噪点
滤波类型 关键参数 我的经验值
体素滤波 leaf_size(体素边长) 0.1m ~ 0.3m,视场景而定
直通滤波 z轴范围(高度) 一般保留 -0.5m ~ 3.0m
半径滤波 半径 + 最少点数 0.3m半径内至少3个点

嗯,这里要注意:体素滤波的leaf_size设得太小,点云还是密,计算量下不来;设得太大,小目标(比如行人)可能直接被滤没了。我一般从0.2m开始试,看效果再微调。

3. 点云配准与坐标系对齐

多激光雷达融合,或者激光雷达与地图对齐,都离不开点云配准。Autoware里最常用的是NDT(正态分布变换)算法。

NDT调试的核心参数就两个:

  • 分辨率(Resolution)——网格大小,影响配准精度和速度
  • 最大迭代次数——收敛条件

我曾经踩过的坑:NDT的初始位姿给得不准,算法直接发散。后来我养成了一个习惯——先用ICP粗配准,再用NDT精配准。虽然多了一步,但稳定性好很多。

二、摄像头图像调试

摄像头图像调试,说白了就是让算法「看懂」画面。这里头门道不少。

1. 图像畸变校正

摄像头镜头都有畸变,尤其是广角镜头。不校正的话,远处的物体位置会偏,车道线检测也会歪。

校正流程其实不复杂:

  1. 用棋盘格标定板拍20~30张不同角度的照片
  2. 用OpenCV或Kalibr工具提取角点,计算内参和畸变系数
  3. 生成校正映射表(remap),运行时直接查表校正
# 用OpenCV做畸变校正
import cv2
import numpy as np

# 加载标定结果
with np.load('calibration.npz') as data:
    mtx = data['camera_matrix']
    dist = data['dist_coeffs']

# 生成校正映射
h, w = img.shape[:2]
new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, new_mtx, (w,h), 5)

# 应用校正
undistorted = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)

我个人习惯:标定完一定要在实车上验证——找一条笔直的车道线,看校正后图像里的车道线是不是直的。不是的话,重新标。

2. 曝光与白平衡调试

你想想看,自动驾驶车从隧道出来的一瞬间,画面从暗变亮,算法很容易「懵掉」。

曝光和白平衡的调试,核心是找到「平衡点」:

  • 自动曝光(AE)——目标亮度值设多少?我一般设在100~120(8位图像)
  • 自动白平衡(AWB)——色温变化时,颜色不能偏得太离谱
  • 增益控制——增益太高,噪声就大;增益太低,暗处看不清

我在项目中遇到过最头疼的问题,是傍晚时分路灯和车灯混在一起,自动曝光来回跳,导致目标检测时有时无。后来我们改成了「慢速自适应曝光」,变化速率调低,画面就稳了。

3. 时间戳同步

摄像头和激光雷达的数据必须时间对齐,不然融合出来的结果就是「驴唇不对马嘴」。

Autoware里常用的做法是:

  • 用硬件触发信号(PPS或PTP)同步各传感器的时钟
  • 在软件层做时间戳对齐,找最近邻的时间戳匹配

注意:时间戳同步的误差不能超过10ms。超过这个范围,高速场景下的目标位置偏差就会很明显。我曾经吃过这个亏,后来加了个时间戳偏差监控模块,超时了就报警。

三、毫米波雷达调试

毫米波雷达,很多人觉得它「简单」,其实不然。它的调试坑也不少。

1. 多目标跟踪与杂波抑制

毫米波雷达的原始数据里,除了真实目标,还有大量杂波——护栏、地面、雨滴、甚至路边的金属广告牌。

调试的关键在于:

  • CFAR(恒虚警率)检测参数——保护单元和参考单元的窗口大小
  • 多目标跟踪(MTT)——航迹起始、维持、消亡的逻辑
  • 杂波图(Clutter Map)——静态杂波的背景建模
参数 作用 调试建议
CFAR保护单元 防止目标自身被当成杂波 一般设3~5个单元
CFAR参考单元 估计背景噪声水平 10~20个单元,视雷达分辨率而定
航迹起始阈值 连续多少帧检测到才确认目标 3帧起步,太少了虚警多

嗯,这里有个经验:高速公路场景和城市道路场景,CFAR参数最好分开调。高速上目标少但速度快,城市里目标多但速度慢,一套参数打天下是不现实的。

4. 雷达与视觉融合调试

毫米波雷达和摄像头融合,说白了就是「雷达给距离,视觉给类别」。但两者坐标系对齐是个麻烦事。

融合调试的步骤:

  1. 联合标定——找雷达和摄像头的相对位姿
  2. 投影验证——把雷达点投影到图像上,看是否对齐
  3. 关联匹配——用距离、角度、速度做数据关联

核心原则:雷达的测距精度高,但角度分辨率低;视觉的角度分辨率高,但测距精度差。融合时要「取长补短」。

我曾经调试过一个场景:前方有一辆静止的卡车,雷达检测到了,但视觉没检测到(因为卡车颜色和背景太像)。后来我们在融合逻辑里加了「雷达检测到但视觉没检测到的目标,先保留,等视觉确认后再输出」的策略,问题就解决了。

四、感知模块调试的通用方法论

说了这么多具体问题,最后总结几条通用的调试思路:

  • 先单传感器,后多传感器融合——每个传感器先调通,再谈融合
  • 先简单场景,后复杂场景——直道、晴天、低速先跑通,再上弯道、雨雾、高速
  • 数据驱动调试——遇到问题先录数据,回放分析,别在车上瞎调参数
  • 可视化是王道——点云、图像、检测结果,能可视化就可视化,肉眼比日志管用

我的最后一条建议:调试感知模块,耐心比技术更重要。一个问题可能反复出现,别急着改代码,先想清楚「为什么」。很多时候,问题不在算法本身,而在数据质量或标定精度上。

感知模块调试知识体系 激光雷达点云调试 摄像头图像调试 毫米波雷达调试 点云畸变补偿 滤波参数调优 NDT配准对齐 畸变校正 曝光与白平衡 时间戳同步 CFAR与杂波抑制 多目标跟踪 雷达视觉融合 通用方法论:单传感器→多传感器融合 | 简单场景→复杂场景 | 数据驱动 | 可视化

可可精品资料库