lidarSLAM

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

Описание

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

Создание

Описание

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 структура, чтобы включать другую информацию, относящуюся к вашей оптимизации.

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

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

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

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

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

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

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

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

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

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

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

Больше о

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

Ссылки

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

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

Введенный в R2019b