exponenta event banner

findPose

Найти абсолютную позу на карте, которая выравнивает совпадения сегментов

Описание

Построение карты

absPoseMap = findPose(sMap,refPose) находит абсолютную позу последнего добавленного вида, который выравнивает совпадения сегментов обнаруженного замыкания контура. Функция ищет совпадения сегментов между последней добавленной формой и элементами сегмента внутри подкарты, указанной в SelectedSubmap имущество sMap.

[absPoseMap,matchViewId] = findPose(sMap,refPose) возвращает идентификатор представления, содержащего наибольшее количество вложенных элементов. Использовать matchViewId добавление замыкания контура в качестве соединения в pcviewset, с использованием addConnection объектная функция. Исправить для накопленного дрейфа с помощью optimizePoses.

Локализация

absPoseMap = findPose(sMap,currentFeatures) находит абсолютную позу, которая выравнивает сегменты, соответствующие текущим элементам currentFeatures к сегментам в подкарте, указанной SelectedSubmap имущество sMap.

absPoseMap = findPose(sMap,currentFeatures,currentSegments) определяет сегменты currentSegments которые соответствуют текущим характеристикам currentFeatures.

Визуализация

[___,inlierFeatures,inlierSegments] = findPose(___) возвращает элементы inlier inlierFeatures и более внутренние сегменты inlierSegments в дополнение к любой комбинации аргументов из предыдущих синтаксисов.

Необязательные аргументы «имя-значение»

[___] = findPose(___,Name,Value) указывает параметры, использующие один или несколько аргументов «имя-значение» в дополнение к входным аргументам в предыдущих синтаксисах. Например, 'MaxThreshold',1.5 устанавливает порог соответствия равным 1.5 процентов.

Примеры

свернуть все

Загрузите карту сегментов и элементов из файла 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.

Входные аргументы

свернуть все

Карта сегментов и элементов, заданная как pcmapsegmatch объект.

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

Текущие элементы, указанные как вектор М-элемента eigenFeature объекты.

Текущие сегменты, заданные как вектор М-элемента pointCloud объекты.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'MatchThreshold',1.5 устанавливает порог соответствия равным 1,5 процентам.

Порог соответствия, заданный как скаляр в диапазоне (0, 100]. Порог - это максимальный процент расстояния от идеального совпадения. Функция классифицирует сегменты как возможные совпадения, если расстояние между их векторами признаков ниже порогового значения.

Минимальное число входов, указанное как скаляр, больший или равный 3. Уменьшение этого значения может привести к ложным срабатываниям. Если количество обнаруженных входов меньше 'MinNumInliers', функция возвращает пустой вывод для absPoseMap .

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

Функция использует значение по умолчанию 10 для построения карты и 0 для локализации.

Максимальное расстояние для соответствия inlier centroid, указанное как положительный числовой скаляр. Это значение является максимальным расстоянием, которое центроид может отличаться от спроецированного местоположения его соответствия центроиду, которое будет считаться внутренним на этапе геометрической проверки.

Число ближайших элементов, выбранных в качестве кандидатов на совпадение элементов, указанных как положительное целое число. Для каждого элемента на последнем добавленном виде или в текущих элементах currentFeatures, функция выбирает ближайший 'NumNearestNeighbor' элементы как возможные совпадения элементов. Укажите большее значение для этого аргумента для карт с многочисленными аналогичными элементами.

Число кластеров элементов для проверки совпадений, указанное как положительное целое число. Функции объединяют элементы-кандидаты на основе их центроидных расположений. При указании refPose, то findPose функция выбирает кластеры, ближайшие к центроидам последнего добавленного вида currentFeatures. Уменьшите это значение, чтобы улучшить производительность за счет увеличения вероятности ложных негативов.

Выходные аргументы

свернуть все

Абсолютная поза на карте, возвращенная как rigid3d объект. Этот объект задает абсолютную позу, которая выравнивает совпадения сегментов.

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

Элементы Inlier, возвращаемые в виде матрицы N-by-2 eigenFeature объекты. Первый столбец соответствует входам на карте, а второй столбец соответствует входам на последнем добавленном виде или вводу текущих элементов.

Сегменты Inlier, возвращаемые как матрица N-by-2 pointCloud объекты. Первый столбец соответствует входам на карте, а второй столбец соответствует входам на последнем добавленном виде или вводу текущих сегментов.

Совет

  • Удаление сегментов с карты с помощью deleteSegments, перед использованием findPose функция, может улучшить производительность.

Алгоритмы

findPose находит абсолютную позу сегментированного облака точек с помощью алгоритма SegMatch [1] для распознавания места. Функция находит совпадения между интересующими сегментами и сегментами на карте и возвращает абсолютную позу, которая выравнивает совпадения сегментов на карте.

  • Map Building: Loop Closure Detection - Замыкание контура начинается с нахождения абсолютной позы путем нахождения совпадений сегментов между последним добавленным видом и элементами сегмента в выбранной подкарте, которая определяется SelectedSubmap свойства карты.

    Последнее добавленное представление соответствует замыканию цикла, когда findPose может оценить допустимое геометрическое преобразование. Если функция не может оценить это преобразование, то функция возвращает пустое значение для absPoseMap.

  • Построение карты: Правильный дрейф - чтобы исправить дрейф, добавьте вид, который содержит больше всего внутренних элементов для замыкания контура в качестве соединения с набором видов облака точек pcviewset объект как соединение с использованием addConnection объектная функция. Используйте optimizePoses функция для коррекции накопленного дрейфа.

  • Локализация - чтобы найти абсолютную позу облака точек на карте, функция ищет совпадения сегментов между текущими элементами currentFeatures и подкарту, указанную SelectedSubmap имущество sMap. Если невозможно оценить допустимое геометрическое преобразование, функция возвращает пустое значение для absPoseMap выходной аргумент.

  • Визуализация - используйте inlierFeatures и inlierSegments выходные аргументы с pcshowMatchedFeatures функция для визуализации совпадений сегментов между элементами и сегментами, включенными в карту.

Ссылки

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

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