pcmapsegmatch

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

Описание

pcmapsegmatch объект создает карту сегментов и функций, и использует сегмент, совпадающий (с SegMatch [1]) алгоритм для распознавания места. Этот подход соответствия сегмента устойчив к динамическим препятствиям и надежен на крупномасштабных средах. Объектно-ориентированная память функции, и сегменты и их соответствующее представление IDs. Используйте представление IDs, чтобы соединить функции с представлением в объекте набора представления облака точек, 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 является количеством сегментов облака точек.

segment является группой 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 (UAV Toolbox).

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] Дубе, Renaud, Дэниел Дугас, Елена Стамм, Хуан Ньето, Роланд Сигварт и Сесар Кадена. “SegMatch: Распознавание Сегмент Бэзед-Плэйс в 3D Облаках точек”. На 2 017 Международных конференциях IEEE по вопросам Робототехники и Автоматизации (ICRA), 5266–72. Сингапур, Сингапур: IEEE, 2017. https://doi.org/10.1109/ICRA.2017.7989618.

Введенный в R2021a