scansAndPoses

Извлеките сканы и соответствующие положения

Описание

пример

[scans,poses] = scansAndPoses(slamObj) возвращает сканы, используемые lidarSLAM возразите как lidarScan объекты, наряду с их связанным [x y theta] положения от базового графика положения slamObj.

[scans,poses] = scansAndPoses(slamObj,nodeIDs) возвращает сканы и положения для определенного идентификатора узла. Чтобы получить идентификаторы узла, смотрите базовый poseGraph объект в slamObj для идентификаторов узла.

Примеры

свернуть все

Используйте 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.

Входные параметры

свернуть все

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

Идентификаторы узла от графика положения в виде положительного целого числа. Узлы добавляются к графику положения с последовательными идентификационными номерами. Чтобы получить идентификаторы узла, смотрите базовый poseGraph объект в slamObj для идентификаторов узла.

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

свернуть все

Чтения сканов лидара, возвращенные как lidarScan объект.

Положение для каждого сканирования, возвращенное как n-by-3 матрица [x y theta] векторы. Каждая строка является положением, которое соответствует скану в scans.

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

Введенный в R2019b