buildMap

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

Описание

пример

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

Примеры

свернуть все

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 object. The axes object 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 object. The axes object 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 object. The axes object 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 имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

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

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

свернуть все

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

Введенный в R2019b