addScan

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

Описание

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

пример

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

Примечание

The 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. The axes 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. The axes 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-на-2 идентификаторов узла, которые соединяет каждое ребро.

  • Scores - Счета вновь связанных ребер в графике положения, возвращенные из сопоставления сканов, возвращенные как вектор.

Примечание

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

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

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

  • IsAccepted -- Логическое значение, указывающее, была ли принята оптимизация на основе ResidualError.

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

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

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

.
Введенный в R2019b
Для просмотра документации необходимо авторизоваться на сайте