Добавьте тела эго в 3D капсулы списка
addEgo(
добавляет одно или несколько тел ego в 3-D список динамических капсул с заданными значениями ID, состояния и геометрии, заданными в capsuleListObj
,egoStruct
)egoStruct
.
дополнительно возвращает индикатор добавления, обновления или повторения каждого заданного тела ego.status
= addEgo(capsuleListObj
,egoStruct
)
Создайте путь к эго-телу и сохраните состояния препятствий, используя dynamicCapsuleList3D
объект. Визуализируйте состояния всех объектов в окружении в различных временных метках. Проверьте путь тела ego путем проверки на столкновения с препятствиями в окружении.
Создайте dynamicCapsuleList3D
объект. Извлеките максимальное количество шагов для использования в качестве количества меток времени для путей к объекту.
obsList = dynamicCapsuleList3D; numSteps = obsList.MaxNumSteps;
Добавить тело Ego
Задайте тело ego путем определения идентификатора, геометрии и состояния вместе в структуре. Геометрия капсулы имеет длину 3 м и радиус 1 м. Задайте состояние как линейный путь от x = 0 м до x = 100 м.
egoID1 = 1; geom = struct("Length",3,"Radius",1,"FixedTransform",eye(4)); states = linspace(0,1,obsList.MaxNumSteps)'.*[100 0 0]; states = [states ones(numSteps,2) zeros(numSteps,2)]; egoCapsule1 = struct('ID',egoID1,'States',states,'Geometry',geom); addEgo(obsList,egoCapsule1); show(obsList,"TimeStep",1:numSteps); ylim([-20 20]) zlim([-5 20]) view(-45,25) hold on
Добавление препятствий
Задайте состояния для двух препятствий, которые отделены от тела эго на 5 м в противоположных направлениях по оси Y. Предположим, что препятствия имеют одинаковую геометрию geom
как тело эго.
obsState1 = states + [0 5 0 0 0 0 0]; obsState2 = states + [0 -5 0 0 0 0 0]; obsCapsule1 = struct('ID',1,'States',obsState1,'Geometry',geom); obsCapsule2 = struct('ID',2,'States',obsState2,'Geometry',geom); addObstacle(obsList,obsCapsule1); addObstacle(obsList,obsCapsule2); cla show(obsList,"TimeStep",1:numSteps);
Обновляйте препятствия
Изменяйте местоположения препятствий и размерности с течением времени. Используйте ранее сгенерированную структуру, изменяйте поля и обновляйте препятствия с помощью updateObstacleGeometry
и updateObstaclePose
функции объекта. Уменьшите радиус первого препятствия до 0,5 м, и измените путь, чтобы переместить его в сторону тела эго.
obsCapsule1.Geometry.Radius = 0.5; obsCapsule1.States = ... [linspace(0,100,numSteps)' ... % x linspace(5,-4,numSteps)' ... % y zeros(numSteps,1) ... % z ones(numSteps,2) zeros(numSteps,2)]; % quaternion % quaternion updateObstacleGeometry(obsList,1,obsCapsule1); updateObstaclePose(obsList,1,obsCapsule1);
Проверка на наличие коллизий
Визуализируйте новые пути. Показать, где происходят столкновения между эго-телом и препятствием, которые отображение подсвечивает красным цветом. Заметьте, что столкновения между препятствиями не проверяются.
cla show(obsList,"TimeStep",1:numSteps,"ShowCollisions",1);
Программно проверяйте на столкновения bu с помощью 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.
Обновление пути Ego
Задайте новый путь для тела ego. Снова визуализируйте пути, отображая столкновения.
egoCapsule1.States = ... [linspace(0,100,numSteps)' ... % x 3*sin(linspace(0,2*pi,numSteps))' ... % y zeros(numSteps,1)... % z ones(numSteps,2) zeros(numSteps,2)]; %quaternion % quaternion updateEgoPose(obsList,1,egoCapsule1); cla show(obsList,"TimeStep",1:numSteps,"ShowCollisions",1);
capsuleListObj
- Список динамических капсулdynamicCapsuleList3D
объектСписок динамических капсул, заданный как dynamicCapsuleList3D
объект.
egoStruct
- Параметры тела EgoПараметры тела Ego, заданные как структура N-element или массив структур, где N количество добавленных тел Ego. Поля каждой структуры определяют идентификатор, геометрию и состояния тела ego:
ID
-- Целое число, которое идентифицирует каждый объект. Хранится в EgoIDs
свойство dynamicCapsuleList3D
объект, заданный как capsuleListObj
аргумент.
States
-- Расположение и ориентация объекта как матрицы M-на-6, где каждая строка имеет форму [x y z qW qX qY qZ]
, и M количество состояний вдоль пути объекта в мировой системе координат. Список состояний предполагает, что каждое состояние разделено фиксированным временным интервалом. xyz -положения указаны в метрах, а ориентация - четырехэлементный вектор кватерниона. Локальный источник по умолчанию расположен в центре левого полушария капсулы.
Geometry
-- Структура с полями Length
, Radius
, и FixedTransform
. Эти поля определяют размер объекта на основе капсул, используя указанную длину для радиуса цилиндра и полусферы для торцевых прописных букв. Чтобы сместить геометрию капсулы с источника по умолчанию, задайте FixedTransform
поле как фиксированное преобразование относительно локальной системы координат капсулы. Чтобы сохранить источник капсулы по умолчанию, задайте преобразование следующим eye(4)
.
status
- Результат добавления эго телРезультат добавления эго-тел, возвращенный как N-элементный вектор-столбец таковых, нулей и отрицательных. N - количество эго-тел, заданное в egoStruct
аргумент. Каждое значение указывает, добавлено ли связанное тело (1
), обновлено (0
), или дубликат (-1
). При добавлении ego-тел, если в массиве структур найдено несколько структур с одним и тем же идентификатором тела egoStruct
, затем функция помечает предыдущую запись как повторяющуюся и игнорирует ее.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.