一、传感器基础与标定:激光雷达与摄像头,先让它们“说同一种语言”
大家好,我是你们这堂课的讲师。咱们直接切入正题——传感器基础与标定。说实话,我见过太多项目,算法模型调得再牛,一上路就翻车。为什么?八成是传感器没“对齐”。你想想看,摄像头说“障碍物在左边”,激光雷达说“在右边”,这车能开稳吗?所以,这一章咱们就把激光雷达和摄像头的老底儿摸清楚,再教你怎么让它们“说同一种语言”。
2.1 激光雷达工作原理:TOF 与 FMCW
激光雷达,说白了就是“用激光当尺子量距离”。目前主流方案就两种:TOF 和 FMCW。我刚开始接触时也觉得差不多,后来踩了坑才发现,两者性格完全不同。
2.1.1 TOF(飞行时间法)
TOF 的原理特别直白:发射一束激光,等它打到物体上反射回来,记下这段时间差。光速是固定的,距离 = 光速 × 时间 / 2。嗯,就这么简单。
核心公式:
d = (c × Δt) / 2
其中 c 是光速(约 3×10⁸ m/s),Δt 是发射到接收的时间差。
我在项目里用过一款 905nm 的 TOF 激光雷达,测距能到 200 米。但有个坑——它怕“多路径干扰”。什么意思?就是激光打到玻璃上,一部分反射回来,一部分穿过去打到后面的墙再反射回来。雷达收到两个回波,容易算错。我曾经在隧道出口遇到过这种情况,点云里凭空多出一堵“鬼墙”,吓得我赶紧加了回波处理逻辑。
2.1.2 FMCW(调频连续波)
FMCW 就聪明多了。它不直接测时间,而是发射频率连续变化的激光。反射回来的光频率会有偏移,通过对比发射和接收的频率差,就能算出距离和速度。说白了,它把“测距”变成了“测频”。
| 特性 | TOF | FMCW |
|---|---|---|
| 测距原理 | 直接测量飞行时间 | 测量发射与接收的频率差 |
| 抗干扰能力 | 较弱(易受多路径影响) | 强(可区分不同回波) |
| 速度测量 | 需多帧推算 | 单帧即可测速 |
| 成本 | 较低(目前主流) | 较高(技术仍在发展) |
我的建议:如果做 L4 级自动驾驶,预算充足,FMCW 是未来趋势。但如果你现在就要量产,TOF 更成熟、供应链更稳定。别问我怎么知道的——两年前我选型时纠结了整整两周。
2.2 摄像头成像模型:针孔模型与畸变
摄像头嘛,大家都熟悉。但你真的理解它怎么把三维世界变成二维图像的吗?这里有两个核心概念:针孔模型和畸变。
2.2.1 针孔模型
针孔模型是摄像头最基础的成像模型。想象一个暗箱,前面戳个小孔,光线穿过小孔在后面的感光元件上成像。数学上,它把三维点 (X, Y, Z) 映射到图像平面 (u, v):
u = fx * X / Z + cx
v = fy * Y / Z + cy
这里 fx, fy 是焦距(以像素为单位),cx, cy 是主点坐标(图像中心)。这些参数就是摄像头的“内参”。
我记得第一次自己标定摄像头时,拿着棋盘格在镜头前晃了半天,结果标出来的 fx 和 fy 差了 5 个像素。后来才发现,是我把棋盘格放得太近了,标定板没占满视野。嗯,这都是经验。
2.2.2 畸变
现实中的镜头不是完美的针孔。为了多进光,镜头是凸的,这就带来了畸变。主要有两种:
- 径向畸变:图像边缘向里凹(桶形畸变)或向外凸(枕形畸变)。鱼眼镜头就是典型的桶形畸变。
- 切向畸变:镜头和感光元件不平行,导致图像倾斜。
畸变矫正公式长这样:
x_corrected = x * (1 + k1*r² + k2*r⁴ + k3*r⁶) + [2*p1*x*y + p2*(r² + 2*x²)]
y_corrected = y * (1 + k1*r² + k2*r⁴ + k3*r⁶) + [p1*(r² + 2*y²) + 2*p2*x*y]
看着复杂?其实 OpenCV 一行 cv2.undistort() 就搞定了。但要注意,畸变系数 k1, k2, k3, p1, p2 必须标定准确。我曾经偷懒用了默认参数,结果融合出来的点云和图像差了半个车身——教训深刻。
2.3 传感器内参标定
内参标定,就是找到每个传感器“自己”的参数。激光雷达的内参主要是激光发射角度、旋转速度等;摄像头内参就是上面说的 fx, fy, cx, cy 和畸变系数。
摄像头标定最常用的方法是张正友标定法。你需要打印一张棋盘格,拍 10-20 张不同角度的照片,然后用 OpenCV 的 cv2.calibrateCamera() 计算。我个人习惯在标定时让棋盘格占满画面的 1/3 到 2/3,角度变化要够大(俯仰、偏航、侧倾都来点),这样标出来的结果才稳定。
避坑指南:我曾经在户外标定时,阳光太强导致棋盘格反光,角点检测全偏了。后来我改用哑光材质的标定板,并在阴天或室内进行。记住:标定环境的光照要均匀,别让太阳直射。
2.4 激光雷达与摄像头联合外参标定
外参标定,就是找到激光雷达和摄像头之间的“相对位置和朝向”。说白了,你要知道激光雷达坐标系里的一个点,在摄像头图像里对应哪个像素。
2.4.1 手动标定方法
手动标定是最传统的方法。你需要找一个标定物(比如棋盘格或三角锥),让激光雷达和摄像头同时看到它。然后手动选取对应点,解算旋转矩阵 R 和平移向量 t。
具体步骤:
- 放置标定物,确保在两者视野内。
- 从激光雷达点云中提取标定物的中心点坐标。
- 从摄像头图像中提取标定物的像素坐标。
- 用 PnP 算法(如 EPnP)求解外参。
我早期做标定时,用的是 3D 打印的三角锥,顶点贴了反光纸。激光雷达打上去特别亮,点云里一眼就能找到。但手动标定有个问题——你选的点准不准,直接影响结果。我试过同一个场景标了三次,外参差了 2 厘米,后来干脆写了个脚本自动选点。
2.4.2 自动标定方法
自动标定是现在的趋势。它不需要人工选点,而是利用自然场景中的特征(比如建筑物边缘、地面平面)自动匹配。
主流思路有两种:
- 基于边缘匹配:提取图像中的边缘(如 Canny 检测),再提取点云中的深度不连续边缘,然后优化外参使两者对齐。
- 基于互信息:把点云投影到图像上,计算投影后的强度值与图像灰度值的互信息,最大化这个值就是最优外参。
我记得在某个量产项目里,我们用了基于边缘匹配的自动标定方法。一开始效果不错,但遇到雨天就崩了——雨滴在点云里产生大量噪点,边缘提取全乱了。后来我们加了滤波和 RANSAC 剔除异常点,才算稳住。
我的经验:自动标定虽然方便,但建议先用手动标定得到一个“初值”,再用自动方法微调。纯自动标定容易陷入局部最优,尤其是场景特征不丰富时。先粗后精,稳得很。
好了,这一章的内容就到这里。传感器基础与标定是融合感知的“地基”,地基不稳,上层建筑再漂亮也是白搭。下一章咱们会深入聊聊点云处理,到时候见。
公众号:蓝海资料掘金营,微信deep3321