exponenta event banner

addScan

Добавить сканирование на карту lidar 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 loop, добавление сканирований к объекту 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.

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

свернуть все

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

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

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

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

свернуть все

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

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

  • EdgeIDs - идентификаторы вновь соединенных рёбер в графе позы, возвращенные как вектор.

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

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

Примечание

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

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

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

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

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

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

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

.
Представлен в R2019b