dynamicCapsuleList3D

Динамический основанный на капсуле список препятствий

Описание

dynamicCapsuleList3D объект управляет двумя списками основанных на капсуле объектов столкновения в трехмерном пространстве. Объекты столкновения разделены на два списка, тела эго и препятствия. Для тел эго и препятствий в 2D, смотрите dynamicCapsuleList объект.

Каждый объект столкновения в двух списках имеет три основных элемента:

  • ID – Целое число, которое идентифицирует каждый объект, хранивший в EgoIDs свойство для тел эго и ObstacleIDs свойство для препятствий.

  • Состояния – Местоположение и ориентация объекта как M-by-6 матрица, где каждая строка имеет форму [x y z qW qX qY qZ], и M является количеством состояний вдоль пути объекта в мировой системе координат. Список состояний принимает, что каждое состояние разделяется фиксированным временным интервалом. xyz - положения исчисляются в метрах, и ориентация является четырехэлементным вектором кватерниона. Локальный источник по умолчанию расположен в центре левого полушария капсулы.

  • Геометрия – Размер основанного на капсуле основанного на объектах на заданной длине и радиусе. Радиус применяется к сферическим концам, и длина применяется к цилиндрической длине. TTo переключают краткую геометрию и локальный источник относительно точки источника по умолчанию, задают преобразование 4 на 4 относительно локальной системы координат капсулы. Чтобы сохранить преобразование по умолчанию, задайте eye(4).

Capsule geometry image showing the position and orientation of the capsule dimensions. Positive X is the right direction from the world frame. Positive Y is up. Positive Z is into the page, based on right-hand rule. Quaternion is a four-element quaternion relative to the world frame. The capsule geometry has a radius for the spherical ends and a length for the cylindrical section in the middle.

Используйте объектные функции, чтобы динамически добавить, удалить, и обновить конфигурации и состояния различных объектов в вашей среде. Чтобы добавить тело эго, смотрите addEgo объектная функция. Чтобы добавить препятствие, смотрите addObstacle объектная функция.

После определения всех контуров объектов подтвердите пути тела эго и проверку на столкновения с препятствиями на каждом шаге с помощью checkCollision объектная функция. Функция только проверяет, сталкивается ли тело эго с препятствием, игнорируя столкновения только между препятствиями или только телами эго.

Создание

Описание

пример

obstacleList = dynamicCapsuleList3D создает динамический основанный на капсуле список препятствий без тел эго или препятствий. Чтобы начать создавать список препятствий, используйте addEgo или addObstacle функции объекта.

Свойства

развернуть все

Максимальное количество временных шагов в препятствии перечисляет в виде положительного целого числа. Количество шагов определяет к максимальной длине States поле для определенного тела эго или препятствия.

Типы данных: double

Это свойство доступно только для чтения.

Список идентификаторов для тел эго, возвращенных как вектор из положительных целых чисел.

Типы данных: double

Это свойство доступно только для чтения.

Список идентификаторов для препятствий, возвращенных как вектор из положительных целых чисел.

Типы данных: double

Это свойство доступно только для чтения.

Количество препятствий в списке, возвращенном как целое число.

Типы данных: double

Это свойство доступно только для чтения.

Количество тел эго в списке, возвращенном как целое число.

Типы данных: double

Функции объекта

addEgoДобавьте тела эго в 3D список капсул
addObstacleДобавьте препятствия 3-D списку капсул
checkCollisionПроверяйте на столкновения между телами эго и препятствиями
egoGeometryГеометрические свойства тел эго
egoPoseПоложения тел эго
obstacleGeometryГеометрические свойства препятствий
obstaclePoseПоложения препятствий
removeEgoУдалите тела эго из списка капсул
removeObstacleУдалите препятствия из списка капсул
showОтобразите тела эго и препятствия в среде
updateEgoGeometryОбновите геометрические свойства тел эго
updateEgoPoseОбновите состояния тел эго
updateObstacleGeometryОбновите геометрические свойства препятствий
updateObstaclePoseОбновите состояния препятствий

Примеры

свернуть все

Создайте путь к телу эго и обеспечьте состояния препятствия с помощью dynamicCapsuleList3D объект. Визуализируйте состояния всех объектов в среде в различных метках времени. Подтвердите путь тела эго путем проверки на столкновения с препятствиями в среде.

Создайте dynamicCapsuleList3D объект. Извлеките максимальное количество шагов, чтобы использовать в качестве количества меток времени для ваших контуров объектов.

obsList = dynamicCapsuleList3D;
numSteps = obsList.MaxNumSteps;

Добавьте тело эго

Задайте тело эго путем определения ID, геометрии, и утвердите вместе в структуре. Краткая геометрия имеет длину 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.

Обновите путь к эго

Задайте новый путь для тела эго. Визуализируйте пути снова, отображая столкновения.

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);

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Введенный в R2020b