主要内容

使用球面投影的无组织到有组织的点云转换

这个例子展示了如何使用球面投影将无组织的点云转换为有组织的格式。

介绍

三维激光雷达点云通常用一组笛卡尔坐标表示(x, y, z)。点云还可以包含其他信息,如强度和RGB值。与图像像素的分布不同,激光雷达点云的分布通常是稀疏和不规则的。处理这样稀疏的数据效率很低。为了获得紧凑的表示,您将激光雷达点云投影到一个球体上,以创建一个密集的、基于网格的表示,称为有组织的表示[1].要了解更多关于有组织点云和无组织点云的区别,请参见激光雷达处理概述.地平面提取和关键点探测方法需要有组织的点云。此外,如果你想使用大多数深度学习分割网络,你必须将点云转换为有组织的格式,包括SqueezeSegV1, SqueezeSegV2, RangeNet++ [2]和SalsaNext [3.].有关如何使用深度学习组织点云的示例,请参阅基于SqueezeSegV2深度学习网络的激光雷达点云语义分割的例子。

激光雷达传感器参数

要使用球面投影将无组织点云转换为有组织格式,必须指定用于创建点云的激光雷达传感器的参数。通过引用传感器的数据表,确定要指定哪些参数。您可以指定以下参数。

  • 梁配置- - - - - -统一的”或“梯度”。指定的统一的如果梁的间距相等。指定的梯度“如果地平线上的光束密集,而传感器视野顶部和底部的光束间隔更大。

  • 垂直分辨率- - - - - -垂直方向上通道的数量,即激光器的数量。典型值是32和64。

  • 垂直的光束角- - - - - -每个垂直通道的角度位置。当波束配置为'时,必须指定此参数。梯度”。

  • 向上垂直视野- - - - - -地平线以上垂直方向的视场(以度数表示)。

  • 向下垂直视野- - - - - -地平线以下垂直方向的视场(以度数表示)。

  • 水平分辨率- - - - - -水平方向的通道数。典型值为512、1024。

  • 水平角分辨率- - - - - -沿水平方向各通道之间的角分辨率。当数据表中没有提到水平分辨率时,必须指定此参数。

  • 水平视场- - - - - -水平方向覆盖的视场(以度数表示)。在大多数情况下,这个值是360度。

下台OS-1传感器

读取点云使用pcread函数。

文件名= fullfile (matlabroot,“例子”“deeplearning_shared”“数据”“ousterLidarDrivingData.pcd”);ptCloud = pcread(文件名);

检查样本点云的大小。如果点云坐标是这个形式,——- - - - - -N,点云是一个有组织的点云。

disp(大小(ptCloud.Location))
64 1024 3

使用。将点云转换为无组织格式removeInvalidPoints函数。无组织点云的坐标为3。

ptCloudUnOrg = removeInvalidPoints (ptCloud);disp(大小(ptCloudUnOrg.Location))
65536年3

点云数据由Ouster OS1 Gen1传感器收集。指定设备数据表给出的以下参数[4].

vResolution = 64;hResolution = 1024;vFOVUp = 16.6;vFOVDown = -16.6;hFOV = 360;beamConfig =“统一”

计算沿水平和垂直方向的光束角度。

如果比较字符串(beamConfig“统一”) vbeamAngles = linspace(vFOVUp,vFOVDown,vResolution);结束hbeamAngles = linspace (0 hFOV hResolution);

控件将无组织点云转换为有组织的格式convertUnorgToOrg辅助函数,在示例的最后定义。

ptCloudOrg = convertUnorgToOrg (ptCloudUnOrg, vResolution, hResolution vbeamAngles, hbeamAngles);

显示原始和重建的有组织点云的强度通道。

