图1.图像上的激光雷达点
激光雷达和照相机是用于感知和理解场景的两个基本传感器。他们建立周边环境模型、提供检测和确定其他对象位置的方法,从而为机器人提供了安全导航所需的丰富语义信息。许多研究人员已开始探索用于精确3D对象检测的多模式深度学习模型。Aptiv开发的PointPainting [1]算法是一个非常有趣的例子。
那么为什么要将这2个传感器进行融合?
在捕获更密集和更丰富的表现方面,相机的性能优于LIDAR。从图2中,仅看稀疏点云,就很难正确地将黑匣子识别为行人。但是注意RGB图像,即使人朝后,我们也可以很容易地看出物体看起来像行人。除此之外,其他的想通信号灯和道路标志都是激光雷达很难解决的问题,但是可以很简单的通过视觉图像进行处理。
图2.行人检测的RGB和点云表示
相反,激光雷达可以很好提取距离信息,但是使用相机以标准透视图进行测量距离则非常困难。
通过融合来自两个传感器的信息,利用两个传感器的优势,克服各自的局限性。搭载多个传感器还可以实现冗余,这是是在传感器发生故障时的重要保障。
目的
在本文中,我们将进一步探讨如何同时利用LIDAR和相机数据,以创建更加丰富和准确的环境3D场景。
我们将使用Kitti 3D对象检测数据集 作为参考。请参阅Kitti Dataset网站或文件夹下Github 上的代码 以了解数据格式。
剩下的部分,我们首先需要讨论传感器安装相关的问题,通过Kitti对象检测数据集来了解数据结构,并通过如何进行校准以了解校准矩阵。接下来,将详细介绍3D-2D和2D-3D投影映射,最后以可视化的方式显示激光雷达与摄像机的数据。所有inline文本格式都是函数,变量或代码中的文件 。
传感器设置,校准和坐标系(KITTI)
图3. Kitti ego车辆和传感器位置
在开始分析之前,需要了解数据采集过程中传感器的相对位置。这是在一个坐标系到另一个坐标系之间执行任何转换的必要信息。请注意,每个传感器都有其自己的坐标框架,如图3所示。
硬件规格
Kitti车辆上的几个传感器包括激光雷达,灰度相机,彩色相机和IMU。但是,我们只关注:
• 凸轮0:灰度摄像机,立体声装备的左摄像机。这也是参考相机
• 摄像头2:RGB彩色摄像头,立体声装备的左摄像头
• Velo:64光束Velodyne激光扫描仪
坐标系:车辆面向左,左坐标系(图3)
我们有什么数据?
请参阅以data/readme.txt获取更多详细信息。
激光雷达点云fileid.bin:2D数组[num_points, 4]。
对象实例fileid_label.txt:对于每一行,每个对象的注释都有15列,代表相机坐标中的某些元数据和3D框属性:
type | truncation | visibility | observation angle | xmin | ymin |xmax | ymax | height | width | length | tx | ty | tz | roty
一些实例type被标记为“ DontCare”,表明它们没有被标记。
RGB图像fileid_image.png:来自摄像机2的图像
校正参数
fileid_calib.txt
校准参数以行优先顺序存储。包含3x4投影矩阵参数,这些参数描述了世界坐标系上3D点到图像中2D点的映射。
校准过程在[2]中说明。需要注意的是将校准cam0用作参考传感器。激光扫描仪相对于参考相机坐标系进行配准。R_ref2rect在校准过程中也已经被考虑,以校正摄像机之间的平面。
它包含以下信息:
• P_rect[i]:从校正参考相机框架到投影的投影变换cam[i]。注意,bx [i]表示相对于参考摄像机0的基线。
• R0_rect :旋转以说明参考摄像机中点的校正。
• Tr_velo_to_cam:从激光雷达到参考相机的欧几里德变换cam0。
框间投影
从线性代数的角度,投影矩阵在以均匀的坐标中表示为一个线性变换,它通过从一个向量空间到另一个向量空间x'= Px的乘法来改变点。可以对其进行合成以遍历不同的坐标系。
在这种情况下,转换矩阵主要表示传感器之间的刚体转换以及从3D到2D点的透视投影。
从激光雷达到摄像机2的投影project_velo_to_cam2:假设我们要将Velodyne点转换为摄像机坐标则:
proj_mat = P_rect2cam2 *R_ref2rect *P_velo2cam_ref
注意,乘法应在同构坐标中执行以简化计算。要转换为像素坐标,只需通过z坐标进行归一化即可。
图4.转换步骤
从摄像机到激光雷达坐标的投影:3D框的注释在摄像机坐标中给出。如果要将相机框架中的框形顶点转换为激光雷达,则project_cam2_to_velo需要计算逆刚性变换并向后变换。
R_ref2rect_inv = np.linalg.inv(R_ref2rect)P_cam_ref2velo = np.linalg.inv(velo2cam_ref)
proj_mat = R_ref2rect_inv * P_cam_ref2velo
图片框
方框通常用于代表其他特工和行人。通过定义8个顶点将对象完全定位为盒模型,以便获取和注释。框框可能不是最好的代表行人,因为行人不拘泥。
还有其他一些表示对象的方法,其中包括值得考虑的关键点,cad模型和分段蒙版。
图5.在图像平面上显示框
我们可以得到盒子的位置(t),盒子在摄像机坐标系中的偏航角(R)(假设没有俯仰和滚动)以及尺寸:高度(h),宽度(w)和长度(l)。请注意,在相机坐标中标注了对象的3D框!有了这些信息,我们可以轻松地将盒子模型转换为相机空间中的确切位置。
考虑上面的图5,每个盒子实例的原点都设置在底部和中央,对应于与自我车辆和地面相同的高度。要将3D框投影到图像:
• 首先,我们得到在照相机的方块经由坐标[R | T],其中R = roty和t = (tx, ty, tz)从注释中label.txt
• 接下来,将透视投影应用于图像平面 P_rect2cam2
图片中的PointCloud [3D-2D]
图6.图像上激光雷达点的颜色编码范围值
如果我们想以2D方式处理数据,则可以通过将点云投影到图像上以使用相应的激光雷达范围值(z)构造稀疏深度图表示来收集更多信息。稀疏性取决于映射到像素的激光雷达光束的数量。
与从摄像机预测深度图相比,稀疏深度图是方便且准确的范围数据。在伪Lidar ++中 描述了使用稀疏深度图来增强基于单眼的检测的工作。
要将点映射到像素,这是从激光雷达到像平面的投影变换。
• 计算投影矩阵project_velo_to_cam2。
• 投影指向图像平面。
• 删除图像边界之外的点。
PointCloud [2D-3D]中的框
激光雷达空间的可视化和工作在空间推理方面提供了最全面的理解。此外,如果需要,我们可以轻松地更改相机视角以从不同角度观察环境。
图7. 3D盒子投影到点云上
在此示例中,我们不考虑从360度旋转的LIDAR扫描仪绘制所有扫描点,而是仅考虑位于摄像机视场内的点云,如图4所示。接下来,我们只需要应用逆变换来使用投影将相机坐标系中的3D框投影到LIDAR 。
步骤如下:
• 计算投影矩阵project_velo_to_cam2。
• 投影指向图像平面。
• 删除图像边界之外的点。
• 将3D盒子投影到LIDAR坐标
结束
了解如何将数据从一个传感器转换到另一个传感器对于开发我们算法的性能至关重要。例如,假设我们正在研究基于单眼的3D检测器,则在将3D框注册到激光雷达点时,激光雷达点可以对检测器的精度进行完整性检查。
但是,当涉及传感器融合本身时,该任务仍然是一个挑战,因为多模式传感器在数据存储和处理方式上有一些差异,如前所述。这使得在运行时很难在几何上和时间上对齐。
参考
[1] Sourabh Vora,Alex H. Lang,Bassam Helou和Oscar Beijbom。点画:用于3D对象检测的顺序融合,2019年
[2] A. Geiger,F。Moosmann,O。Car和B. Schuster,“使用单发自动校准距离和摄像机传感器的工具箱”,ICRA,2012年
如果本文对小伙伴有帮助,希望可以在文末来个“一键三连”。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~