Main Content

checkCollision

Comprobar si dos geometrías están en colisión

Descripción

collisionStatus = checkCollision(geom1,geom2) devuelve el estado de colisión entre las dos geometrías convexas geom1 y geom2. Si las dos geometrías convexas están en colisión en las poses especificadas, checkCollision es igual a 1. Si no se detecta ninguna colisión, collisionStatus es igual a 0.

ejemplo

[collisionStatus,sepdist,witnesspts] = checkCollision(geom1,geom2) devuelve también la distancia mínima y los puntos testigo de cada geometría, sepdist y witnesspts, respectivamente, cuando no se ha detectado ninguna colisión entre ambas.

Ejemplos

contraer todo

Este ejemplo muestra cómo comprobar el estado de colisión de dos geometrías de colisión.

Cree una geometría de colisión en forma de cuadro.

bx = collisionBox(1,2,3);

Cree una geometría de colisión en forma de cilindro.

cy = collisionCylinder(3,1);

Traslade el cilindro 2 unidades a lo largo del eje x.

T = trvec2tform([2 0 0]);
cy.Pose = T;

Represente las dos geometrías.

show(cy)
hold on
show(bx)
xlim([-5 5])
ylim([-5 5])
zlim([-5 5])
hold off

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

Compruebe el estado de colisión. Confirme que el estado es congruente con la gráfica.

[areIntersecting,dist,witnessPoints] = checkCollision(bx,cy)
areIntersecting = 1
dist = NaN
witnessPoints = 3×2

   NaN   NaN
   NaN   NaN
   NaN   NaN

Traslade el cuadro 3 unidades a lo largo del eje x y 4 unidades hacia abajo, por el eje z. Confirme que el cuadro y el cilindro no colisionan.

T = trvec2tform([0 3 -4]);
bx.Pose = T;
[areIntersecting,dist,witnessPoints] = checkCollision(bx,cy)
areIntersecting = 0
dist = 2
witnessPoints = 3×2

    0.4286    0.4286
    2.0000    2.0000
   -2.5000   -0.5000

Represente el cuadro, el cilindro y el segmento de línea que representa la distancia mínima entre ambas geometrías.

show(cy)
hold on
show(bx)
wp = witnessPoints;
plot3([wp(1,1) wp(1,2)], [wp(2,1) wp(2,2)], [wp(3,1) wp(3,2)], 'bo-')
xlim([-5 5])
ylim([-5 5])
zlim([-5 5])
hold off

Figure contains an axes object. The axes object contains 3 objects of type patch, line.

Argumentos de entrada

contraer todo

La geometría de colisión, especificada como una de las siguientes opciones:

La geometría de colisión, especificada como una de las siguientes opciones:

Argumentos de salida

contraer todo

El estado de colisión, devuelto como 0 o 1. Si las dos geometrías están en colisión, collisionStatus es igual a 1. De lo contrario, el valor es 0.

Tipos de datos: double

La distancia mínima entre dos geometrías de colisión, devuelta como un número real o NaN. El segmento de línea que conecta los puntos testigo (witnesspts) obtiene la distancia mínima entre las dos geometrías. Cuando ambas geometrías están en colisión, sepdist se establece en NaN.

Tipos de datos: double | NaN

Los puntos testigo de cada geometría, devueltos como una matriz de 3 por 2. Cada columna se corresponde con el punto testigo en geom1 y geom2, respectivamente. El segmento línea que conecta los dos puntos testigo tiene una longitud septdist. Cuando ambas geometrías están en colisión, witnesspts se establece en nan(3,2).

Tipos de datos: double | NaN

Limitaciones

  • Los resultados de la comprobación de colisión pierden fiabilidad cuando la distancia mínima es inferior a 10-5 m.

Referencias

[1] E. G. Gilbert, D. W. Johnson, and S. S. Keerthi. A fast procedure for computing the distance between complex objects in three-dimensional space. in IEEE Journal on Robotics and Automation, vol. 4, no. 2, pp. 193-203, April 1988, doi: 10.1109/56.2083.

Capacidades ampliadas

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

Historial de versiones

Introducido en R2019b