exponenta event banner

checkCollision

Проверка на наличие столкновений между эго-телами и препятствиями

Описание

пример

collisionFound = checkCollision(capsuleListObj) проверяет каждое эго-тело на наличие столкновений с препятствиями в окружающей среде. Функция указывает, находится ли каждое эго тело в столкновении на каждом временном шаге..

[fullResults,distance] = checkCollision(capsuleListObj,options) проверяет каждое эго-тело на наличие столкновений с препятствиями в среде и возвращает результаты, используя дополнительные заданные опции обнаружения столкновений options.

Примеры

свернуть все

Построить путь к эго-телу и поддерживать состояния препятствий с помощью 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 или dynamicCapsuleList3D объект.

Параметры обнаружения столкновений, указанные как структура со следующими полями:

  • FullResults -- Возврат результатов столкновения для каждого препятствия отдельно, указанного как логическое 0 (false) или 1 (true). См. раздел fullResults выходной аргумент.

  • ReturnDistance -- Возвращает расчет расстояния из проверки столкновений, указанный как логический 0 (false) или 1 (true). См. раздел distance выходной аргумент.

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

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

свернуть все

Результаты проверки конфликтов, возвращаемые в виде матрицы логических значений n-by-e. По умолчанию функция проверяет любое столкновение между любым объектом, которое возвращает матрицу n-by-e, где n - максимальное количество состояний для эго-тел в указанном capsuleListobj object, и e - количество эго-тел.

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

Результаты полной проверки конфликтов для каждого препятствия, возвращаемые в виде массива логических значений n-by-by-e. n - максимальное число состояний для эго-тел в указанном capsuleListobj аргумент, o - число препятствий, e - число эго-тел.

Зависимости

Для возврата fullResults выходной аргумент, укажите options входной аргумент с FullResults поле имеет значение true.

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

Расстояние от препятствий, возвращаемое в виде n-by-e числовой матрицы или n-by-oby-e числового массива. Размеры и поведение аргумента расстояния зависят от значения FullResults поле аргумента options

distance РазмерыFullResults СтоимостьПоведение
Числовая матрица n-by-efalseВозвращает расстояние между каждым эго-телом и ближайшим препятствием на каждом временном шаге. n - максимальное количество состояний для эго-тел, указанное в capsuleListObj аргумент, и e - количество эго-тел.
Числовой массив n-by-oby-etrueВозвращает расстояние между каждым эго-телом и каждым препятствием на каждом временном шаге. o - количество препятствий.

Зависимости

Для возврата distance выходной аргумент, укажите options входной аргумент с ReturnDistance поле имеет значение true.

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

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

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

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