lidarSLAM

Выполните локализацию и картографию, используя сканы лидара

Описание

The 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 -by-3 [x y theta] положения перечислены в последовательном порядке идентификатора узла. stat - структура, содержащая ResidualError поле как положительная скалярная величина. Используйте stat для включения другой информации, относящейся к оптимизации.

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

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

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

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

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

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

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

Примечание

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

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

addScanДобавьте сканы в лидарную карту SLAM
copyКопировать лидарный объект 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 цикл, добавьте сканы к объекту 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 International Conference on Robotics and Automation (ICRA). 2016.

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

.
Введенный в R2019b