第三章 空间对齐与融合:点云与图像投影、多传感器时间戳同步、外参在线/离线标定方法
各位同学,欢迎来到第三章。前两章我们把坐标系、旋转矩阵、四元数这些基础打牢了。这一章,咱们要动真格的了——把激光雷达的点云和相机的图像真正“对齐”到一起。
说白了,就是让机器知道:激光雷达看到的那个点,对应到图像上是哪个像素。这件事做不好,你后面做目标检测、语义分割、SLAM建图,全是空中楼阁。我在项目里见过太多团队,算法调得飞起,结果发现是外参标定错了,白忙活三个月。
3.1 点云到图像的投影:从3D到2D的映射
先讲最直观的。你有一个激光雷达点 P_lidar = (x, y, z),想把它投影到相机图像上,得到像素坐标 (u, v)。这个流程分三步:
- 激光雷达坐标系 → 相机坐标系:用外参 T_cam_lidar 做刚体变换
- 相机坐标系 → 归一化平面:用相机内参做透视投影
- 归一化平面 → 像素坐标:考虑畸变,得到最终 (u, v)
公式写出来就是:
// 伪代码:点云投影到图像
P_cam = R * P_lidar + t // 外参变换
x_norm = P_cam.x / P_cam.z // 归一化
y_norm = P_cam.y / P_cam.z
u = fx * x_norm + cx // 内参投影
v = fy * y_norm + cy
嗯,这里要注意:P_cam.z 必须大于0,否则点在相机后面,投影没意义。我早期写代码时没加这个判断,结果点云投影到图像上出现一堆“鬼影”,排查了半天才发现是z值为负的点也被投影了。
3.2 多传感器时间戳同步:别让“时间差”毁了你的融合
空间对齐搞定了,时间对齐呢?你想想看,激光雷达是10Hz,相机是30Hz,IMU是200Hz。它们采集数据的时间点不可能完全重合。如果你直接用最近的一帧图像去匹配点云,车辆在高速运动时,误差可能达到几十厘米。
我个人习惯把时间同步分为两个层次:
| 同步层次 | 方法 | 适用场景 |
|---|---|---|
| 硬同步 | 硬件触发线(PPS、GPS秒脉冲) | 自动驾驶、机器人高精度建图 |
| 软同步 | 时间戳对齐 + 插值 | 消费级设备、低成本方案 |
硬同步是最可靠的。我记得在做一个园区无人车项目时,激光雷达和相机都用GPS的PPS信号触发,时间戳误差控制在微秒级。但硬件成本高,不是所有场景都适用。
软同步更常见。做法是:
- 所有传感器统一使用同一个时钟源(比如系统时间或GPS时间)
- 找到时间戳最接近的激光帧和图像帧
- 如果精度要求高,可以用IMU数据做插值,把点云“补偿”到图像曝光时刻
3.3 外参标定:离线 vs 在线
外参标定,说白了就是求 T_cam_lidar 这个4x4矩阵。方法分两类:离线标定和在线标定。
3.3.1 离线标定:经典但繁琐
离线标定需要标定物。常见的有:
- 棋盘格 + 反射板:在棋盘格上贴高反光材料,激光雷达能检测到,相机也能看到
- 三面体标定架:利用平面约束,同时优化激光雷达和相机的位姿
- 自然场景特征:比如用角点、边缘等,但鲁棒性差一些
我常用的开源工具是 lidar_camera_calibration(ROS包)。流程大致是:
- 采集多组标定物数据(至少10组不同角度)
- 手动或自动提取激光雷达中的标定物点云
- 提取图像中的标定物角点
- 用PnP或非线性优化求解外参
# 示例:使用ROS的lidar_camera_calibration
rosrun lidar_camera_calibration calibrate \
--lidar_topic /velodyne_points \
--camera_topic /camera/image_raw \
--calibration_file chessboard.yaml
3.3.2 在线标定:动态环境下的救命稻草
离线标定有个致命问题:车辆振动、温度变化、碰撞都会导致外参漂移。你想想看,自动驾驶车跑了一天,摄像头支架可能因为热胀冷缩偏了0.1度,这在100米外就是17厘米的误差。
在线标定就是解决这个问题的。它不需要标定物,利用SLAM或里程计估计的位姿,实时优化外参。常见方法:
- 基于互信息(Mutual Information):最大化点云强度与图像灰度之间的相关性
- 基于边缘对齐:提取点云中的边缘和图像中的边缘,最小化距离
- 基于深度学习的端到端方法:用网络直接预测外参偏移量
我个人比较推荐 基于边缘对齐 的方法。原因很简单:边缘在点云和图像中都很稳定,不受光照变化影响。我在一个港口AGV项目里用过,外参漂移了0.5度,在线标定跑了10秒就收敛回来了。
minimize ∑ || π(T_cam_lidar * P_lidar) - u_edge ||²
其中 π 是投影函数,u_edge 是图像中对应的边缘像素坐标。
3.4 本章知识体系图
下面这张图,是我自己梳理的本章核心逻辑。你可以把它当作一个“思维导图”来用:
3.5 实战中的常见问题与解决思路
最后,我把自己这些年踩过的坑总结一下,希望能帮你少走弯路:
- 投影后点云和图像边缘对不上:先检查外参,再检查内参,最后检查时间戳。80%的情况是外参标定数据不够好。
- 在线标定不收敛:可能是初始值太差。我建议先用离线标定给个初值,再跑在线优化。
- 时间戳抖动严重:检查传感器驱动,看是不是用了不同的时钟源。统一用GPS时间或系统时间。
- 点云投影到图像上全是黑的:嗯,这个我遇到过。原因是激光雷达的强度值没归一化,直接当灰度用了。记得把强度值映射到0-255范围。
好了,这一章的内容就到这里。空间对齐与融合,说白了就是“让传感器说同一种语言”。你掌握了投影、同步、标定这三板斧,后面做SLAM、做感知,都会顺手很多。
可可精品资料库