addScan

Класс: робототехника. LidarSLAM
Пакет: робототехника

Добавьте сканирование, чтобы лоцировать карту SLAM

Синтаксис

addScan(slamObj,currScan)
addScan(slamObj,currScan,relPoseEst)
[isAccepted,loopClosureInfo,optimInfo] = addScan(___)

Описание

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

пример

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

[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 = robotics.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

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

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

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

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

развернуть все

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

Лоцируйте чтение сканирования, заданное как объект lidarScan. Это сканирование коррелируется к новому сканированию в slamObj с помощью соответствия сканирования.

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

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

развернуть все

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

Введенный в R2018a