主要内容

激光雷达和摄像机校准

这个例子向您展示了如何估计三维激光雷达传感器和相机之间的刚性转换,然后使用刚性转换矩阵来融合激光雷达和相机数据。

概述

激光雷达传感器和相机通常在自动驾驶应用中一起使用,因为激光雷达传感器收集3-D空间信息,而相机捕捉2-D图像中的空间外观和纹理。你可以融合这些传感器的数据,以提高你的目标检测和分类。激光雷达相机标定估计一个变换矩阵,给出两个传感器之间的相对旋转和平移。在执行激光雷达-相机数据融合时使用这个矩阵。

此图说明了激光雷达和摄像机校准(LCC)过程的工作流程,其中我们使用棋盘格作为校准对象。我们从激光雷达和摄像机的数据中提取棋盘格角和平面,然后建立它们之间的坐标系几何关系进行标定。有关激光雷达-摄像机校准过程的更多信息,请参见什么是激光雷达相机标定?

calibration_process.png

这个例子使用了来自两个不同激光雷达传感器的数据 V e l o d y n e l D 一个 R ® HDL-64传感器和一个 V e l o d y n e l D 一个 R ® 调速发电机激光雷达 VLP-16传感器。对于HDL-64传感器,使用从Gazebo环境收集的数据。

HDL-64传感器以一组PNG图像和相应的PCD点云的形式捕获数据。这个例子假设您已经知道相机的内部参数。有关提取相机固有参数的更多信息,请参见单摄像机标定精度的评定

加载数据

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

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

检测棋盘角

本例使用棋盘格模式进行校准。首先,根据相机数据估计棋盘格边缘。使用estimateCheckerboardCorners3d函数计算棋盘角的坐标和实际棋盘的尺寸(以毫米为单位)。该函数将角估计为世界坐标系中的三维坐标。

[imageCorners3d, checkerboardDimension dataUsed] =...estimateCheckerboardCorners3d (imageFileNames intrinsic.cameraParams squareSize);删除不使用的映像文件。imageFileNames = imageFileNames (dataUsed);

方法可视化结果helperShowImageCornershelper函数。

%显示棋盘角。helperShowImageCorners (imageCorners3d imageFileNames intrinsic.cameraParams)

检测棋盘平面

接下来,使用detectRectangularPlanePoints函数在激光雷达数据中检测棋盘格平面。函数使用计算出的棋盘尺寸来检测棋盘estimateCheckerboardCorners3d函数。

从检测到的棋盘图角中提取棋盘图ROI。投资回报率= helperComputeROI (imageCorners3d 5);%过滤不用于检测的点云文件。ptCloudFileNames = ptCloudFileNames (dataUsed);lidarCheckerboardPlanes framesUsed,指数=...detectRectangularPlanePoints (ptCloudFileNames checkerboardDimension, ROI = ROI);删除不使用的ptCloud文件。ptCloudFileNames = ptCloudFileNames (framesUsed);删除映像文件。imageFileNames = imageFileNames (framesUsed);从图像中删除3-D角。。imageCorners3d = imageCorners3d (:,:, framesUsed);

方法可视化检测到的棋盘格helperShowCheckerboardPlanes函数。

helperShowCheckerboardPlanes (ptCloudFileNames指数)

校准激光雷达和摄像机

使用estimateLidarCameraTransform函数估计激光雷达传感器和相机之间的刚性变换矩阵。

[tform、错误]= estimateLidarCameraTransform (lidarCheckerboardPlanes...imageCorners3d intrinsic.cameraParams);

校正后,可以使用这个变换矩阵:

使用helperFuseLidarCamera功能可视化激光雷达和图像数据融合在一起。

helperFuseLidarCamera (imageFileNames ptCloudFileNames指数,...intrinsic.cameraParams tform);

可视化校准错误

您可以使用这些类型的误差来估计校准精度。

  • 平移误差-点云中棋盘平面的质心坐标与对应图像中的质心坐标之间的差,单位为米。

  • 旋转误差-点云中棋盘格平面定义的法线角度与对应图像中的法线角度之间的差,以弧度为单位。

  • 重投影误差——点云上棋盘格平面的投影(转换)质心坐标与对应图像中的质心坐标之间的差值(以像素为单位)。

方法绘制估计误差值helperShowError函数。

helperShowError(错误)

根据真实数据进行校正

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

清空imagePath = fullfile(toolboxdir)激光雷达的),“lidardata”低成本航空的“vlp16”“图片”);ptCloudPath = fullfile (toolboxdir (激光雷达的),“lidardata”低成本航空的“vlp16”“pointCloud”);cameraParamsPath = fullfile (imagePath,“calibration.mat”);载入相机的本质。内在=负载(cameraParamsPath);使用imageDatastore加载图像。imd = imageDatastore (imagePath);imageFileNames = imds.Files;%加载点云文件。pcd = fileDatastore (ptCloudPath,“ReadFcn”, @pcread);ptCloudFileNames = pcds.Files;%方格大小,单位为毫米。squareSize = 81;设置随机种子生成可重复的结果。rng (“默认”从图像中提取棋盘角。[imageCorners3d, checkerboardDimension dataUsed] =...estimateCheckerboardCorners3d (imageFileNames intrinsic.cameraParams squareSize);删除不使用的映像文件。imageFileNames = imageFileNames (dataUsed);%过滤不用于检测的点云文件。ptCloudFileNames = ptCloudFileNames (dataUsed);从检测到的棋盘图像角提取ROI。投资回报率= helperComputeROI (imageCorners3d 5);%从点云数据中提取棋盘格平面。(lidarCheckerboardPlanes framesUsed,指数)= detectRectangularPlanePoints (...ptCloudFileNames、checkerboardDimension RemoveGround = true,投资回报率= ROI);imageCorners3d = imageCorners3d (:,:, framesUsed);删除不使用的ptCloud文件。ptCloudFileNames = ptCloudFileNames (framesUsed);删除不使用的映像文件。imageFileNames = imageFileNames (framesUsed);[tform、错误]= estimateLidarCameraTransform (lidarCheckerboardPlanes...imageCorners3d intrinsic.cameraParams);helperFuseLidarCamera (imageFileNames ptCloudFileNames指数,...intrinsic.cameraParams tform);

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

总结

本示例提供了激光雷达-相机校准工作流程的概述,并向您展示了如何使用刚性转换矩阵来融合激光雷达和相机数据。

参考文献

周,李普,李子墨,迈克尔·凯斯。利用直线和平面对应关系对相机和3D激光雷达进行自动外部标定。2018年IEEE/RSJ智能机器人与系统国际会议(IROS), 5562-69。马德里:IEEE 2018。https://doi.org/10.1109/IROS.2018.8593660。

[2]阿伦,K. S., T. S.黄,S. D.布洛斯坦。两个三维点集的最小二乘拟合《IEEE模式分析与机器智能汇刊》5(1987年9月):698-700。https://doi.org/10.1109/TPAMI.1987.4767965。

Baidu
map