Проверка допустимости состояния
В этом примере показано, как проверить пути через среду.
Загрузить примерные карты. Используйте простую карту для создания двоичной карты занятости.
load exampleMaps.mat
map = occupancyMap(simpleMap);
show(map)
Укажите грубый путь к карте.
path = [2 2 pi/2; 10 15 0; 17 8 -pi/2]; hold on plot(path(:,1),path(:,2),"--o")

Создание средства проверки состояния с помощью stateSpaceSE2 определение. Укажите карту и расстояние для интерполяции и проверки сегментов пути.
validator = validatorOccupancyMap(stateSpaceSE2); validator.Map = map; validator.ValidationDistance = 0.1;
Проверьте, являются ли точки пути допустимыми состояниями. Все три точки находятся в свободном пространстве, поэтому считаются действительными.
isValid = isStateValid(validator,path)
isValid = 3x1 logical array
1
1
1
Проверьте движение между каждым последовательным состоянием пути. isMotionValid интерполирует по пути между состояниями. Если сегмент контура недопустим, постройте график последней допустимой точки вдоль контура.
startStates = [path(1,:);path(2,:)];
endStates = [path(2,:);path(3,:)];
for i = 1:2
[isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));
if ~isPathValid
plot(lastValid(1),lastValid(2),'or')
end
end
hold off
В этом примере используются:
В этом примере показано, как проверить пути через среду.
Загрузить примерные карты. Используйте простую карту для создания карты затрат на транспортное средство. Укажите инфляционный рейд в 1 метр.
load exampleMaps.mat map = vehicleCostmap(double(simpleMap)); map.CollisionChecker = inflationCollisionChecker("InflationRadius",1); plot(map)

Укажите грубый путь к карте.
path = [3 3 pi/2; 8 15 0; 17 8 -pi/2]; hold on plot(path(:,1),path(:,2),"--o")

Создание средства проверки состояния с помощью stateSpaceSE2 определение. Укажите карту и расстояние для интерполяции и проверки сегментов пути.
validator = validatorVehicleCostmap(stateSpaceSE2); validator.Map = map; validator.ValidationDistance = 0.1;
Проверьте, являются ли точки пути допустимыми состояниями. Все три точки находятся в свободном пространстве, поэтому считаются действительными.
isValid = isStateValid(validator,path)
isValid = 3x1 logical array
1
1
1
Проверьте движение между каждым последовательным состоянием пути. isMotionValid интерполирует по пути между состояниями. Если сегмент контура недопустим, постройте график последней допустимой точки вдоль контура.
startStates = [path(1,:);path(2,:)];
endStates = [path(2,:);path(3,:)];
for i = 1:2
[isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));
if ~isPathValid
plot(lastValid(1),lastValid(2),'or')
end
end
hold off
Создайте карту занятости 3-D и связанный с ней средство проверки состояния. Планирование, проверка и визуализация пути по карте занятости.
Загрузить и назначить карту средству проверки состояния
Загрузите карту заполняемости 3-D городского блока в рабочее пространство. Укажите порог, для которого ячейки будут рассматриваться как свободные от препятствий.
mapData = load('dMapCityBlock.mat');
omap = mapData.omap;
omap.FreeThreshold = 0.5;Чтобы добавить буферную зону для безопасной работы вокруг препятствий, увеличьте карту заполняемости.
inflate(omap,5)
Создайте объект пространства состояния SE (3) с границами для переменных состояния.
ss = stateSpaceSE3([-20 220;
-20 220;
-10 100;
inf inf;
inf inf;
inf inf;
inf inf]);Создайте средство проверки состояния карты занятости 3-D, используя созданное пространство состояний.
sv = validatorOccupancyMap3D(ss);
Назначьте карту занятости объекту проверки состояния. Укажите интервал расстояния выборки.
sv.Map = omap; sv.ValidationDistance = 0.1;
Планирование и визуализация траектории
Создайте планировщик путей с увеличенным максимальным расстоянием соединения. Уменьшите максимальное число итераций.
planner = plannerRRT(ss,sv); planner.MaxConnectionDistance = 50; planner.MaxIterations = 1000;
Создайте определяемую пользователем функцию оценки для определения того, достигает ли путь цели. Укажите вероятность выбора целевого состояния во время выборки.
planner.GoalReachedFcn = @(~,x,y)(norm(x(1:3)-y(1:3))<5); planner.GoalBias = 0.1;
Задайте начальное и целевое состояния.
start = [40 180 25 0.7 0.2 0 0.1]; goal = [150 33 35 0.3 0 0.1 0.6];
Запланируйте траекторию, используя указанные начало, цель и планировщик.
[pthObj,solnInfo] = plan(planner,start,goal);
Убедитесь, что точки пути являются допустимыми состояниями.
isValid = isStateValid(sv,pthObj.States)
isValid = 6x1 logical array
1
1
1
1
1
1
Убедитесь, что движение между каждым состоянием последовательного пути является действительным.
isPathValid = zeros(size(pthObj.States,1)-1,1,'logical'); for i = 1:size(pthObj.States,1)-1 [isPathValid(i),~] = isMotionValid(sv,pthObj.States(i,:),... pthObj.States(i+1,:)); end isPathValid
isPathValid = 5x1 logical array
1
1
1
1
1
Визуализация результатов.
show(omap) hold on scatter3(start(1,1),start(1,2),start(1,3),'g','filled') % draw start state scatter3(goal(1,1),goal(1,2),goal(1,3),'r','filled') % draw goal state plot3(pthObj.States(:,1),pthObj.States(:,2),pthObj.States(:,3),... 'r-','LineWidth',2) % draw path

validator - Объект проверки состоянияnav.StateValidatorОбъект проверки состояния, указанный как объект подкласса nav.StateValidator. Это предварительно определенные объекты проверки состояния:
states - Государственные должностиПозиции состояния, заданные как вектор строки n-элемента или матрица m-by-n. n - размер пространства состояния, указанный в validator. m - количество состояний для проверки.
Типы данных: single | double
isValid - Действительные состоянияДопустимые состояния, возвращаемые в виде вектора логического столбца m-элемента.
Типы данных: logical
isMotionValid | nav.StateSpace | nav.StateValidator | stateSpaceSE2
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.