第四节:传感器外参标定——让多双眼睛看向同一个世界
做感知融合,最头疼的问题是什么?
我个人觉得,不是算法不够强,也不是算力不够用。而是——你明明知道激光雷达在那个位置,相机在这个位置,可它们看到的同一个物体,在坐标上就是死活对不上。
这背后的问题,就是外参。
4.1 什么是外参?
外参,全称叫「外部参数」。它描述的是两个传感器之间的相对位置和姿态关系。
说白了,就是回答三个问题:
- 激光雷达在相机的哪个方向?
- 它离相机多远?
- 它有没有歪着放?
外参通常用一个 4×4 的齐次变换矩阵来表示:
# 外参矩阵 T_cam_lidar
# 将激光雷达点云变换到相机坐标系
T = [[R11, R12, R13, tx],
[R21, R22, R23, ty],
[R31, R32, R33, tz],
[0, 0, 0, 1]]
其中 R 是 3×3 的旋转矩阵,t 是 3×1 的平移向量。
核心理解:外参标定的本质,就是求解这个 R 和 t。一旦求出来,激光雷达的每个点,都能投影到相机的图像上,实现「点云着色」或「目标对齐」。
4.2 相机到激光雷达的标定原理
原理其实不复杂。你想想看,相机看到的是像素,激光雷达看到的是三维点。它们之间唯一的共同语言是什么?
是——同一个物体在两种传感器下的观测。
标定的核心思路就是:
- 找一个在相机和激光雷达中都能清晰看到的物体(比如标定板)
- 在相机图像中提取该物体的特征(比如角点、边缘)
- 在激光雷达点云中提取该物体的特征(比如平面、边缘点)
- 建立 2D-3D 的对应关系,求解外参矩阵
我在项目中遇到过一种情况:标定板放得太远,激光雷达点云稀疏到根本看不清板子的边缘。嗯,那结果自然是一塌糊涂。
我的经验:标定距离一般控制在 3~8 米。太近,相机畸变影响大;太远,激光雷达分辨率不够。
4.3 手动标定 vs 自动标定
这两种方式我都用过,各有各的坑。
手动标定
说白了,就是人肉调参。你打开一个可视化工具,一边看点云投影到图像上的效果,一边手动调整旋转和平移参数。
- 优点:直观,适合调试阶段快速验证
- 缺点:精度看手感,重复性差,调一次累半天
我曾经手动标定一个 64 线激光雷达和相机的组合,调了整整一个下午。最后发现,手抖一下,误差就大了 0.1 度。0.1 度在 50 米外,就是将近 10 厘米的偏差。
自动标定
自动标定利用优化算法,自动求解外参。常见的方法有:
- 基于边缘对齐:将点云边缘投影到图像边缘,最小化距离
- 基于互信息:最大化点云反射强度与图像灰度之间的相关性
- 基于标定板:利用已知几何形状,建立精确对应
我的建议:量产项目一定要用自动标定。手动标定只能用于实验室验证,上了车,风吹日晒,外参迟早会偏,自动标定才能保证一致性。
4.4 标定板的用法
标定板,是外参标定中最常用的工具。它长什么样?
- 黑白棋盘格(类似相机标定用的那种)
- 带有反光边框的平板
- 甚至可以是带有特定图案的纸板
标定板的作用,就是提供一个「已知几何」的参考物。
具体用法分三步:
- 放置标定板:放在传感器前方,确保相机能看到完整图案,激光雷达能扫到板子表面
- 数据采集:同时录制相机图像和激光雷达点云。建议采集 10~20 组不同位置、不同角度的数据
- 特征提取与匹配:
- 相机端:提取棋盘格角点,得到 2D 坐标
- 激光雷达端:提取板子平面的点云,拟合平面,计算板子中心或边缘的 3D 坐标
# 伪代码:标定板角点提取与匹配
# 1. 相机图像中检测棋盘格角点
corners_2d = detect_chessboard_corners(image)
# 2. 激光雷达点云中提取标定板平面
plane_points = segment_plane_from_lidar(cloud)
corners_3d = compute_board_corners_from_plane(plane_points)
# 3. 建立 2D-3D 对应关系,求解 PnP
R, t = solve_pnp(corners_3d, corners_2d, camera_matrix)
注意:标定板不能太薄。激光雷达的激光束可能会穿透薄板,打到后面的背景上,导致点云中板子的形状失真。我见过有人用 A4 纸当标定板,结果点云里全是噪点。
知识体系总览
下面这张图,是我自己整理的外参标定知识结构。你可以把它当作一张地图,随时回来对照。
一个小技巧:如果你刚开始做外参标定,别一上来就搞自动标定。先用手动标定跑一遍流程,理解每个参数的意义。等你踩过坑了,再用自动标定,你会知道它在优化什么。
好了,外参标定这块,核心就是这些。记住一句话:标定不是一次性的,它是持续的过程。车开久了,螺丝会松,外参会偏。定期校验,才是工程常态。