主要内容

激光雷达和相机校准

这个例子向您展示了如何估计3-D激光雷达和相机之间的刚性转换。在本例的最后,您将能够使用刚性变换矩阵来融合激光雷达和相机数据。

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

概述

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

两个传感器之间以方向和相对位置形式的变换矩阵是融合这两个传感器数据的先驱。激光雷达相机校准有助于估计3d激光雷达和安装在自动驾驶汽车上的相机之间的转换矩阵。在这个例子中,你将使用来自两个不同激光雷达传感器的数据,HDL64而且VLP16HDL64数据是从一个凉亭环境中收集的,如图所示。

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

加载数据

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

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

棋盘角检测

这个例子使用棋盘图案作为比较的特征。棋盘边缘估计使用激光雷达和摄像头传感器。使用estimateCheckerboardCorners3d计算棋盘角的坐标和实际棋盘的尺寸毫米.这些角是根据相机的坐标系在3d中估计出来的。有关相机坐标系的详细信息,请参见激光雷达工具箱中的坐标系

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

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

%显示棋盘角helpshowimagecorners (imageCorners3d, imageFileNames, intrinsic.cameraParams)

激光雷达中的棋盘检测

同样,使用detectRectangularPlanePoints函数在激光雷达数据中检测棋盘。该函数基于输入维度检测点云中的矩形对象。在本例中,它使用前一节中计算的棋盘尺寸检测棋盘。

从检测到的图像角落中提取ROIroi = helpcomputeroi (imageCorners3d, 5);%检测图像对应的过滤点云文件ptCloudFileNames = ptCloudFileNames(dataUsed);[lidarCheckerboardPlanes, framesUsed, indices] =...detectRectangularPlanePoints (ptCloudFileNames checkerboardDimension,“投资回报”roi);删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames(framesUsed);删除图像文件imageFileNames = imageFileNames(framesUsed);从图像中移除3D角imageCorners3d = imageCorners3d(:,:, framesUsed);

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

helperShowCheckerboardPlanes (ptCloudFileNames指数)

校准激光雷达和摄像机

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

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

校准完成后,可以通过以下两种方式使用校准矩阵:

  • 投影激光雷达点云图像。

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

使用helperFuseLidarCamera函数将激光雷达和图像数据融合在一起进行可视化。

helperFuseLidarCamera(imageFileNames, ptCloudFileNames,索引,...内在。cameraParams tform);

误差可视化

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

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

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

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

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

helperShowError(错误)

真实数据测试

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

清晰;imagePath = fullfile(toolboxdir(激光雷达的),“lidardata”低成本航空的“vlp16”“图片”);ptCloudPath = fullfile(toolboxdir(激光雷达的),“lidardata”低成本航空的“vlp16”“pointCloud”);cameraParamsPath = fullfile(imagePath,“calibration.mat”);intrinsic = load(cameraParamsPath);载入相机的内在特性imds = imageDatastore(imagePath);使用imageDatastore加载图像pcds = fileDatastore(ptCloudPath,“ReadFcn”, @pcread);%加载点云文件imageFileNames = imds.Files;ptCloudFileNames = pcds.Files;squareSize = 81;棋盘的正方形大小设置随机种子以产生可重复的结果。rng (“默认”);从图像中提取棋盘角[imageCorners3d, checkerboardDimension, dataUsed] =...estimateCheckerboardCorners3d (imageFileNames内在。cameraParams squareSize);imageFileNames = imageFileNames(dataUsed);删除不使用的映像文件%检测图像对应的过滤点云文件ptCloudFileNames = ptCloudFileNames(dataUsed);从检测到的图像角落中提取ROIroi = helpcomputeroi (imageCorners3d, 5);从激光雷达数据中提取棋盘[lidarCheckerboardPlanes, framesUsed, indices] = detectRectangularPlanePoints(...ptCloudFileNames checkerboardDimension,“RemoveGround”,真的,“投资回报”roi);imageCorners3d = imageCorners3d(:,:, framesUsed);删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames(framesUsed);删除图像文件imageFileNames = imageFileNames(framesUsed);[tform, errors] = estimateLidarCameraTransform(lidarCheckerboardPlanes,...imageCorners3d,“CameraIntrinsic”, intrinsic.cameraParams);helperFuseLidarCamera(imageFileNames, ptCloudFileNames,索引,...内在。cameraParams tform);

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

总结

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

参考文献

[1]周立普,李子摩,Michael Kaess,“基于线面对应的三维激光雷达和相机的自动外部标定”,“IEEE/RSJ Intl。智能机器人与系统会议,IROS, 2018年10月。

[2] K. S. Arun, T. S. Huang,和S. D. Blostein,“两个3-D点集的最小二乘拟合”,IEEE模式分析与机器智能汇刊,卷PAMI-9, no. 1。5,第698-700页,1987年9月。