В этом примере показано, как преобразовать неорганизованные облака точек в организованный формат с помощью сферической проекции.
3-D облако точек лидара обычно представляется в виде набора Декартовых координат (x, y, z). Облако точек может также содержать дополнительную информацию, такую как интенсивность и значения RGB. В отличие от распределения пикселей изображения, распределение облака точек лидара обычно разреженно и неправильно. Обработка таких разреженных данных неэффективна. Чтобы получить компактное представление, вы проектируете облака точек лидара на сферу, чтобы создать плотное, основанное на сетке представление, известное как организованное представление [1]. Чтобы узнать больше о различиях между организованными и неорганизованными облаками точек, смотрите, что Лидар Обрабатывает Обзор. Оснуйте плоскую экстракцию, и методы детектора ключевого пункта требуют организованных облаков точек. Кроме того, необходимо преобразовать облако точек в организованный формат, если вы хотите использовать большинство сетей сегментации глубокого обучения, включая SqueezeSegV1, SqueezeSegV2, RangeNet ++ [2], и SalsaNext [3]. Для примера, показывающего, как использовать глубокое обучение для организованного облака точек, смотрите, что Семантическая Сегментация Облака точек Лидара Использует пример Нейронной сети для глубокого обучения SqueezeSegV2.
Чтобы преобразовать неорганизованное облако точек в организованный формат с помощью сферической проекции, необходимо указать, что параметры датчика лидара раньше создавали облако точек. Определите который параметры задать путем обращения к таблице данных для датчика. Можно задать следующие параметры.
Излучите настройку — 'uniform
'или 'gradient
'. Задайте 'uniform
'если лучи имеют равный интервал. Задайте 'gradient
'если лучи на горизонте плотно упаковываются, и те к верху и низу поля зрения датчика более растянуты.
Вертикальное разрешение — Количество каналов в вертикальном направлении, то есть, количество лазеров. Типичные значения равняются 32, и 64.
Вертикальные углы луча — Угловое положение каждого вертикального канала. Необходимо задать этот параметр, когда настройкой луча является 'gradient
'.
Вверх вертикальное поле зрения — Поле зрения в вертикальном направлении выше горизонта (в градусах).
Вниз вертикальное поле зрения — Поле зрения в вертикальном направлении ниже горизонта (в градусах).
Горизонтальное разрешение — Количество каналов в горизонтальном направлении. Типичные значения 512, и 1024.
Горизонтальное угловое разрешение — угловое разрешение между каждым каналом вдоль горизонтального направления. Необходимо задать этот параметр, когда горизонтальное разрешение не упоминается в таблице данных.
Горизонтальное поле зрения — Поле зрения, покрытое горизонтальным направлением (в градусах). В большинстве случаев это значение является 360 градусами.
Считайте облако точек с помощью 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)")
Отобразите и исходное организованное облако точек и восстановленное организованное облако точек с помощью helperShowUnorgAndOrgPair
функция помощника, присоединенная к этому примеру как вспомогательный файл.
display1 = helperShowUnorgAndOrgPair(); zoomFactor = 3.5; display1.plotLidarScan(ptCloudUnOrg,ptCloudOrg,zoomFactor);
Считайте облако точек с помощью 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);
Отобразите и исходное организованное облако точек и восстановленное организованное облако точек с помощью helperShowUnorgAndOrgPair
функция помощника, присоединенная к этому примеру как вспомогательный файл.
display2 = helperShowUnorgAndOrgPair(); zoomFactor = 2.5; display2.plotLidarScan(ptCloudUnOrg,ptCloudOrg,zoomFactor);
Для любого данного облака точек пользователи могут управлять параметрами датчика как вертикальное и горизонтальное разрешение, вертикальное и горизонтальное поле зрения при преобразовании в организованный формат. Это предоставляет больше гибкости пользователям.
Считайте облако точек с помощью 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);
Отобразите и исходное организованное облако точек и восстановленное организованное облако точек с помощью helperShowUnorgAndOrgPair
функция помощника, присоединенная к этому примеру как вспомогательный файл.
display3 = helperShowUnorgAndOrgPair(); display3.plotLidarScan(ptCloudUnOrg,ptCloudOrg,zoomFactor);
Считайте облако точек с помощью 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(:)));
Отобразите и исходное организованное облако точек и восстановленное организованное облако точек с помощью helperShowUnorgAndOrgPair
функция помощника, присоединенная к этому примеру как вспомогательный файл.
display4 = helperShowUnorgAndOrgPair(); zoomFactor = 4; display4.plotLidarScan(ptCloudUnOrg,ptCloudOrg,zoomFactor);
[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.