buildMap

Создайте карту заполнения из сканов лидара

Описание

пример

map = buildMap(scans,poses,mapResolution,maxRange) создает occupancyMap map путем вставки lidar scans на заданном poses. Задайте разрешение получившейся карты, mapResolution, и максимальная область значений датчика лидара, maxRange.

Примеры

свернуть все

The buildMap функция принимает чтения сканов лидара и связанные положения, чтобы создать сетку заполнения как lidarScan объекты и связанные [x y theta] положения для создания occupancyMap.

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

load scansAndPoses.mat
length(scans) == length(poses)
ans = logical
   1

Создайте карту. Задайте сканы и положения в buildMap функция и включать желаемое разрешение карты (10 камеры на метр) и максимальная область значений лидара (19,2 метра). Каждый скан добавляется в связанных положениях, и значения вероятностей в сетке заполнения обновляются.

occMap = buildMap(scans,poses,10,19.2);
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.

Использование 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.

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

свернуть все

Сканы Лидара, используемые для построения карты, заданные как массив ячеек lidarScan объекты.

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

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

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

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: ['MapWidth',10]

Ширина сетки заполнения, заданная как разделенная разделенными запятой парами, состоящая из 'MapWidth' и положительная скалярная величина. Если это значение не задано, карта автоматически масштабируется, чтобы соответствовать всем лазерным сканам.

Высота сетки заполнения, заданная как разделенная разделенными запятой парами, состоящая из 'MapHeight' и положительная скалярная величина. Если это значение не задано, карта автоматически масштабируется, чтобы соответствовать всем лазерным сканам.

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

свернуть все

Карта заполнения, возвращенная как occupancyMap объект.

Введенный в R2019b