exponenta event banner

pcmapsegmatch

Карта сегментов и функций для локализации и обнаружения замыкания контура

Описание

pcmapsegmatch объект создает карту сегментов и элементов и использует алгоритм сопоставления сегментов (SegMatch [1]) для распознавания места. Такой подход к сопоставлению сегментов обеспечивает устойчивость к динамическим препятствиям и надежность в крупномасштабных средах. Объект хранит элементы и сегменты и соответствующие им идентификаторы видов. Используйте идентификаторы видов, чтобы связать элементы с видом в объекте набора видов облака точек. pcviewset, для построения карты.

Создание

Описание

пример

sMap = pcmapsegmatch возвращает значение по умолчанию pcmapsegmatch объект. Используйте addView функция объекта для добавления видов и их соответствующих сегментов и элементов на карту.

sMap = pcmapsegmatch('CentroidDistance',dist) дополнительно указывает минимальное расстояние между центроидами сегментов при добавлении сегментов и их соответствующих элементов на карту. Сегменты с центроидами ближе указанного расстояния dist, не добавляются на карту. dist указан как положительный скаляр со значением по умолчанию 0.1.

Свойства

развернуть все

Это свойство доступно только для чтения.

Идентификатор представления, заданный как вектор M-элементов целых чисел, где M - количество представлений, добавленных в pcmapsegmatch.

Это свойство доступно только для чтения.

Вектор элемента, заданный как вектор N-элемента eigenFeature , где N - количество элементов.

Используйте addView функция объекта для добавления элементов для уникальных сегментов на карту. При обновлении карты с помощью updateMap функция объекта, элементы, соответствующие повторяющимся сегментам, удаляются из карты, если они находятся в пределах CentroidDistance.

Это свойство доступно только для чтения.

Сегменты облака точек, заданные как N-элементный вектор pointCloud , где N - количество сегментов облака точек.

Сегмент - это группа 3-D точек, близких друг к другу и представляющих частичный или полный объект.

Это свойство доступно только для чтения.

Выбранная в настоящее время подкарта, заданная как 6-элементный вектор вида [xmin, xmax ymin ymax zmin zmax], который описывает диапазон подкарты вдоль каждой оси. Элементы вектора описывают интересующую область, представленную подкартой.

Это свойство доступно только для чтения.

Диапазон карты вдоль оси X, заданный как 2-элементный вектор вида [xmin xmax].

Это свойство доступно только для чтения.

Диапазон карты вдоль оси Y, заданный как 2-элементный вектор вида [ymin ymax].

Это свойство доступно только для чтения.

Диапазон карты вдоль оси z, заданный как 2-элементный вектор вида [zmin zmax].

Это свойство доступно только для чтения.

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

Функции объекта

addViewДобавить представление на карту
deleteViewУдалить представление с карты
findViewИзвлечение индексов элементов и сегментов, соответствующих представлению карты
hasViewПроверка наличия представления на карте
deleteSegmentsУдалить все сегменты на карте
findPoseНайти абсолютную позу на карте, которая выравнивает совпадения сегментов
updateMapОбновление местоположения центроида и сегмента облака точек на карте
selectSubmapВыбор подкарты в карте
isInsideSubmapПроверьте, находится ли позиция запроса внутри выбранной подкарты
showВизуализация сегментов облака точек на карте

Примеры

свернуть все

Загрузите карту сегментов и элементов из файла MAT. Данные облака точек на карте собраны с помощью блока Simulation 3D Lidar (Панель инструментов БПЛА).

data = load('segmatchMapFullParkingLot.mat');
sMap = data.segmatchMapFullParkingLot;

Загрузка сканирования облака точек из файла MAT.

data = load('fullParkingLotData.mat');
ptCloudScans = data.fullParkingLotData;

Отображение карты сегментов.

ax = show(sMap);

Измените угол обзора на вид сверху.

view(2)
pause(0.2)

Задайте радиус для выбора цилиндрической окрестности.

outerCylinderRadius = 20;
innerCylinderRadius = 3;

Задайте пороговые параметры сегментации.

distThreshold = 0.5;
angleThreshold = 180;

Установка пороговых параметров размера и подкарты для выбранной подкарты

sz = [65 30 20];
submapThreshold = 10;

Задайте параметр радиуса для визуализации.

radius = 0.5;

Сегментируйте каждое облако точек и локализуйте, найдя совпадения сегментов.

for n = 1:numel(ptCloudScans)
    ptCloud = ptCloudScans(n);

    % Segment and remove the ground plane.
    groundPtsIdx = segmentGroundFromLidarData(ptCloud,'ElevationAngleDelta',11);
    ptCloud = select(ptCloud,~groundPtsIdx,'OutputSize','full');

    % Select the cylindrical neighborhood.
    dists = sqrt(ptCloud.Location(:,:,1).^2 + ptCloud.Location(:,:,2).^2);
    cylinderIdx = dists <= outerCylinderRadius & dists > innerCylinderRadius;
    ptCloud = select(ptCloud,cylinderIdx,'OutputSize','full');

    % Segment the point cloud.
    labels = segmentLidarData(ptCloud,distThreshold,angleThreshold,'NumClusterPoints',[50 5000]);

    % Extract features from the point cloud.
    [features,segments] = extractEigenFeatures(ptCloud,labels);

    % Localize by finding the absolute pose in the map that aligns the segment matches.
    [absPoseMap,~,inlierFeatures,inlierSegments] = findPose(sMap,features,segments);
    
    if isempty(absPoseMap)
        continue;
    end
 
    % Display the position estimate in the map.
    poseTranslation = absPoseMap.Translation;
    pos = [poseTranslation(1:2) radius];
    showShape('circle',pos,'Color','r','Parent',ax);
    pause(0.2)

    % Determine if the selected submap needs to be updated.
    [isInside,distToEdge] = isInsideSubmap(sMap,poseTranslation);
    needSelectSubmap = ~isInside ...                  % Current pose is outside submap
        || any(distToEdge(1:2) < submapThreshold) ... % Current pose is close to submap edge
        || n == 1;                                    % 1st time localizing using whole map

    % Select a new submap.
    if needSelectSubmap
        sMap = selectSubmap(sMap,poseTranslation,sz);
    end
 end

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

% Visualize the last segment matches.
figure; 
pcshowMatchedFeatures(inlierSegments(:,1),inlierSegments(:,2),inlierFeatures(:,1),inlierFeatures(:,2))

Figure contains an axes. The axes contains 5 objects of type scatter, line.

Ссылки

[1] Дюбе, Рено, Даниэль Дугас, Елена Штумм, Хуан Ньето, Роланд Зигварт и Сесар Кадена. «SegMatch: распознавание места на основе сегментов в облаках точек 3D». В 2017 году IEEE Международная конференция по робототехнике и автоматизации (ICRA), 5266-72. Сингапур, Сингапур: IEEE, 2017. https://doi.org/10.1109/ICRA.2017.7989618.

Представлен в R2021a