Создайте карту заполнения из сканов лидара
создает 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')
Использование 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')
scans
- Сканы лидараlidarScan
объектыСканы Лидара, используемые для построения карты, заданные как массив ячеек lidarScan
объекты.
poses
- Положения сканов лидараПоложения сканов лидара, заданные как матрица n -by-3. Каждая строка является [x y theta]
вектор, представляющий xy-положение и угол ориентации скана.
mapResolution
- Разрешение сетки заполненияРазрешение выхода occupancyMap
карта, заданная как положительное целое число в камерах на метр.
maxRange
- Максимальная область значений датчика лидараМаксимальная область значений датчика лидара, заданная как положительная скалярная величина в метрах. Точки в scans
вне этой области значений игнорируются.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
['MapWidth',10]
'MapWidth'
- Ширина сетки заполненияШирина сетки заполнения, заданная как разделенная разделенными запятой парами, состоящая из 'MapWidth'
и положительная скалярная величина. Если это значение не задано, карта автоматически масштабируется, чтобы соответствовать всем лазерным сканам.
'MapHeight'
- Высота заполнения сеткиВысота сетки заполнения, заданная как разделенная разделенными запятой парами, состоящая из 'MapHeight'
и положительная скалярная величина. Если это значение не задано, карта автоматически масштабируется, чтобы соответствовать всем лазерным сканам.
map
- Карта заполненияoccupancyMap
объектКарта заполнения, возвращенная как occupancyMap
объект.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.