dynamicCapsuleList

Список препятствий на основе динамических капсул

Описание

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

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

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

  • Состояния - Расположение и ориентация объекта как матрицы M-на-3, где каждая строка имеет форму [x y theta] и M количество состояний вдоль пути объекта в мировой системе координат. Список состояний предполагает, что каждое состояние разделено фиксированным временным интервалом. xy -положения указаны в метрах, и theta находится в радианах. Локальный источник по умолчанию расположен в центре левого полукруга капсулы.

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

Capsule geometry image showing the position and orientation of the capsule dimensions. Positive X is the right direction in the world frame. Positive Y is up. Positive theta is a counter-clockwise rotation from the world frame. The capsule geometry has a radius for the circular ends and a length for the rectangular section in the middle.

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

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

Создание

Описание

пример

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

Свойства

расширить все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

Создайте путь к эго-телу и сохраните состояния препятствий, используя dynamicCapsuleList объект. Визуализируйте состояния всех объектов в окружении в различных временных метках. Проверьте путь тела ego путем проверки на столкновения с препятствиями в окружении.

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

obsList = dynamicCapsuleList;
numSteps = obsList.MaxNumSteps;

Добавить тело Ego

Задайте тело ego путем определения идентификатора, геометрии и состояния вместе в структуре. Геометрия капсулы имеет длину 3 м и радиус 1 м. Задайте состояние как линейный путь от x = 0m до x = 100m.

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

Figure contains an axes. The axes contains an object of type patch.

Добавление препятствий

Задайте состояния для двух препятствий, которые отделены от тела эго на 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])

Figure contains an axes. The axes contains 3 objects of type patch.

Обновляйте препятствия

Изменяйте местоположения препятствий и размерности с течением времени. Используйте ранее сгенерированную структуру, изменяйте поля и обновляйте препятствия с помощью 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)")

Figure contains an axes. The axes contains 3 objects of type patch.

Программно проверяйте на столкновения при помощи 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)]; % theta

updateEgoPose(obsList,1,egoCapsule1);

show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1);
ylim([-20 20])

Figure contains an axes. The axes contains 3 objects of type patch.

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

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

.
Введенный в R2020b