addScan

Добавьте сканы в лидарную карту SLAM

Описание

addScan(slamObj,currScan) добавляет скан лидара, currScan, к лидарному объекту SLAM, slamObj. Функциональное сопоставление сканов использования, чтобы сопоставить этот скан с новым, затем добавляет его в график положения, заданный в slamObj. Если скан принят, addScan обнаруживает закрытия цикла и оптимизирует на основе настроек в slamObj.

пример

addScan(slamObj,currScan,relPoseEst) также задает относительное положение к последнему положению скана лидара в slamObj. Это относительное положение улучшает сопоставление сканов.

Примечание

relPoseEst вход проигнорирован когда ScanRegistrationMethod свойство lidarSLAM объект установлен в 'PhaseCorrelation'.

[isAccepted,loopClosureInfo,optimInfo] = addScan(___) выходная подробная информация о добавлении скана к объекту SLAM. isAccepted указывает, добавляется ли скан или отклоняется. loopClosureInfo и optimInfo укажите, обнаруживается ли закрытие цикла, или график положения оптимизирован.

Примеры

свернуть все

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

Загрузите данные и настроенный алгоритм SLAM

Загрузите массив ячеек lidarScan объекты. Сканы лидара были собраны в гараже на роботе Husky® от ClearPath Robotics®. Как правило, сканы лидара взяты на высокой частоте, и каждый скан не нужен для SLAM. Поэтому уменьшите выборку сканирования путем выбора только каждого 40-го скана.

load garage_fl1_southend.mat scans
scans = scans(1:40:end);

Чтобы настроить алгоритм SLAM, укажите диапазон лидара, сопоставьте разрешение, порог закрытия цикла и поисковый радиус. Настройте эти параметры для своего определенного робота и среды. Создайте lidarSLAM объект этими параметрами.

maxRange = 19.2; % meters
resolution = 10; % cells per meter

slamObj = lidarSLAM(resolution,maxRange);
slamObj.LoopClosureThreshold = 360;
slamObj.LoopClosureSearchRadius = 8;

Добавьте сканы итеративно

Используя for цикл, добавляют сканы к объекту SLAM. Объект использует сопоставление сканов, чтобы сравнить каждый добавленный скан с ранее добавленными единицами. Чтобы улучшить карту, объект оптимизирует график положения каждый раз, когда это обнаруживает закрытие цикла. Каждые 10 сканов, отобразите сохраненные положения и сканы.

for i = 1:numel(scans)

    addScan(slamObj,scans{i});
    
    if rem(i,10) == 0
        show(slamObj);
    end
end

Figure contains an axes object. The axes object contains 121 objects of type line.

Просмотрите карту заполнения

После добавления всех сканов к объекту SLAM создайте occupancyMap карта путем вызова buildMap со сканами и положениями. Используйте то же разрешение карты и макс. область значений, которую вы использовали с объектом SLAM.

[scansSLAM,poses] = scansAndPoses(slamObj);
occMap = buildMap(scansSLAM,poses,resolution,maxRange);
figure
show(occMap)
title('Occupancy Map of Garage')

Figure contains an axes object. The axes object with title Occupancy Map of Garage contains an object of type image.

Входные параметры

свернуть все

Лидарный объект SLAM в виде lidarSLAM объект. Объект содержит параметры алгоритма SLAM, данные о датчике, и базовый график положения раньше создавал карту.

Чтение сканов лидара в виде lidarScan объект. Этот скан сопоставлен с новым сканом в slamObj используя соответствия сканирования.

Относительная оценка положения скана в виде [x y theta] вектор. Это относительное положение улучшает сопоставление сканов.

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

свернуть все

Указывает, принят ли скан, возвращен как true или false. Если относительное положение между сканами ниже MovementThreshold свойство slamObj, скан отклоняется. По умолчанию все сканы приняты.

Детали закрытия цикла, возвращенные как структура с этими полями:

  • EdgeIDs – Идентификаторы недавно связанных ребер в графике положения, возвращенном как вектор.

  • Edges – Недавно добавленные ребра закрытия цикла, возвращенные как n-by-2 матрица идентификаторов узла, которые соединяет каждое ребро.

  • Scores – Множество недавно связанных ребер в графике положения, возвращенном в сопоставление сканов, возвращенное как вектор.

Примечание

Если LoopClosureAutoRollback свойство установлено в true в slamObj, ребра закрытия цикла могут быть удалены из графика положения. Это свойство отклоняет закрытия циклов, если остаточная ошибка изменяется решительно после оптимизации. Поэтому некоторые идентификаторы ребра, перечисленные в этой структуре, не могут существовать в фактическом графике положения.

Детали оптимизации графика положения, возвращенные как структура с этими полями:

  • IsPerformed – Boolean, указывающий, выполняется ли оптимизация при добавлении этого скана. Эффективность оптимизации зависит от OptimizationInterval свойство в slamObj.

  • IsAccepted – Boolean, указывающий, была ли оптимизация принята на основе ResidualError.

  • ResidualError – Ошибка сопоставлена с оптимизацией, возвращенной как скаляр.

  • LoopClosureRemoved – Список идентификаторов ребер закрытия цикла, удаленных во время оптимизации, возвращенной как вектор.

Расширенные возможности

Введенный в R2019b