图蒙太奇({uint8 (ptCloud.Intensity) uint8 (ptCloudOrg.Intensity)});标题(原始点云(上)与重构有组织点云(下)的强度通道

显示原始的有组织点云和重建的有组织点云helperShowUnorgAndOrgPair辅助函数,作为支持文件附加到本示例中。万博1manbetx

display1 = helperShowUnorgAndOrgPair ();display1.plotLidarScan (ptCloudUnOrg, ptCloudOrg, 3.5);

调速发电机传感器

读取点云使用pcread函数。

ptCloudUnOrg = pcread (“HDL64LidarData.pcd”);

点云数据由Velodyne HDL-64传感器采集。指定设备数据表给出的以下参数[5].

vResolution = 64;hResolution = 1024;vFOVUp = 2;vFOVDown = -24.9;hFOV = 360;beamConfig =“统一”

计算沿水平和垂直方向的光束角度。

如果比较字符串(beamConfig“统一”) vbeamAngles = linspace(vFOVUp,vFOVDown,vResolution);结束hbeamAngles = linspace (0 hFOV hResolution);

控件将无组织点云转换为有组织的格式convertUnorgToOrg辅助函数,在示例的最后定义。

ptCloudOrg = convertUnorgToOrg (ptCloudUnOrg, vResolution, hResolution vbeamAngles, hbeamAngles);

显示重建的有组织点云的强度通道。将nan替换为0并调整图像的大小以获得更好的可视化效果。

intensityChannel = ptCloudOrg.Intensity;intensityChannel (isnan (intensityChannel)) = 0;figure intensityChannel = imresize(intensityChannel,“规模”1 [3]);imshow (intensityChannel);

显示原始的有组织点云和重建的有组织点云helperShowUnorgAndOrgPair辅助函数,作为支持文件附加到本示例中。万博1manbetx

display2 = helperShowUnorgAndOrgPair ();display2.plotLidarScan (ptCloudUnOrg, ptCloudOrg, 2.5);

Pandar传感器

读取点云使用pcread函数。点云由[6].

ptCloudUnOrg = pcread (“Pandar64LidarData.pcd”);

点云数据是使用Pandar-64传感器收集的。指定设备数据表给出的以下参数[7].

vResolution = 64;hAngResolution = 0.2;hFOV = 360;beamConfig =“梯度”

光束结构是'梯度,即梁间距不均匀。指定沿垂直方向的波束角度值,该值由数据表给出。

vbeamAngles = [15.0000 11.0000 8.0000 5.0000 3.0000 2.0000 1.8333 1.6667 1.5000 1.3333 1.1667 1.0000 0.8333 0.6667...0.5000 0.3333 0.1667 0 -0.1667 -0.3333 -0.5000 -0.6667 -0.8333 -1.0000 -1.1667 -1.3333 -1.5000 -1.6667...-1.8333 -2.000 -2.1667 -2.3333 -2.5000 -2.6667 -2.8333 -3.0000 -3.1667 -3.3333 -3.5000 -3.6667 -3.8333 -4.0000...-4.1667 -4.3333 -4.5000 -4.6667 -4.8333 -5.0000 -5.1667 -5.3333 -5.5000 -5.6667 -5.8333 -6.0000 -7.0000 -8.0000...-9.0000 -10.0000 -11.0000 -12.0000 -13.0000 -14.0000 -19.0000 -25.0000];

计算水平光束角度。

hResolution =圆(360 / hAngResolution);hbeamAngles = linspace (0 hFOV hResolution);

控件将无组织点云转换为有组织的格式convertUnorgToOrg辅助函数,在示例的最后定义。

ptCloudOrg = convertUnorgToOrg (ptCloudUnOrg, vResolution, hResolution vbeamAngles, hbeamAngles);

显示重建的有组织点云的强度通道。将nan替换为0并调整图像的大小。使用histeq为了更好的可视化。

intensityChannel = ptCloudOrg.Intensity;intensityChannel (isnan (intensityChannel)) = 0;figure intensityChannel = imresize(intensityChannel,“规模”1 [3]);histeq (intensityChannel. / max (intensityChannel (:)));

显示原始的有组织点云和重建的有组织点云helperShowUnorgAndOrgPair辅助函数,作为支持文件附加到本示例中。万博1manbetx

display3 = helperShowUnorgAndOrgPair ();display3.plotLidarScan (ptCloudUnOrg, ptCloudOrg, 4);

辅助函数

使用convertUnorgToOrg函数查找所有投影图像的像素坐标(x, y, z)点。该函数遵循以下步骤。

  1. 计算点云中每一点的俯仰和偏航角。

  2. 根据波束、俯仰和偏航角计算每个点的行和列指数。

  3. 基于行和列索引创建有组织的点云。

函数ptCloudOrganized = convertUnorgToOrg(ptCloud,vResolution,hResolution,vbeamAngles,hbeamAngles) locations = ptCloud. location;如果~isempty(ptCloud.Intensity) intensity = ptCloud.Intensity;其他的强度= 0(大小(ptCloud.Location, 1), 1);结束计算每个点的径向距离。r =√位置(:1)。(:, 2) ^ 2 +位置。^ 2);r (r = = 0) = 1 e-6;计算点云中每个点的俯仰角和偏航角。距= atan2d(位置(:,3),r);偏航= atan2d(位置(:,2),地点(:1));%将偏航角的范围从[-pi,pi]移到[0,2*pi]。偏航= 180 -偏航;%根据每个点的俯仰角所在的容器,计算所有点的行索引。[~, ~, rowIdx] = histcounts(音高,翻转(vbeamAngles));rowIdx(rowIdx == 0) = NaN;rowIdx = vResolution - rowIdx;%根据每个点的偏航角所在的容器计算所有点的列索引。[~, ~, colIdx] = histcounts(偏航,hbeamAngles);colIdx(colIdx == 0) = NaN;%创建一个伪图像,并用相应的位置和强度值填充。pseduoImage =南(vResolution hResolution 4);i = 1:尺寸(位置1)如果~isnan(rowIdx(i,1)) && ~isnan(colIdx(i,1))) psduoimage (rowIdx(i,1),colIdx(i,1),1) = locations(i,1);pseduoImage (rowIdx(我,1),colIdx(我,1),2)=(我,2)位置;pseduoImage (rowIdx(我,1),colIdx(我,1),3)=(我,3)位置;pseduoImage (rowIdx(我,1),colIdx(我,1),4)=强度(i, 1);结束结束从位置和强度创建一个点云对象。如果~isempty(ptCloud.Intensity) ptCloudOrganized = pointCloud(pseduoImage(:,:,1:3),“强度”pseduoImage (:: 4));其他的ptCloudOrganized = pointCloud (pseduoImage (:,: 1:3));结束结束

