В этом примере показано, как вычислить путь без препятствий между двумя местоположениями на данной карте с помощью плановика путей вероятностной маршрутной карты (PRM). Планировщик путей PRM создает маршрутную карту в свободном пространстве данной карты, используя произвольно выбранные узлы в свободном пространстве и соединяя их друг с другом. После создания маршрутной карты можно запросить путь от заданного начального местоположения до заданного конечного местоположения на карте.
В этом примере карта представляется как сетка занятости с использованием импортированных данных. При выборке узлов в свободном пространстве карты PRM использует это двоичное представление сетки занятости для вывода свободного пространства. Кроме того, PRM не учитывает размер робота при вычислении пути без препятствий на карте. Следовательно, вы должны надувать карту на размер робота, чтобы позволить вычисление пути без препятствий, который учитывает размер робота и обеспечивает предотвращение столкновения для реального робота. Определите начальное и конечное местоположения на карте для плановика путей PRM для поиска пути без препятствий.
load exampleMaps.matИмпортированные карты: simpleMap, complexMap и ternaryMap.
whos *Map*Name Size Bytes Class Attributes complexMap 41x52 2132 logical emptyMap 26x27 702 logical simpleMap 26x27 702 logical ternaryMap 501x501 2008008 double
Использовать импортированный simpleMap данные и построение представления сетки занятости с использованием binaryOccupancyMap объект. Установите разрешение 2 ячейки на метр для этой карты.
map = binaryOccupancyMap(simpleMap,2);
Отображение карты с помощью show функции на binaryOccupancyMap объект
show(map)

Чтобы убедиться, что робот не сталкивается с какими-либо препятствиями, необходимо накачать карту на размер робота, прежде чем подавать ее планировщику пути PRM.
Здесь размер робота можно считать окружностью радиусом 0,2 метра. Затем можно раздувать карту по этому измерению с помощью inflate функция.
robotRadius = 0.2;
Как упоминалось выше, PRM не учитывает размер робота, и, следовательно, предоставление завышенной карты PRM учитывает размер робота. Создайте копию карты перед использованием inflate для сохранения исходной карты.
mapInflated = copy(map); inflate(mapInflated,robotRadius);
Отображение завышенной карты
show(mapInflated)

Теперь необходимо определить плановика путей. Создать mobileRobotPRM и определите связанные атрибуты.
prm = mobileRobotPRM;
Присвоение завышенной карты объекту PRM
prm.Map = mapInflated;
Определите количество узлов PRM, используемых при построении PRM. PRM создает маршрутную карту, используя заданное количество узлов на данной карте. Исходя из размерности и сложности входной карты, это один из основных атрибутов для настройки, чтобы получить решение между двумя точками на карте. Большое количество узлов создают плотную дорожную карту и увеличивают вероятность нахождения пути. Однако наличие большего количества узлов увеличивает время вычислений как для создания маршрутной карты, так и для поиска решения.
prm.NumNodes = 50;
Определите максимально допустимое расстояние между двумя подключенными узлами на карте. PRM соединяет все узлы, разделенные этим расстоянием (или меньшим) на карте. Это еще один атрибут для настройки в случае больших и/или сложных карт ввода. Большое расстояние соединения увеличивает связность между узлами для упрощения поиска пути, но может увеличить время вычисления при создании маршрутной карты.
prm.ConnectionDistance = 5;
Определите начальное и конечное местоположения на карте для использования планировщиком путей.
startLocation = [2 1]; endLocation = [12 10];
Поиск пути между начальным и конечным расположениями с помощью findpath функция. Решение представляет собой набор ППМ от начального местоположения до конечного местоположения. Обратите внимание, что path будет отличаться из-за вероятностного характера алгоритма PRM.
path = findpath(prm, startLocation, endLocation)
path = 7×2
2.0000 1.0000
1.9569 1.0546
1.8369 2.3856
3.2389 6.6106
7.8260 8.1330
11.4632 10.5857
12.0000 10.0000
Просмотрите решение PRM.
show(prm)

Использовать импортированный complexMap данные, представляющие собой большой и сложный план этажа, и построение двоичного представления сетки занятости с заданным разрешением (1 ячейка на метр)
map = binaryOccupancyMap(complexMap,1);
Отображение карты.
show(map)

Копирование и раздувание карты для увеличения размера робота во избежание препятствий
mapInflated = copy(map); inflate(mapInflated, robotRadius);
Отображение завышенной карты.
show(mapInflated)

Обновите объект PRM с помощью вновь завышенной карты и определите другие атрибуты.
prm.Map = mapInflated;
Установите NumNodes и ConnectionDistance свойства.
prm.NumNodes = 20; prm.ConnectionDistance = 15;
Отображение графика PRM.
show(prm)

Определите начальное и конечное расположение на карте для поиска пути, свободного от препятствий.
startLocation = [3 3]; endLocation = [45 35];
Поиск решения между начальным и конечным расположением. Для сложных карт может отсутствовать возможный путь для заданного числа узлов (возвращает пустой путь).
path = findpath(prm, startLocation, endLocation);
Поскольку вы планируете путь на большой и сложной карте, может потребоваться большее количество узлов. Однако часто непонятно, сколько узлов будет достаточно. Настройте количество узлов, чтобы убедиться в наличии возможного пути между начальным и конечным расположением.
while isempty(path) % No feasible path found yet, increase the number of nodes prm.NumNodes = prm.NumNodes + 10; % Use the |update| function to re-create the PRM roadmap with the changed % attribute update(prm); % Search for a feasible path with the updated PRM path = findpath(prm, startLocation, endLocation); end
Путь отображения.
path
path = 12×2
3.0000 3.0000
4.2287 4.2628
7.7686 5.6520
6.8570 8.2389
19.5613 8.4030
33.1838 8.7614
31.3248 16.3874
41.3317 17.5090
48.3017 25.8527
49.4926 36.8804
⋮
Просмотр решения PRM.
show(prm)
