Main Content

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 están en colisión en las poses especificadas, collisionStatus es igual a 1. Si la función no encuentra ninguna 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 detecta 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

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

Cree dos cápsulas de colisión. Centre una en el origen y establezca la pose de la otra cápsula en 3 metros 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

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

Vuelva a comprobar si existe colisión entre las cápsulas. Como 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

El 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 rectas que conecta los puntos testigo witnesspts determina la distancia mínima entre las dos geometrías. Cuando ambas geometrías están en colisión, 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 rectas que conecta los dos puntos testigo tiene una longitud septdist. Cuando ambas geometrías están en colisión, cada elemento de witnesspts es NaN.

Tipos de datos: double

Limitaciones

  • Los resultados de la comprobación de colisión 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