exponenta event banner

Планирование путей в средах различной сложности

В этом примере показано, как вычислить путь без препятствий между двумя местоположениями на данной карте с помощью плановика путей вероятностной маршрутной карты (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)

Figure contains an axes. The axes with title Binary Occupancy Grid contains an object of type image.

Определение размеров робота и раздувание карты

Чтобы убедиться, что робот не сталкивается с какими-либо препятствиями, необходимо накачать карту на размер робота, прежде чем подавать ее планировщику пути PRM.

Здесь размер робота можно считать окружностью радиусом 0,2 метра. Затем можно раздувать карту по этому измерению с помощью inflate функция.

robotRadius = 0.2;

Как упоминалось выше, PRM не учитывает размер робота, и, следовательно, предоставление завышенной карты PRM учитывает размер робота. Создайте копию карты перед использованием inflate для сохранения исходной карты.

mapInflated = copy(map);
inflate(mapInflated,robotRadius);

Отображение завышенной карты

show(mapInflated)

Figure contains an axes. The axes with title Binary Occupancy Grid contains an object of type image.

Построение PRM и задание параметров

Теперь необходимо определить плановика путей. Создать mobileRobotPRM и определите связанные атрибуты.

prm = mobileRobotPRM;

Присвоение завышенной карты объекту PRM

prm.Map = mapInflated;

Определите количество узлов PRM, используемых при построении PRM. PRM создает маршрутную карту, используя заданное количество узлов на данной карте. Исходя из размерности и сложности входной карты, это один из основных атрибутов для настройки, чтобы получить решение между двумя точками на карте. Большое количество узлов создают плотную дорожную карту и увеличивают вероятность нахождения пути. Однако наличие большего количества узлов увеличивает время вычислений как для создания маршрутной карты, так и для поиска решения.

prm.NumNodes = 50;

Определите максимально допустимое расстояние между двумя подключенными узлами на карте. PRM соединяет все узлы, разделенные этим расстоянием (или меньшим) на карте. Это еще один атрибут для настройки в случае больших и/или сложных карт ввода. Большое расстояние соединения увеличивает связность между узлами для упрощения поиска пути, но может увеличить время вычисления при создании маршрутной карты.

prm.ConnectionDistance = 5;

Поиск возможного пути на построенном PRM

Определите начальное и конечное местоположения на карте для использования планировщиком путей.

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)

Figure contains an axes. The axes with title Probabilistic Roadmap contains 4 objects of type image, line, scatter.

Использование PRM для большой и сложной карты

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

map = binaryOccupancyMap(complexMap,1);

Отображение карты.

show(map)

Figure contains an axes. The axes with title Binary Occupancy Grid contains an object of type image.

Раздувание карты на основе измерения робота

Копирование и раздувание карты для увеличения размера робота во избежание препятствий

mapInflated = copy(map);
inflate(mapInflated, robotRadius);

Отображение завышенной карты.

show(mapInflated)

Figure contains an axes. The axes with title Binary Occupancy Grid contains an object of type image.

Связать существующий объект PRM с новой картой и задать параметры

Обновите объект PRM с помощью вновь завышенной карты и определите другие атрибуты.

prm.Map = mapInflated;

Установите NumNodes и ConnectionDistance свойства.

prm.NumNodes = 20;
prm.ConnectionDistance = 15;

Отображение графика PRM.

show(prm)

Figure contains an axes. The axes with title Probabilistic Roadmap contains 3 objects of type image, line, scatter.

Поиск возможного пути на построенном 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)

Figure contains an axes. The axes with title Probabilistic Roadmap contains 4 objects of type image, line, scatter.