Main Content

球面投影の使用による点群のアンオーガナイズドからオーガナイズドへの変換

この例では、球面投影を使用してアンオーガナイズド点群をオーガナイズド形式に変換する方法を説明します。

はじめに

3 次元 LiDAR 点群は、通常は直交座標セット "(x, y, z)" として表現されます。点群には、強度などの追加情報や RGB 値も含まれます。イメージ ピクセルの分布とは異なり、LiDAR 点群の分布は、通常はスパースで不規則です。そのようなスパース データの処理は非効率的です。コンパクトな表現を取得するには、LiDAR 点群を球面に投影して、オーガナイズド表現と呼ばれる密なグリッドベースの表現を作成します [1]。オーガナイズド点群とアンオーガナイズド点群の違いの詳細については、オーガナイズド点群とアンオーガナイズド点群とはを参照してください。地面の抽出や主要な点の検出の手法には、オーガナイズド点群が必要なものがあります。また、SqueezeSegV1、SqueezeSegV2、RangeNet++ [2]、SalsaNext [3] を含むほとんどの深層学習セグメンテーション ネットワークを使用する場合は、点群をオーガナイズド形式に変換する必要があります。オーガナイズド点群で深層学習を使用する方法を示す例については、Lidar Point Cloud Semantic Segmentation Using SqueezeSegV2 Deep Learning Networkの例を参照してください。

LiDAR センサーのパラメーター

球面投影を使用してアンオーガナイズド点群をオーガナイズド形式に変換するには、点群の作成に使用する LiDAR センサーのパラメーターを指定する必要があります。センサーのパラメーターの詳細については、センサーのデータ シートを参照してください。次のパラメーターを指定できます。

  • ビーム構成 'uniform' または 'gradient'。ビームが等間隔の場合は 'uniform' を指定します。ビームが水平に密集していて、センサーの視野の上下に向かうほど薄くなっている場合は、'gradient' を指定します。

  • 垂直分解能 垂直方向のチャネル数、つまりレーザーの数。典型的な値は 32 と 64 です。

  • 垂直ビームの角度 各垂直チャネルの角度位置。このパラメーターは、ビーム構成が 'gradient' のときに指定する必要があります。

  • 上向きの垂直方向の視野 水平より上の垂直方向の視野 (度)。

  • 下向きの垂直方向の視野 水平より下の垂直方向の視野 (度)。

  • 水平分解能 水平方向のチャネル数。典型的な値は 512 と 1024 です。

  • 水平角度分解能 水平方向の各チャネル間の角度分解能。このパラメーターは、データシートに水平分解能が記載されていない場合に指定する必要があります。

  • 水平方向の視野 水平方向にカバーされている視野 (度)。ほとんどの場合、この値は 360 度です。

UnorgToOrg (2).PNG

上記のセンサー パラメーターのほとんどは、lidarParametersオブジェクトを使用して指定できます。

Ouster OS-1 センサー

関数pcreadを使用して点群を読み取ります。

ptCloud = pcread('ousterLidarDrivingData.pcd');

サンプル点群のサイズをチェックします。点群の座標の形式が "M" x "N" x 3 である場合、これはオーガナイズド点群です。

isOrganized = size(ptCloud.Location,3) == 3;

関数removeInvalidPointsを使用して、無効な点を削除し、点群をアンオーガナイズド形式に変換します。

if isOrganized
    ptCloudUnOrg = removeInvalidPoints(ptCloud);
end

点群データが Ouster OS1 Gen1 センサーから収集されました。関数lidarParametersを使用して、センサーのパラメーターを指定します。

hResolution = 1024;     
params = lidarParameters("OS1Gen1-64",hResolution);

関数pcorganizeを使用して、アンオーガナイズド点群をオーガナイズド形式に変換します。

ptCloudOrg = pcorganize(ptCloudUnOrg,params);

元の点群と再構成後のオーガナイズド点群の強度チャネルを表示します。

figure
montage({uint8(ptCloud.Intensity),uint8(ptCloudOrg.Intensity)});
title("Intensity Channel of Original Point Cloud(Top) vs. Reconstructed Organized Point Cloud(Bottom)")

Figure contains an axes object. The axes object with title Intensity Channel of Original Point Cloud(Top) vs. Reconstructed Organized Point Cloud(Bottom) contains an object of type image.

この例にサポート ファイルとして添付されている補助関数 helperShowUnorgAndOrgPair を使用して、元のオーガナイズド点群と再構成後のオーガナイズド点群の両方を表示します。

display1 = helperShowUnorgAndOrgPair();
zoomFactor = 3.5;
display1.plotLidarScan(ptCloud,ptCloudOrg,zoomFactor);

Figure Display Original Unorganized and Reconstructed Organized Point Clouds contains objects of type uipanel.

Velodyne センサー

関数pcreadを使用して点群を読み取ります。

ptCloudUnOrg = pcread('HDL64LidarData.pcd');

点群データが Velodyne HDL-64 センサーから収集されます。関数lidarParametersを使用して、センサーのパラメーターを指定します。

hResolution = 1024;     
params = lidarParameters("HDL64E",hResolution);

関数pcorganizeを使用して、アンオーガナイズド点群をオーガナイズド形式に変換します。

ptCloudOrg = pcorganize(ptCloudUnOrg,params);

再構成後のオーガナイズド点群の強度チャネルを表示します。より見やすくするために、イメージのサイズを変更します。

