Неорганизованный к организованному преобразованию облаков точек Используя сферическую проекцию

В этом примере показано, как преобразовать неорганизованные облака точек в организованный формат с помощью сферической проекции.

Введение

3-D облако точек лидара обычно представляется в виде набора Декартовых координат (x, y, z). Облако точек может также содержать дополнительную информацию, такую как интенсивность и значения RGB. В отличие от распределения пикселей изображения, распределение облака точек лидара обычно разреженно и неправильно. Обработка таких разреженных данных неэффективна. Чтобы получить компактное представление, вы проектируете облака точек лидара на сферу, чтобы создать плотное, основанное на сетке представление, известное как организованное представление [1]. Чтобы узнать больше о различиях между организованными и неорганизованными облаками точек, смотрите, что Лидар Обрабатывает Обзор. Оснуйте плоскую экстракцию, и методы детектора ключевого пункта требуют организованных облаков точек. Кроме того, необходимо преобразовать облако точек в организованный формат, если вы хотите использовать большинство сетей сегментации глубокого обучения, включая SqueezeSegV1, SqueezeSegV2, RangeNet ++ [2], и SalsaNext [3]. Для примера, показывающего, как использовать глубокое обучение для организованного облака точек, смотрите, что Семантическая Сегментация Облака точек Лидара Использует пример Нейронной сети для глубокого обучения SqueezeSegV2.

Лоцируйте параметры датчика

Чтобы преобразовать неорганизованное облако точек в организованный формат с помощью сферической проекции, необходимо указать, что параметры датчика лидара раньше создавали облако точек. Определите который параметры задать путем обращения к таблице данных для датчика. Можно задать следующие параметры.

  • Излучите настройку 'uniform'или 'gradient'. Задайте 'uniform'если лучи имеют равный интервал. Задайте 'gradient'если лучи на горизонте плотно упаковываются, и те к верху и низу поля зрения датчика более растянуты.

  • Вертикальное разрешение Количество каналов в вертикальном направлении, то есть, количество лазеров. Типичные значения равняются 32, и 64.

  • Вертикальные углы луча Угловое положение каждого вертикального канала. Необходимо задать этот параметр, когда настройкой луча является 'gradient'.

  • Вверх вертикальное поле зрения Поле зрения в вертикальном направлении выше горизонта (в градусах).

  • Вниз вертикальное поле зрения Поле зрения в вертикальном направлении ниже горизонта (в градусах).

  • Горизонтальное разрешение Количество каналов в горизонтальном направлении. Типичные значения 512, и 1024.

  • Горизонтальное угловое разрешение угловое разрешение между каждым каналом вдоль горизонтального направления. Необходимо задать этот параметр, когда горизонтальное разрешение не упоминается в таблице данных.

  • Горизонтальное поле зрения Поле зрения, покрытое горизонтальным направлением (в градусах). В большинстве случаев это значение является 360 градусами.

Изгнание ОС 1 датчик

Считайте облако точек с помощью pcread функция.

fileName = fullfile(matlabroot,'examples','deeplearning_shared','data','ousterLidarDrivingData.pcd');
ptCloud = pcread(fileName);

Проверяйте размер облака точки выборки. Если координаты облака точек находятся в форме, M N 3, облако точек является организованным облаком точек.

disp(size(ptCloud.Location))
          64        1024           3

Преобразуйте облако точек в неорганизованный формат с помощью removeInvalidPoints функция. Координаты неорганизованного облака точек находятся в форме M-3.

ptCloudUnOrg = removeInvalidPoints(ptCloud);
disp(size(ptCloudUnOrg.Location))
       65536           3

Данные об облаке точек были собраны от датчика 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(ptCloudUnOrg,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 функция. Облако точек получено от [4].

ptCloudUnOrg = pcread('Pandar64LidarData.pcd');

Данные об облаке точек собраны с помощью датчика Pandar-64. Задайте следующие параметры, которые даны таблицей данных устройства [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);

Данные об облаке точек собраны от датчика Pandar-64. Задайте параметры датчика с помощью 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] Ву, Bichen, Элвин Вань, Сянюй Юэ и Курт Койцер. "SqueezeSeg: Сверточные Нейронные Сети с Текущим CRF для Дорожно-объектной Сегментации В реальном времени от 3D Облака точек LiDAR". На 2 018 Международных конференциях IEEE по вопросам Робототехники и Автоматизации (ICRA), 1887-93. Брисбен, QLD: IEEE, 2018. https://doi.org/10.1109/ICRA.2018.8462926.

[2] Milioto, Андрес, Игнасио Виссо, Йенс Белей и Кирилль Штахнисс. "RangeNet ++: Быстрая и Точная Семантическая Сегментация LiDAR". На 2019 Международных конференциях IEEE/RSJ по вопросам Интеллектуальных Роботов и Систем (IROS), 4213-20. Макао, Китай: IEEE, 2019. https://doi.org/10.1109/IROS40897.2019.8967762.

[3] Cortinhal, Тьягу, Джордж Целепис и Эрен Эрдэл Аксой. "SalsaNext: Быстрая, Осведомленная о неопределенности Семантическая Сегментация Облаков точек LiDAR для Автономного управления автомобилем". ArXiv:2003.03653 [Cs], 9 июля 2020. http://arxiv.org/abs/2003.03653.

[4] "PandaSet Открытые Наборы данных - Шкала". Полученный доступ 22 декабря 2020. https://scale.com/open-datasets/pandaset.

[5] "Руководство пользователя Pandar64". Полученный доступ 22 декабря 2020. https://hesaiweb2019. blob.core.chinacloudapi.cn/uploads/Pandar64_User's_Manual.pdf.