класс robotics.LidarSLAM

Пакет: робототехника

Выполните локализацию и сопоставляющий использующий сканирования лазерного дальномера

Описание

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

Конструкция

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

пример

slamObj = robotics.LidarSLAM(mapResolution,maxLidarRange) создает объект SLAM лазерного дальномера и устанавливает свойства MapResolution и MaxLidarRange на основе входных параметров.

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

Примеры

свернуть все

Используйте объект 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')

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

Методы

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

Больше о

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

Ссылки

[1] Гесс, Вольфганг, Дэймон Колер, Хольгер Рапп и Дэниел Андор. "Закрытие цикла в реальном времени в 2D ЛАЗЕРНОМ ДАЛЬНОМЕРЕ SLAM". 2 016 международных конференций IEEE по вопросам робототехники и автоматизации (ICRA). 2016.

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

Введенный в R2018a