intensityChannel = ptCloudOrg.Intensity;
intensityChannel = imresize(intensityChannel,'Scale',[3 1]);
figure
imshow(intensityChannel);

Figure contains an axes object. The axes object contains an object of type image.

この例にサポート ファイルとして添付されている補助関数 helperShowUnorgAndOrgPair を使用して、元のオーガナイズド点群と再構成後のオーガナイズド点群の両方を表示します。

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

Figure Display Original Unorganized and Reconstructed Organized Point Clouds contains objects of type uipanel.

センサー パラメーターの構成

与えられた点群に関して、オーガナイズド形式に変換するときに、垂直および水平の分解能、垂直および水平方向の視野などのセンサー パラメーターを指定できます。

関数pcreadを使用して点群を読み取ります。

ptCloudUnOrg = pcread('HDL64LidarData.pcd');

点群データが Velodyne HDL-64 センサーから収集されます。さまざまなパラメーターを指定することにより、センサーを構成できます。

% Define vertical and horizontal resolution.
vResolution = 32; 
hResolution = 512; 

% Define vertical and horizontal field-of-view.
vFoVUp = 2;     
vFoVDown = -24.9; 
vFoV = [vFoVUp vFoVDown];
hFoV = 270;

関数lidarParametersを使用して、センサーのパラメーターを指定します。

params = lidarParameters(vResolution,vFoV,hResolution,"HorizontalFoV",hFoV);

関数pcorganizeを使用して、アンオーガナイズド点群をオーガナイズド形式に変換します。

ptCloudOrg = pcorganize(ptCloudUnOrg,params);

再構成後のオーガナイズド点群の強度チャネルを表示します。より見やすくするために、イメージのサイズを変更します。

intensityChannel = ptCloudOrg.Intensity;
intensityChannel = imresize(intensityChannel,'Scale',[3 1]);
figure
imshow(intensityChannel);

Figure contains an axes object. The axes object contains an object of type image.

この例にサポート ファイルとして添付されている補助関数 helperShowUnorgAndOrgPair を使用して、元のオーガナイズド点群と再構成後のオーガナイズド点群の両方を表示します。

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

Figure Display Original Unorganized and Reconstructed Organized Point Clouds contains objects of type uipanel.

Pandar センサー

関数pcreadを使用して点群を読み取ります。

ptCloudUnOrg = pcread('Pandar64LidarData.pcd');

Pandar-64 センサー [4] を使用して点群データが収集されます。デバイスのデータシート [5] で与えられている情報を使用して、次のパラメーターを指定できます。

vResolution = 64;       
hAngResolution = 0.2;

ビーム構成は 'gradient' であり、これはビームが等間隔でないことを意味します。垂直方向のビーム角度の値を指定します。

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.0000   -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 = round(360/hAngResolution);

関数lidarParametersを使用して、センサーのパラメーターを定義します。

params = lidarParameters(vbeamAngles,hResolution);

関数pcorganizeを使用して、アンオーガナイズド点群をオーガナイズド形式に変換します。

ptCloudOrg = pcorganize(ptCloudUnOrg,params);

再構成後のオーガナイズド点群の強度チャネルを表示します。より見やすくするために、イメージのサイズを変更してhisteqを使用します。

intensityChannel = ptCloudOrg.Intensity;
intensityChannel = imresize(intensityChannel,'Scale',[3 1]);
figure
histeq(intensityChannel./max(intensityChannel(:)));

Figure contains an axes object. The axes object contains an object of type image.

この例にサポート ファイルとして添付されている補助関数 helperShowUnorgAndOrgPair を使用して、元のオーガナイズド点群と再構成後のオーガナイズド点群の両方を表示します。

display4 = helperShowUnorgAndOrgPair();
zoomFactor = 4;
display4.plotLidarScan(ptCloudUnOrg,ptCloudOrg,zoomFactor);

Figure Display Original Unorganized and Reconstructed Organized Point Clouds contains objects of type uipanel.

参考文献

[1] Wu, Bichen, Alvin Wan, Xiangyu Yue, and Kurt Keutzer. "SqueezeSeg: Convolutional Neural Nets with Recurrent CRF for Real-Time Road-Object Segmentation from 3D LiDAR Point Cloud."In 2018 IEEE International Conference on Robotics and Automation (ICRA), 1887-93. Brisbane, QLD: IEEE, 2018. https://doi.org/10.1109/ICRA.2018.8462926.

[2] Milioto, Andres, Ignacio Vizzo, Jens Behley, and Cyrill Stachniss. "RangeNet ++: Fast and Accurate LiDAR Semantic Segmentation."In 2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 4213-20. Macau, China: IEEE, 2019. https://doi.org/10.1109/IROS40897.2019.8967762.

[3] Cortinhal, Tiago, George Tzelepis, and Eren Erdal Aksoy. "SalsaNext: Fast, Uncertainty-Aware Semantic Segmentation of LiDAR Point Clouds for Autonomous Driving."ArXiv:2003.03653 [Cs], July 9, 2020. https://arxiv.org/abs/2003.03653.

[4] "PandaSet Open Datasets - Scale."Accessed December 22, 2020. https://scale.com/open-datasets/pandaset.

[5] "Pandar64 User Manual."Accessed December 22, 2020. https://hesaiweb2019.blob.core.chinacloudapi.cn/uploads/Pandar64_User's_Manual.pdf.