Отобразите тела эго и препятствия в среде
отображает начальное состояние всех тел эго и препятствий в заданном списке капсул, и возвращает указатель осей графика.ax
= show(capsuleListObj
)
задает аргументы пары "имя-значение" использования опций. Например, ax
= show(capsuleListObj
,Name,Value
)'FastUpdate',true
включает быстрые обновления существующего графика.
Создайте путь к телу эго и обеспечьте состояния препятствия с помощью dynamicCapsuleList
объект. Визуализируйте состояния всех объектов в среде в различных метках времени. Подтвердите путь тела эго путем проверки на столкновения с препятствиями в среде.
Создайте dynamicCapsuleList
объект. Извлеките максимальное количество шагов, чтобы использовать в качестве количества меток времени для ваших контуров объектов.
obsList = dynamicCapsuleList; numSteps = obsList.MaxNumSteps;
Добавьте тело эго
Задайте тело эго путем определения ID, геометрии, и утвердите вместе в структуре. Краткая геометрия имеет длину 3 м и радиус 1 м. Задайте состояние как линейный контур от x = 0m к x = 100 м.
egoID1 = 1; geom = struct("Length",3,"Radius",1,"FixedTransform",eye(3)); states = linspace(0,1,obsList.MaxNumSteps)'.*[100 0 0]; egoCapsule1 = struct('ID',egoID1,'States',states,'Geometry',geom); addEgo(obsList,egoCapsule1); show(obsList,"TimeStep",[1:numSteps]); ylim([-20 20])
Добавьте препятствия
Задайте состояния для двух препятствий, которые разделяются от тела эго на 5 м в противоположных направлениях на оси Y.. Примите, что препятствия имеют ту же геометрию geom
как тело эго.
obsState1 = states + [0 5 0]; obsState2 = states + [0 -5 0]; obsCapsule1 = struct('ID',1,'States',obsState1,'Geometry',geom); obsCapsule2 = struct('ID',2,'States',obsState2,'Geometry',geom); addObstacle(obsList,obsCapsule1); addObstacle(obsList,obsCapsule2); show(obsList,"TimeStep",[1:numSteps]); ylim([-20 20])
Обновите препятствия
Изменяйте свои местоположения препятствия и размерности геометрии в зависимости от времени. Используйте ранее сгенерированную структуру, измените поля и обновите препятствия с помощью updateObstacleGeometry
и updateObstaclePose
функции объекта. Уменьшает радиус первого препятствия 0,5 м, и измените путь, чтобы переместить его к телу эго.
obsCapsule1.Geometry.Radius = 0.5; obsCapsule1.States = ... [linspace(0,100,numSteps)' ... % x linspace(5,-4,numSteps)' ... % y zeros(numSteps,1)]; % theta updateObstacleGeometry(obsList,1,obsCapsule1); updateObstaclePose(obsList,1,obsCapsule1);
Проверяйте на столкновения
Визуализируйте новые пути. Покажите, где столкновения между телом эго и препятствием, которое отображение подсвечивает в красном. Заметьте, что столкновения между препятствиями не проверяются.
show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1); ylim([-20 20]) xlabel("X (m)") ylabel("Y (m)")
Программно проверяйте на столкновения при помощи checkCollision
объектная функция. Функция возвращает вектор из логических значений, который указывает на состояние каждого временного шага. Вектор транспонирован в целях отображения.
collisions = checkCollision(obsList)'
collisions = 1x31 logical array
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
Чтобы подтвердить пути с большим количеством шагов, используйте any
функция на векторе из значений столкновения.
if any(collisions) disp("Collision detected.") end
Collision detected.
Обновите путь к эго
Задайте новый путь для тела эго. Визуализируйте пути снова, отображая столкновения.
egoCapsule1.States = ... [linspace(0,100,numSteps)' ... % x 3*sin(linspace(0,2*pi,numSteps))' ... % y zeros(numSteps,1)]; % theta updateEgoPose(obsList,1,egoCapsule1); show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1); ylim([-20 20])
capsuleListObj
— Динамический список капсулdynamicCapsuleList
возразите | dynamicCapsuleList3D
объектДинамический список капсул в виде dynamicCapsuleList
или dynamicCapsuleList3D
объект.
Задайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
'FastUpdate',true
включает опцию для быстрых обновлений в существующем графике.'Parent'
— Родительские оси, чтобы построить наgca
(значение по умолчанию) | Axes
указательРодительские оси, чтобы построить на в виде разделенной запятой пары, состоящей из 'Parent'
и указатель Свойств осей графика.
'FastUpdate'
— Выполните быстрое обновление существующего графикаfalse
или 0
(значение по умолчанию) | true
или 1
Выполните быстрое обновление существующего графика в виде разделенной запятой пары, состоящей из 'FastUpdate'
и логический 0
ложь
) или 1
TRUE
). Необходимо использовать show
возразите функции, чтобы первоначально отобразить ваш список капсул, прежде чем можно будет задать его с этим аргументом.
Типы данных: логический
'TimeStep'
— Временные шаги, чтобы отобразиться
(значение по умолчанию) | числовой вектор Временные шаги, чтобы отобразиться в виде разделенной запятой пары, состоящей из 'TimeStep'
и числовой вектор из значений в области значений [1, N], где N является значением MaxNumSteps
свойство объекта задано в capsuleListObj
аргумент. Каждый временной шаг соответствует строке матрицы состояния для каждого тела эго и препятствия.
'ShowCollisions'
— Проверяйте на и подсветите столкновения в отображенииfalse
или 0
(значение по умолчанию) | true
или 1
Проверяйте на и подсветите столкновения в отображении в виде разделенной запятой пары, состоящей из 'ShowCollisions'
и логический 0
ложь
) или 1
TRUE
).
Типы данных: логический
'EgoIDs'
— Идентификаторы эго, чтобы отобразитьсяИдентификаторы эго, чтобы отобразиться в виде разделенной запятой пары, состоящей из 'EgoIDs'
и вектор из положительных целых чисел. По умолчанию объектная функция отображает все тела эго.
'ObstacleIDs'
— Идентификаторы препятствия, чтобы отобразитьсяИдентификаторы препятствия, чтобы отобразиться в виде разделенной запятой пары, состоящей из 'ObstacleIDs'
и вектор из положительных целых чисел. По умолчанию функция отображает все препятствия.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.