主要内容

激光雷达和相机校准

此示例显示了如何估算3-D LIDAR和相机之间的刚性转换。在此示例结束时,您将能够使用刚性变换矩阵熔断LIDAR和相机数据。

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

概述

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

在两个传感器之间的方向形式和相对位置的变换矩阵是从这两个传感器融合数据的前体。LIDAR相机校准有助于估算3-D LIDAR和安装在自主车辆上的摄像机之间的变换矩阵。在此示例中,您将使用来自两个不同的LIDAR传感器的数据,HDL64VLP16.HDL64如图所示,从凉亭环境收集数据。

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

加载数据

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

imagePath = fullfile (toolboxdir (激光雷达的),“lidardata”'LCC'“HDL64”“图片”);ptcloudpath = fullfile(toolboxdir(激光雷达的),“lidardata”'LCC'“HDL64”“pointCloud”);cameraparamspath = fullfile(imagepath,'calibration.mat');内在=负载(cameraParamsPath);%加载相机特性imd = imageDatastore (imagePath);使用ImageageAtastore的%加载图像pcd = fileDatastore (ptCloudPath,“ReadFcn”,@pcread);%加载点云文件imageFileNames = imds.Files;ptCloudFileNames = pcds.Files;squareSize = 200;棋盘的%平方大小%设置随机种子以生成可重复的结果。rng (“默认”);

棋盘角落检测

此示例使用棋盘模式作为比较的特征。使用LIDAR和相机传感器估计棋盘边缘。用estimateCheckerboardCorners3d计算棋盘角落的坐标和实际棋盘的大小毫米.在相机的坐标系上估计了角落。有关相机坐标系的更多详细信息,请参阅LIDAR工具箱中的坐标系

[imageCorners3d, checkerboardDimension, dataUsed] =...viematecheckerboardcorners3d(Imagefilenames,Intrinsic.cameraparams,Squarisize);imagefilenames = imagefileNames(dataused);%删除未使用的图像文件

可以使用helper函数可视化结果救助人员和救助人员

%显示棋盘角落allowshowimagecorners(imagecorners3d,imagefilenames,Intrinsic.cameraparams);

图包含一个坐标轴和一个uipanel类型的对象。轴类包含图像、线类9个对象。

驾驶员的棋盘检测

同样,使用detectritChtangularplanepoints.在LIDAR数据中检测棋盘的功能。该函数基于输入尺寸检测点云中的矩形对象。在这种情况下,它使用前一节中计算的电路板尺寸来检测棋盘。

%从检测到的图像角提取ROIROI = HelperComputerSoii(Imagecorners3d,5);%过滤点云文件对应于检测到的图像ptCloudFileNames = ptCloudFileNames (dataUsed);[lidarCheckerboardPlanes, framesUsed, indices] =...detectRectangularPlanePoints (ptCloudFileNames checkerboardDimension,'roi'roi);%删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames (framesUsed);%删除图像文件imageFileNames = imageFileNames (framesUsed);%从图像中删除3D角imagecorners3d = imagecorners3d(:,:,框架);

要可视化检测到的棋盘格,请使用exermherheckerboard平面功能。

helperShowCheckerboardPlanes (ptCloudFileNames指标);

图包含一个坐标轴和一个uipanel类型的对象。轴包含一个散点类型的对象。

校准激光雷达和相机

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

[tform, errors] = estimateLidarCameraTransform(lidarCheckerboardPlanes,...imageCorners3d,'摄像头', intrinsic.cameraParams);

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

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

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

Helperfuselidarcamera.功能将激光雷达和图像数据融合在一起。

Helperfuselidarcamera(imagefilenames,ptcloudfileenames,indices,...内在。cameraParams tform);

图包含uipanel类型的2个轴和其他物体。轴1包含类型散射的对象。轴2包含2个类型图像的物体,线。

误差可视化

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

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

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

  • 重新注入误差:图像角落质心与图像上投影激光雷达角之间的差异。

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

救济人员(错误)

