exponenta event banner

addEgo

Добавление эго-тел в список капсул

Описание

пример

addEgo(capsuleListObj,egoStruct) добавляет одно или несколько эго-тел в список динамических капсул 2-D с указанными значениями идентификатора, состояния и геометрии, указанными в egoStruct.

status = addEgo(capsuleListObj,egoStruct) дополнительно возвращает индикатор того, было ли добавлено, обновлено или дублировано каждое указанное эго-тело.

Примеры

свернуть все

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

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

obsList = dynamicCapsuleList;
numSteps = obsList.MaxNumSteps;

Добавить Ego Body

Определите эго-тело, указав идентификатор, геометрию и состояние вместе в структуре. Геометрия капсулы имеет длину 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

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

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.

Входные аргументы

свернуть все

Динамический список капсул, указанный как dynamicCapsuleList объект.

Параметры тела эго, указанные как структура N-элемента или структурный массив, где N - количество добавленных тел эго. Поля каждой структуры определяют идентификатор, геометрию и состояния эго-тела:

  • ID - Целое число, идентифицирующее каждый объект. Хранится в EgoIDs имущества dynamicCapsuleList объект, указанный capsuleListObj аргумент.

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

  • Geometry - Структура с полями Length, Radius, и FixedTransform. Эти поля определяют размер объекта на основе капсулы, используя заданную длину для цилиндра и радиус полукруга для концевых крышек. Чтобы сместить геометрию капсулы от исходной точки по умолчанию, укажите FixedTransform поле как фиксированное преобразование относительно локального кадра капсулы. Чтобы сохранить начало капсулы по умолчанию, укажите преобразование как eye(3).

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.

Выходные аргументы

свернуть все

Результат добавления эго-тел, возвращаемый как вектор столбца N-элементов из единиц, нулей и отрицательных единиц. N - количество эго-тел, указанное в egoStruct аргумент. Каждое значение указывает, добавляется ли связанное тело (1Обновлено0) или дубликат (-1). При добавлении эго-тел, если в массиве структуры найдено несколько структур с одинаковым идентификатором тела egoStruct, затем функция помечает предыдущую запись как повторяющуюся и игнорирует ее.

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2020b