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

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

Desde R2019b

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 chocan en sus poses especificadas, collisionStatus es 1. Si la función no encuentra una colisión, collisionStatus es 0.

ejemplo

[collisionStatus,sepdist,witnesspts] = checkCollision(geom1,geom2) devuelve la distancia mínima sepdist y los puntos testigo witnesspts de cada geometría cuando la función no encuentra una colisión entre las dos geometrías.

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 a lo largo del eje x 2.

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 with xlabel X, ylabel Y 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 a lo largo del eje x en 3 y hacia abajo en el eje z en 4. 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 rectas 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 with xlabel X, ylabel Y contains 3 objects of type patch, line.

Cree dos cápsulas de colisión. Centre una en el origen y establezca la pose de la otra cápsula a 3 metros de distancia del origen en el eje y. Muestre las cápsulas.

cc1 = collisionCapsule(1,4);
cc2 = collisionCapsule(1,4);
cc2.Pose = trvec2tform([0 3 0]);
show(cc1);
hold on
show(cc2);
axis auto
hold off

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type patch.

Compruebe si existe colisión entre las dos cápsulas de colisión. Como no colisionan visualmente, la función debe devolver distancias de separación de valor real y puntos testigo. Muestre las distancias de separación y los puntos testigo.

[isColliding,separationDist,witnessPts] = checkCollision(cc1,cc2);
disp("Separation Distance: " + num2str(separationDist))
Separation Distance: 1
disp("Capsule 1 Witness Point (X Y Z): " + num2str(witnessPts(:,1)'))
Capsule 1 Witness Point (X Y Z): 0  1 -2
disp("Capsule 2 Witness Point (X Y Z): " + num2str(witnessPts(:,2)'))
Capsule 2 Witness Point (X Y Z): 0  2 -2

Gire la segunda cápsula 90 grados en el eje z.

cc2.Pose(1:3,1:3) = eul2rotm([0 0 pi/2]);
show(cc1);
hold on
show(cc2);
axis auto

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type patch.

Vuelva a comprobar si existe colisión entre las cápsulas. Debido a que están en colisión, la función devuelve la distancia de separación y los puntos testigo como NaN.

[isColliding,separationDist,witnessPts] = checkCollision(cc1,cc2);
disp("Separation Distance: " + num2str(separationDist))
Separation Distance: NaN
disp("Capsule 1 Witness Point (X Y Z): " + num2str(witnessPts(:,1)'))
Capsule 1 Witness Point (X Y Z): NaN  NaN  NaN
disp("Capsule 2 Witness Point (X Y Z): " + num2str(witnessPts(:,2)'))
Capsule 2 Witness Point (X Y Z): NaN  NaN  NaN

Argumentos de entrada

contraer todo

Primera geometría de colisión, especificada como uno de estos objetos de geometría de colisión:

Geometría de colisión, especificada como uno de estos objetos de geometría de colisión:

Argumentos de salida

contraer todo

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

Tipos de datos: double

La distancia mínima entre las dos geometrías de colisión, devuelta como un número real. El segmento de recta que conecta los puntos testigo witnesspts determina la distancia mínima entre las dos geometrías. Cuando las dos geometrías chocan, sepdist es NaN.

Tipos de datos: double

Los puntos testigo de cada geometría, devueltos como una matriz de 3 por 2. Cada columna es la ubicación del punto testigo en la geometría correspondiente, geom1 o geom2. El segmento de línea que conecta los dos puntos testigo tiene una longitud septdist. Cuando las dos geometrías chocan, cada elemento de witnesspts es NaN.

Tipos de datos: double

Limitaciones

  • Los resultados de la comprobación de colisiones no son fiables cuando la distancia mínima es inferior a 10-5 m.

Referencias

[1] Gilbert, E.G., D.W. Johnson, and S.S. Keerthi. "A fast procedure for computing the distance between complex objects in three-dimensional space." IEEE Journal on Robotics and Automation 4, no. 2 (April 1988): 193–203. https://doi.org/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