Вероятностная дорожная карта (PRM) является сетевым графиком возможных путей в заданной карте, основанным на свободных и занятых пространствах. The mobileRobotPRM
объект случайным образом генерирует узлы и создает соединения между этими узлами на основе параметров алгоритма PRM. Узлы соединяются на основе расположения препятствий, заданных в Map
, и на заданной ConnectionDistance
. Можно настроить число узлов, NumNodes
, для соответствия сложности карты и желанию найти наиболее эффективный путь. Алгоритм PRM использует сеть связанных узлов, чтобы найти путь без препятствий от начала до конечного местоположения. Чтобы эффективно планировать путь через окружение, настройте NumNodes
и ConnectionDistance
свойства.
При создании или обновлении mobileRobotPRM
класс, местоположения узлов генерируются случайным образом, что может повлиять на ваш конечный путь между несколькими итерациями. Этот выбор узлов происходит, когда вы задаете Map
первоначально измените параметры, или update
вызывается. Чтобы получить последовательные результаты с тем же размещением узла, используйте rng
для сохранения состояния генерации случайных чисел. Смотрите раздел «Настройка расстояния соединения» для примера, используя rng
.
Используйте NumNodes
свойство на mobileRobotPRM
объект, чтобы настроить алгоритм. NumNodes
задает число точек или узлов, размещенных на карте, которое алгоритм использует для создания дорожной карты. Использование ConnectionDistance
свойство как порог расстояния, алгоритм соединяет все точки, которые не имеют препятствий, блокирующих прямой путь между ними.
Увеличение числа узлов может увеличить эффективность пути путем предоставления более допустимых путей. Однако повышенная сложность увеличивает время расчета. Чтобы получить хорошее покрытие карты, вам может понадобиться большое число узлов. Из-за случайного размещения узлов в некоторых областях карты может не хватить узлов, чтобы соединиться с остальной частью карты. В этом примере вы создаете большое и маленькое число узлов в дорожной карте.
Загрузите файл карты как логическую матрицу, simpleMaps
, и создать сетку заполнения.
load exampleMaps.mat
map = binaryOccupancyMap(simpleMap,2);
Создайте простую дорожную карту с 50 узлами.
prmSimple = mobileRobotPRM(map,50); show(prmSimple)
Создайте плотную дорожную карту с 250 узлами.
prmComplex = mobileRobotPRM(map,250); show(prmComplex)
Дополнительные узлы увеличивают сложность, но дают больше опции улучшить путь. Учитывая эти две карты, можно вычислить путь с помощью алгоритма PRM и увидеть эффекты.
Вычислите простой путь.
startLocation = [2 1]; endLocation = [12 10]; path = findpath(prmSimple,startLocation,endLocation); show(prmSimple)
Вычислите сложный путь.
path = findpath(prmComplex, startLocation, endLocation); show(prmComplex)
Увеличение узлов позволяет получить более прямой путь, но добавляет больше времени расчета к поиску допустимого пути. Из-за случайного размещения точек путь не всегда является более прямым или эффективным. Использование небольшого числа узлов может сделать пути хуже, чем изображено, и даже ограничить возможность найти полный путь.
Используйте ConnectionDistance
свойство на PRM
объект, чтобы настроить алгоритм. ConnectionDistance
является верхним порогом для точек, которые соединяются в дорожной карте. Каждый узел соединяется со всеми узлами на этом расстоянии соединения, которые не имеют препятствий между ними. Снижая расстояние соединения, можно ограничить количество соединений, чтобы уменьшить время расчета и упростить карту. Однако уменьшенное расстояние ограничивает количество доступных путей, от которых можно найти полный путь без препятствий. При работе с простыми картами можно использовать более высокое расстояние соединения с небольшим числом узлов для повышения эффективности. Для сложных карт с большим количеством препятствий более высокое число узлов с уменьшенным расстоянием соединения увеличивает вероятность нахождения решения.
Загрузите карту как логическую матрицу, simpleMap
, и создать сетку заполнения.
load exampleMaps.mat
map = binaryOccupancyMap(simpleMap,2);
Создайте маршрутную карту со 100 узлами и вычислите путь. Значение по умолчанию ConnectionDistance
установлено значение inf. сохраните настройки генерации случайных чисел с помощью функции rng. Сохраненные настройки позволяют вам воспроизводить одни и те же точки и видеть эффект изменения ConnectionDistance
.
rngState = rng; prm = mobileRobotPRM(map,100); startLocation = [2 1]; endLocation = [12 10]; path = findpath(prm,startLocation,endLocation); show(prm)
Перезагрузите настройки генерации случайных чисел, чтобы PRM использовал те же узлы. Нижняя ConnectionDistance
Для 2 м. Отобразите вычисленный путь.
rng(rngState); prm.ConnectionDistance = 2; path = findpath(prm,startLocation,endLocation); show(prm)
При использовании mobileRobotPRM
объект и изменение свойств, при каждом новом вызове функции объект запускает точки маршрутной карты и соединения, которые будут пересчитаны. Поскольку пересчет карты может быть интенсивным в вычислительном отношении, можно повторно использовать ту же дорожную карту, вызывая findpath
с различными начальными и конечными местоположениями.
Загрузите карту, simpleMap
, из .mat
файла как логической матрицы и создания сетки заполнения.
load('exampleMaps.mat')
map = binaryOccupancyMap(simpleMap,2);
Создайте дорожную карту. Ваши узлы и соединения могут выглядеть по-другому из-за случайного размещения узлов.
prm = mobileRobotPRM(map,100); show(prm)
Функции update
или измените параметр, чтобы обновить узлы и соединения.
update(prm) show(prm)
Алгоритм PRM пересчитывает размещение узла и генерирует новую сеть узлов.
[1] Кавраки, Л.Э., П. Светка, Ж.-К. Латомбе и М. Х. Овермарс. «Вероятностные дорожные карты для планирования пути в высоко-размерных пространствах строения», Транзакции IEEE по робототехнике и автоматизации. Том 12, № 4, авг. 1996 с. 566 - 580.