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-на-3 матрица [x y theta] векторы. Каждая строка является положением, которое соответствует скану в scans.

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

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