Запланируйте путь между двумя состояниями
Используйте 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
набор свойств к истине.
planner.EnableConnectHeuristic = true; [pthObj,solnInfo] = plan(planner,start,goal);
Отобразите количество проделанных итераций для дерева, чтобы сходиться. Заметьте, что планировщик значительно требует меньшего количества итераций по сравнению с когда EnableConnectHeuristic
свойство установлено в ложь.
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 ложь ). |
ExitFlag | Указывает на причину завершения планировщика, возвращенного как:
|
StartTreeNumNodes | Количество узлов в дереве поиска запуска, когда планировщик отключает, исключая корневой узел. |
GoalTreeNumNodes | Количество узлов в целевом дереве поиска, когда планировщик отключает, исключая корневой узел. |
NumIterations | Количество объединенных итераций и деревом запуска и целевым деревом. |
StartTreeData | Набор исследуемых состояний, которые отражают состояние дерева поиска запуска, когда планировщик отключает. Обратите внимание на то, что NaN значения вставляются как разделители, чтобы разделить каждое отдельное ребро. |
GoalTreeData | Набор исследуемых состояний, которые отражают состояние целевого дерева поиска, когда планировщик отключает. Обратите внимание на то, что NaN значения вставляются как разделители, чтобы разделить каждое отдельное ребро. |
Типы данных: structure
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.