参考文献

[1] Wu, Bichen, Alvin Wan, Xiangyu Yue, Kurt Keutzer。“SqueezeSeg:基于循环CRF的卷积神经网络用于从3D激光雷达点云进行实时道路目标分割。”2018年IEEE机器人与自动化国际会议, 1887 - 93。布里斯班,QLD: IEEE 2018。https://doi.org/10.1109/ICRA.2018.8462926

Milioto, Andres, Ignacio Vizzo, Jens Behley, Cyrill Stachniss。RangeNet ++:快速准确的激光雷达语义分割。2019年IEEE/RSJ智能机器人与系统国际会议(IROS), 4213 - 20所示。中国,澳门:IEEE, 2019。https://doi.org/10.1109/IROS40897.2019.8967762

Cortinhal, Tiago, George Tzelepis和Eren Erdal Aksoy。“SalsaNext:自动驾驶激光雷达点云的快速、不确定性感知语义分割”。ArXiv: 2003.03653 (Cs)2020年7月9日。https://arxiv.org/abs/2003.03653

贾登·金[4]。"UCS -废除激光雷达。"2020年12月22日。https://data.ouster.io/downloads/datasheets/datasheet-gen1-v1p13-os1.pdf

[5]调速发电机激光雷达。“HDL-64E耐用环绕式激光雷达传感器。”2020年12月22日。https://velodynelidar.com/s manbetx 845products/hdl-64e/

[6] "PandaSet Open dataset - Scale."2020年12月22日。https://scale.com/open-datasets/pandaset

[7]“Pandar64用户手册。”2020年12月22日。https://hesaiweb2019.blob.core.chinacloudapi.cn/uploads/Pandar64_User 's_Manual.pdf