Планируйте путь между двумя состояниями
Используйте 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
seed для повторяемости.
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.