pcmapsegmatch

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

Описание

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

Создание

Описание

пример

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

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

Свойства

расширить все

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

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

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

Вектор функции, заданный как N - вектор eigenFeature объекты, где N количество функций.

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

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

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

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

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

В настоящее время отобранная подкарта, определенная как вектор с 6 элементами формы [xmin, <<reservedrangesplaceholder4> <reservedrangesplaceholder3> <reservedrangesplaceholder2> <reservedrangesplaceholder1> <reservedr angesplaceholder0> ], который описывает область значений подкарты вдоль каждой оси. Элементы вектора описывают необходимую область, представленную подкартой.

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

Область значений карты вдоль оси 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] Dube, Renaud, Daniel Dugas, Elena Stumm, Juan Nieto, Roland Siegwart, and Cesar Cadena. SegMatch: Segment Based Place Recognition in 3D Облаков точек (неопр.) (недоступная ссылка). В 2017 году IEEE International Conference on Robotics and Automation (ICRA), 5266-72. Сингапур, Сингапур: IEEE, 2017. https://doi.org/10.1109/ICRA.2017.7989618.

Введенный в R2021a