Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

checkCollision

Compruebe si hay colisiones entre los cuerpos del ego y los obstáculos.

Desde R2020b

Descripción

ejemplo

collisionFound = checkCollision(capsuleListObj) revisa cada cuerpo del ego en busca de colisiones con obstáculos en el entorno. La función indica si cada cuerpo del ego está en colisión en cada paso de tiempo.

[fullResults,distance] = checkCollision(capsuleListObj,options) comprueba cada cuerpo del ego en busca de colisiones con obstáculos en el entorno y devuelve los resultados utilizando opciones adicionales de detección de colisiones especificadas options.

Ejemplos

contraer todo

Construya una ruta del cuerpo del ego y mantenga estados de obstáculos utilizando el objeto dynamicCapsuleList . Visualice los estados de todos los objetos del entorno en diferentes marcas de tiempo. Valide la ruta del cuerpo del ego comprobando colisiones con obstáculos en el entorno.

Cree el objeto dynamicCapsuleList . Extraiga la cantidad máxima de pasos para usar como cantidad de marcas de tiempo para las rutas de sus objetos.

obsList = dynamicCapsuleList;
numSteps = obsList.MaxNumSteps;

Añadir cuerpo del ego

Defina un cuerpo del ego especificando la identificación, la geometría y el estado juntos en una estructura. La geometría de la cápsula tiene una longitud de 3 my un radio de 1 m. Especifique el estado como una ruta lineal desde x = 0 ma x = 100 m.

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 object. The axes object contains an object of type patch.

Agregar obstáculos

Especifique estados para dos obstáculos que están separados del cuerpo del ego por 5 m en direcciones opuestas en el eje y. Supongamos que los obstáculos tienen la misma geometría geom que el cuerpo del ego.

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 object. The axes object contains 3 objects of type patch.

Actualizar obstáculos

Modifique las ubicaciones de los obstáculos y las dimensiones geométricas con el tiempo. Utilice la estructura generada previamente, modifique los campos y actualice los obstáculos usando las funciones de objeto updateObstacleGeometry y updateObstaclePose . Reduce el radio del primer obstáculo a 0,5 m y cambia la ruta para moverlo hacia el cuerpo del ego.

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

Comprobar si existen colisiones

Visualiza los nuevos rutas. Muestra dónde ocurren las colisiones entre el cuerpo del ego y un obstáculo, que la pantalla resalta en rojo. Tenga en cuenta que las colisiones entre los obstáculos no se controlan.

show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1);
ylim([-20 20])
xlabel("X (m)")
ylabel("Y (m)")

Figure contains an axes object. The axes object with xlabel X (m), ylabel Y (m) contains 3 objects of type patch.

Verifique las colisiones mediante programación utilizando la función de objeto checkCollision . La función devuelve un vector de valores lógicos que indica el estado de cada paso de tiempo. El vector se transpone con fines de visualización.

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

Para validar rutas con una gran cantidad de pasos, use la función any en el vector de valores de colisión.

if any(collisions)
    disp("Collision detected.")
end
Collision detected.

Actualizar ruta del ego

Especifica una ruta nueva para el cuerpo del ego. Visualice las rutas nuevamente, mostrando colisiones.

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 object. The axes object contains 3 objects of type patch.

Argumentos de entrada

contraer todo

Lista de cápsulas dinámicas, especificada como un objeto dynamicCapsuleList o dynamicCapsuleList3D .

Opciones de detección de colisiones, especificadas como una estructura con estos campos:

  • FullResults –– Devuelve los resultados de la colisión para cada obstáculo por separado, especificado como un 0 lógico (false) o 1 (true). Consulte el argumento de salida fullResults .

  • ReturnDistance –– Devuelve el cálculo de distancia de la verificación de colisión, especificado como un 0 lógico (false) o 1 (true). Consulte el argumento de salida distance .

Tipos de datos: struct

Argumentos de salida

contraer todo

Resultados de la comprobación de colisiones, devueltos como una matriz n-por- e de valores lógicos. De forma predeterminada, la función verifica cualquier colisión entre cualquier objeto, lo que devuelve una matriz n-por- e , donde n es el número máximo de estados para los cuerpos del ego en el objeto capsuleListobj especificado, y e es el número de cuerpos del ego.

Tipos de datos: logical

Resultados completos de la verificación de colisiones para cada obstáculo, devueltos como un arreglo de valores lógicos n por o por e . n es el número máximo de estados para los cuerpos del ego en el argumento capsuleListobj especificado, o es el número de obstáculos y e es el número de cuerpos del ego.

Dependencias

Para devolver el argumento de salida fullResults , especifique el argumento de entrada options con el campo FullResults establecido en true

Tipos de datos: logical

Distancia de los obstáculos, devuelta como una matriz numérica n-por- e o n-por- o por- e arreglo numérico. Las dimensiones y el comportamiento del argumento distancia dependen del valor del campo FullResults del argumento opciones

distance DimensionesFullResults ValorComportamiento
n-por- e matriz numéricafalseDevuelve la distancia entre cada cuerpo del ego y el obstáculo más cercano en cada paso de tiempo. n es el número máximo de estados para los cuerpos del ego especificados en el argumento capsuleListObj , y e es el número de cuerpos del ego.
n-por- o por- e arreglo numéricatrueDevuelve la distancia entre cada cuerpo del ego y cada obstáculo en cada paso de tiempo. o es el número de obstáculos.

Dependencias

Para devolver el argumento de salida distance , especifique el argumento de entrada options con el campo ReturnDistance establecido en true

Tipos de datos: single | double

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2020b