图错误图包含3个轴和其他uipanel类型的对象。坐标轴1包含条形和直线两种类型的对象。该对象表示整体平均翻译误差:0.0033408,单位为米。坐标轴2包含条形和直线两种类型的对象。这个对象表示整体平均旋转误差:0.7986度。轴3包含条形和直线两种类型的对象。该对象表示总体平均重投影误差:0.99477,像素。

结果

校准后检查有高校准误差的数据,并重新运行校准。

outlieridx = errors.rotationError <均值(错误.RotationError);[newtform,newerrors] = rightatelidarcameratransform(Lidarcheckerboard平面(outlieridx),...imageCorners3d (:,:, outlierIdx),'摄像头', intrinsic.cameraParams);helperShowError (newErrors);

图错误图包含3个轴和其他uipanel类型的对象。坐标轴1包含条形和直线两种类型的对象。该对象表示整体平均平移误差:0.0036375,单位为米。坐标轴2包含条形和直线两种类型的对象。该对象表示整体平均旋转误差:0.39698。坐标轴3包含条形和直线两种类型的对象。该对象表示总体平均重投影误差:1.1785像素。

真实数据测试

测试实际VLP-16 LIDAR数据上的LCC工作流程,以评估其性能。

清晰;imagePath = fullfile (toolboxdir (激光雷达的),“lidardata”'LCC'“vlp16”“图片”);ptcloudpath = fullfile(toolboxdir(激光雷达的),“lidardata”'LCC'“vlp16”“pointCloud”);cameraparamspath = fullfile(imagepath,'calibration.mat');内在=负载(cameraParamsPath);%加载相机固有功能imd = imageDatastore (imagePath);使用ImageageAtastore的%加载图像pcd = fileDatastore (ptCloudPath,“ReadFcn”,@pcread);%加载点云文件imageFileNames = imds.Files;ptCloudFileNames = pcds.Files;Squaresize = 81;棋盘的%平方大小%设置随机种子以生成可重复的结果。rng (“默认”);%从图像中提取棋盘角[imageCorners3d, checkerboardDimension, dataUsed] =...viematecheckerboardcorners3d(Imagefilenames,Intrinsic.cameraparams,Squarisize);imagefilenames = imagefileNames(dataused);%删除未使用的图像文件%过滤点云文件对应于检测到的图像ptCloudFileNames = ptCloudFileNames (dataUsed);%从检测到的图像角提取ROIROI = HelperComputerSoii(Imagecorners3d,5);提取激光雷达数据中的棋盘格[lidarCheckerboardPlanes, framesUsed, indices] = detectRectangularPlanePoints(...ptCloudFileNames checkerboardDimension,“RemoveGround”,真的,'roi'roi);imagecorners3d = imagecorners3d(:,:,框架);%删除不使用的ptCloud文件ptCloudFileNames = ptCloudFileNames (framesUsed);%删除图像文件imageFileNames = imageFileNames (framesUsed);[tform, errors] = estimateLidarCameraTransform(lidarCheckerboardPlanes,...imageCorners3d,'摄像头', intrinsic.cameraParams);Helperfuselidarcamera(imagefilenames,ptcloudfileenames,indices,...内在。cameraParams tform);

图包含uipanel类型的2个轴和其他物体。轴1包含类型散射的对象。轴2包含2个类型图像的物体,线。

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

图错误图包含3个轴和其他uipanel类型的对象。坐标轴1包含条形和直线两种类型的对象。该对象表示整体平均值转换误差:0.010932在m。轴2包含2型栏杆,线。该对象表示整体平均旋转误差:1.7377在DEG中。轴3包含2型杆,线条物体。该对象表示总体均衡误差:4.1914在像素中。

总结

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

参考文献

[1] Lipu Zhou和Zimo Li和Michael Kaess,“使用线路和平面通信的相机和3D LIDAR的自动外在校准”,“IEEE / RSJ Intl。Conf。关于智能机器人和系统,IROS”,2018年10月.

[2] K. S. Arun, T. S. Huang, and S. D. Blostein, "最小二乘拟合的两种三维点集," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 29, no. 1, no. 1。5,第698-700页,1987年9月。