exponenta event banner

lidarSLAM

Локализация и сопоставление с помощью сканирования lidar

Описание

lidarSLAM класс выполняет одновременную локализацию и отображение (SLAM) для входов датчика сканирования лидара. Алгоритм SLAM выполняет лидарные сканирования и присоединяет их к узлу в базовом графе позы. Затем алгоритм коррелирует сканирование с помощью сопоставления сканирования. Он также выполняет поиск замыканий цикла, где сканирование перекрывает ранее отображенные области, и оптимизирует положения узлов на графике позы.

Создание

Описание

slamObj = lidarSLAM создает лидарный объект SLAM. Размер карты занятости по умолчанию составляет 20 ячеек на метр. Максимальный диапазон для каждого сканирования лидара составляет 8 метров.

пример

slamObj = lidarSLAM(mapResolution,maxLidarRange) создает лидарный объект SLAM и задает MapResolution и MaxLidarRange свойства на основе входных данных.

slamObj = lidarSLAM(mapResolution,maxLidarRange,maxNumScans) указывает верхнюю границу количества принятых сканирований, разрешенных при создании кода. maxNumScans является положительным целым числом. Этот предел сканирования требуется только при создании кода.

Свойства

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

Базовый график позы, который соединяет сканирования, указанный как poseGraph объект. Добавление сканирований в lidarSLAM обновляет этот график позы. При обнаружении замыканий цикла график позы оптимизируется с помощью OptimizationFcn.

Разрешение сетки заполняемости, указанное как положительное целое число в ячейках на метр. Укажите разрешение карты при построении.

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

Функция оптимизации графика позы, заданная как дескриптор функции. По умолчанию алгоритм вызывает optimizePoseGraph функция. Чтобы указать собственный метод оптимизации, класс требует, чтобы сигнатура функции была:

[updatedPose,stat] = myOptimizationFcn(poseGraph)
poseGraph является poseGraph объект. updatedPose является вектором n-на-3 [x y theta] позиции, перечисленные в последовательном порядке идентификаторов узлов. stat - структура, содержащая ResidualError поле как положительный скаляр. Используйте stat чтобы включить другую информацию, относящуюся к оптимизации.

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

Радиус поиска для обнаружения замыкания контура, заданный как положительный скаляр. Увеличение этого радиуса влияет на производительность, увеличивая время поиска. Настройте это расстояние в зависимости от среды и ожидаемой траектории транспортного средства.

Число попыток найти замыкания с закольцовыванием, указанное как положительное целое число. Увеличение числа попыток влияет на производительность, увеличивая время поиска.

Разрешить автоматический откат добавленных замыканий цикла, указанных как true или false. Объект SLAM отслеживает остаточную ошибку, возвращенную OptimizationFcn. При обнаружении внезапного изменения остаточной ошибки это свойство имеет значение true, он отклоняет (откатывает) замыкание петли.

Число замыканий цикла, принятых для запуска оптимизации, указанное как положительное целое число. По умолчанию PoseGraph оптимизируется каждый раз lidarSLAM добавляет замыкание контура.

Минимальное изменение позы, необходимое для обработки сканирований, указанное как [translation rotation] вектор. Относительное изменение позы для вновь добавленного сканирования рассчитывается как [x y theta]. Если перемещение в xy-положении или вращение theta превышает эти пороги, lidarSLAM объект принимает сканирование и добавляет позу PoseGraph.

Метод регистрации сканирования, заданный как символьный вектор.

Примечание

Для использования метода фазовой корреляции требуется Toolbox™ обработки изображений.

Функции объекта

addScanДобавить сканирование на карту lidar SLAM
copyКопировать объект lidar SLAM
removeLoopClosures Удалить замыкания петель из графика позы
scansAndPoses Извлечь сканы и соответствующие позы
showСканировать графики и позы роботов

Примеры

свернуть все

Использовать 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.

Подробнее

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

Ссылки

[1] Хесс, Вольфганг, Деймон Колер, Хольгер Рапп и Даниэль Андор. «Замыкание петли в режиме реального времени в 2D LIDAR SLAM.» 2016 Международная конференция IEEE по робототехнике и автоматизации (ICRA). 2016.

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

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