主要内容

激光雷达和相机校准

此示例演示如何估计三维激光雷达和相机之间的刚性变换。在本例的最后,您将能够使用刚性变换矩阵来融合激光雷达和相机数据。

此图解释了激光雷达和相机校准(LCC)过程的工作流程。

概述

激光雷达和摄像机传感器是自动驾驶应用中最常见的视觉传感器。摄像机提供丰富的颜色信息和其他特征,可以用来提取被检测物体的不同特征。另一方面,激光雷达传感器可以提供物体的精确三维位置和结构。为了增强目标检测和分类流水线,可以将两个传感器的数据融合在一起,获得更详细、更准确的目标信息。

以两个传感器之间的方向和相对位置为形式的变换矩阵是融合来自这两个传感器的数据的前兆。激光雷达摄像机校准有助于估计3-D激光雷达和安装在自主车辆上的摄像机之间的变换矩阵。在本例中,您将使用来自两个不同激光雷达传感器的数据,HDL64VLP16HDL64如图所示,从露台环境中收集数据。

数据以一组PNG图像和对应的PCD点云的形式捕获。这个例子假设摄像机的固有参数是已知的。有关提取相机固有参数的更多信息,请参见单相机校准。

加载数据

从Gazebo加载Velodyne HDL-64传感器数据。

imagePath = fullfile (toolboxdir (激光雷达的),“lidardata”低成本航空的“HDL64”“图像”); ptCloudPath=fullfile(toolboxdir(激光雷达的),“lidardata”低成本航空的“HDL64”“pointCloud”); cameraParamsPath=完整文件(imagePath,“校准。垫”);内在=负载(cameraParamsPath);加载相机固有功能imd = imageDatastore (imagePath);%使用imageDatastore加载图像pcd = fileDatastore (ptCloudPath,“ReadFcn”,@pcread);%加载点云文件imageFileNames = imds.Files;ptCloudFileNames = pcds.Files;squareSize = 200;%棋盘的正方形大小%设置随机种子以产生可重复的结果。rng(“默认”);

棋盘角点检测

本例使用了棋盘模式作为比较特性。棋盘边缘估计使用激光雷达和相机传感器。使用estimateCheckerboardCorners3d计算棋盘转角的坐标和中实际棋盘的大小.角是根据相机的坐标系统进行三维估计的。有关相机坐标系统的更多细节,请参见激光雷达工具箱中的坐标系

[imageCorners3d, checkerboardDimension, dataUsed] =...估计棋盘转角3d(imageFileNames,Insident.cameraParams,squareSize);imageFileNames=imageFileNames(dataUsed);%删除未使用的图像文件

可以使用helper函数将结果可视化helperShowImageCorners

%显示棋盘转角helperShowImageCorners(imageCorners3d、imageFileNames、内在.cameraParams)

激光雷达中的棋盘格检测

同样,使用检测三角形平面点功能检测激光雷达数据中的棋盘格。该函数根据输入尺寸检测点云中的矩形对象。在这种情况下,它使用上一节中计算的棋盘尺寸检测棋盘。

%从检测到的图像角点中提取ROIroi=帮助计算机(ImageCorner3D,5);%过滤与检测到的图像对应的点云文件ptCloudFileNames=ptCloudFileNames(dataUsed);[lidarCheckerboardPlanes,framesUsed,index]=...detectRectangularPlanePoints (ptCloudFileNames checkerboardDimension,“投资回报”,投资回报率);%删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames (framesUsed);%删除图像文件imageFileNames = imageFileNames (framesUsed);%从图像中删除三维角点imageCorners3d=imageCorners3d(:,:,帧使用);

要可视化检测到的棋盘,请使用助手棋盘格函数。

helperShowCheckerboardPlanes (ptCloudFileNames指数)

激光雷达和照相机的校准

使用estimateLidarCameraTransform来估计激光雷达与摄像机之间的刚性变换矩阵。

[tform, errors] = estimatelidarcamertransform (lidarCheckerboardPlanes,...imageCorners3d,“CameraIntrinsic”, intrinsic.cameraParams);

校准完成后,校准矩阵有两种使用方式:

  • 在图像上投射激光雷达点云。

  • 利用图像中的颜色信息增强激光雷达点云。

使用helperFuseLidarCamera作用将激光雷达和图像数据融合在一起。

helperFuseLidarCamera(图像文件名、ptCloudFileName、索引、,...内在。cameraParams tform);

误差可视化

定义了三种类型的误差来估计校准的精度:

  • 平移误差:激光雷达中棋盘格角的质心与图像中三维投影角之间的差异平均值。

  • 旋转误差:点云棋盘格法线与图像三维投影角点之间的平均差。

  • 重投影误差:图像角的质心与投影在图像上的激光雷达角的差的平均值。

使用Helpershower绘制估计的错误值。

HelperShower错误(错误)

真实数据测试

在实际VLP-16激光雷达数据上测试LCC工作流程,以评估其性能。

清晰;imagePath = fullfile (toolboxdir (激光雷达的),“lidardata”低成本航空的“vlp16”“图像”); ptCloudPath=fullfile(toolboxdir(激光雷达的),“lidardata”低成本航空的“vlp16”“pointCloud”); cameraParamsPath=完整文件(imagePath,“校准。垫”);内在=负载(cameraParamsPath);加载相机的固有功能imd = imageDatastore (imagePath);%使用imageDatastore加载图像pcd = fileDatastore (ptCloudPath,“ReadFcn”,@pcread);加载点云文件imageFileNames = imds.Files;ptCloudFileNames = pcds.Files;squareSize = 81;%棋盘的正方形大小%设置随机种子以产生可重复的结果。rng(“默认”);%从图像中提取棋盘格角点[imageCorners3d, checkerboardDimension, dataUsed] =...估计棋盘转角3d(imageFileNames,Insident.cameraParams,squareSize);imageFileNames=imageFileNames(dataUsed);%删除未使用的图像文件%过滤与检测到的图像对应的点云文件ptCloudFileNames=ptCloudFileNames(使用的数据);%从检测到的图像角点中提取ROIroi=帮助计算机(ImageCorner3D,5);%激光雷达数据中棋盘格的提取[lidarCheckerboardPlanes, framesUsed, indices] = detectRectangularPlanePoints(...ptcloudfilename、checkboarddimension、,“RemoveGround”符合事实的“投资回报”,投资回报率);imageCorners3d=imageCorners3d(:,:,帧使用);%删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames (framesUsed);%删除图像文件imageFileNames = imageFileNames (framesUsed);[tform, errors] = estimatelidarcamertransform (lidarCheckerboardPlanes,...imageCorners3d,“CameraIntrinsic”,固有的。cameraParams);helperFuseLidarCamera(图像文件名、ptCloudFileName、索引、,...内在。cameraParams tform);

%绘制估计误差值helperShowError(错误);

总结

这个例子概述了如何开始激光雷达摄像机校准工作流程,以提取两个传感器之间的刚性转换。这个示例还向您展示了如何使用刚性变换矩阵来融合激光雷达和相机数据。

工具书类

李子模、周力普,“基于直线和平面通信的相机和三维激光雷达的自动外部标定”,“IEEE/RSJ Intl.”智能机器人与系统大会,IROS”,2018年10月。

[2] K. S. Arun, T. S. Huang, S. D. Blostein,“两个三维点集的最小二乘拟合”,《IEEE模式分析与机器智能学报》,vol. 9, no. 1, no. 1, no. 1, no. 1, no. 1,5、第698-700页,1987年9月。