checkCollision

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

Описание

пример

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

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

Примеры

свернуть все

Создайте путь к эго-телу и сохраните состояния препятствий, используя 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.

Входные параметры

свернуть все

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

Опции обнаружения столкновения, заданные как структура с этими полями:

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

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

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

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

свернуть все

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

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

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

Зависимости

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

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

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

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

Зависимости

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

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

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

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

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