Планирование пути между двумя состояниями
Используйте plannerBiRRT объект для планирования пути между двумя состояниями в среде с препятствиями. Визуализация запланированного пути с интерполированными состояниями.
Создание пространства состояний.
ss = stateSpaceSE2;
Создание occupancyMap- средство проверки состояния на основе созданного пространства состояний.
sv = validatorOccupancyMap(ss);
Создайте карту занятости из примера карты и установите разрешение карты 10 ячеек на метр.
load exampleMaps
map = occupancyMap(ternaryMap,10);
sv.Map = map;Задайте расстояние проверки для средства проверки.
sv.ValidationDistance = 0.01;
Обновите границы пространства состояний так, чтобы они совпадали с границами карты.
ss.StateBounds = [map.XWorldLimits; map.YWorldLimits; [-pi pi]];
Создайте планировщик пути и увеличьте максимальное расстояние соединения.
planner = plannerBiRRT(ss,sv); planner.MaxConnectionDistance = 0.3;
Укажите начальное и целевое состояния.
start = [20 10 0]; goal = [40 40 0];
Запланируйте путь. Из-за случайности алгоритма RRT установите rng затравка для повторяемости.
rng(100,'twister')
[pthObj,solnInfo] = plan(planner,start,goal);Отображение количества итераций для сходимости дерева.
fprintf('Number of iterations: %d\n',solnInfo.NumIterations)Number of iterations: 346
Визуализация результатов.
show(map) hold on plot(solnInfo.StartTreeData(:,1),solnInfo.StartTreeData(:,2),'.-','color','b') % Start tree expansion plot(solnInfo.GoalTreeData(:,1),solnInfo.GoalTreeData(:,2),'.-','color','g') % Goal tree expansion plot(pthObj.States(:,1),pthObj.States(:,2),'r-','LineWidth',2) % draw path hold off

Измените путь с помощью EnableConnectHeuristic свойство имеет значение true.
planner.EnableConnectHeuristic = true; [pthObj,solnInfo] = plan(planner,start,goal);
Отображение количества итераций для сходимости дерева. Обратите внимание, что планировщику требуется значительно меньше итераций по сравнению с EnableConnectHeuristic свойство имеет значение false.
fprintf('Number of iterations: %d\n',solnInfo.NumIterations)Number of iterations: 135
Визуализация результатов.
figure show(map) hold on plot(solnInfo.StartTreeData(:,1),solnInfo.StartTreeData(:,2),'.-','color','b') % Start tree expansion plot(solnInfo.GoalTreeData(:,1),solnInfo.GoalTreeData(:,2),'.-','color','g') % Goal tree expansion plot(pthObj.States(:,1),pthObj.States(:,2),'r-','LineWidth',2) % draw path

planner - Планировщик путейplannerBiRRT объектПланировщик путей, указанный как plannerBiRRT объект.
startState - Начальное состояние путиНачальное состояние пути, указанное как N-элементный действительный вектор. N - количество измерений в пространстве состояний.
Пример: [1 1 pi/6]
Типы данных: single | double
goalState - Целевое состояние путиЦелевое состояние пути, указанное как N-элементный действительный вектор. N - количество измерений в пространстве состояний.
Пример: [2 2 pi/3]
Типы данных: single | double
path - Информация о планируемом путиnavPath объектИнформация о планируемом пути, возвращенная как navPath объект.
solnInfo - Информация о решенииИнформация о решении, возвращенная как структура. Структура содержит следующие поля:
| Область | Описание |
|---|---|
IsPathFound | Указывает, найден ли путь. Возвращается 1 (true), если найден путь. В противном случае возвращается 0 (false). |
ExitFlag | Указывает причину прекращения плановика, возвращаемую как:
|
StartTreeNumNodes | Количество узлов в начальном дереве поиска при завершении плановика, исключая корневой узел. |
GoalTreeNumNodes | Количество узлов в дереве поиска цели при завершении плановика, исключая корневой узел. |
NumIterations | Количество объединенных итераций по начальному дереву и дереву цели. |
StartTreeData | Коллекция исследованных состояний, отражающих статус начального дерева поиска при завершении плановика. Обратите внимание, что NaN значения вставляются как разделители для разделения каждого отдельного ребра. |
GoalTreeData | Коллекция исследованных состояний, отражающих статус дерева поиска цели при завершении плановика. Обратите внимание, что NaN значения вставляются как разделители для разделения каждого отдельного ребра. |
Типы данных: structure
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.