Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

checkCollision

Vérifiez si deux géométries sont en collision

Depuis R2019b

Description

collisionStatus = checkCollision(geom1,geom2) renvoie l'état de collision entre les deux géométries convexes geom1 et geom2. Si les deux géométries sont en collision dans leurs poses spécifiées, collisionStatus est 1. Si la fonction ne trouve pas de collision, collisionStatus est 0.

exemple

[collisionStatus,sepdist,witnesspts] = checkCollision(geom1,geom2) renvoie la distance minimale sepdist et les points témoins witnesspts de chaque géométrie lorsque la fonction ne trouve pas de collision entre les deux géométries.

Exemples

réduire tout

Cet exemple montre comment vérifier l'état de collision de deux géométries de collision.

Créez une géométrie de collision de boîtes.

bx = collisionBox(1,2,3);

Créez une géométrie de collision de cylindre.

cy = collisionCylinder(3,1);

Translatez le cylindre le long de l'axe  x  de 2.

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

Tracez les deux géométries.

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.

Vérifiez l'état de la collision. Confirmez que l'état est cohérent avec le tracé.

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

   NaN   NaN
   NaN   NaN
   NaN   NaN

Traduisez la boîte le long de l'axe x de 3 et vers le bas de l'axe z de 4. Confirmez que la boîte et le cylindre n'entrent pas en collision.

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

Tracez la boîte, le cylindre et le segment de ligne représentant la distance minimale entre les deux géométries.

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.

Créez deux capsules de collision. Centrez l'une à l'origine et réglez la pose de l'autre capsule à 3 mètres de l'origine sur l'axe y. Présentez les capsules.

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.

Vérifiez la collision entre les deux capsules de collision. Parce qu’ils n’entrent pas en collision visuellement, la fonction doit renvoyer des distances de séparation et des points témoins à valeur réelle. Affichez les distances de séparation et les points témoins.

[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

Faites pivoter la deuxième capsule 90 degrés sur l'axe 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.

Vérifiez à nouveau la collision entre les capsules. Parce qu'ils sont en collision, la fonction renvoie la distance de séparation et les points témoins sous la forme 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

Arguments d'entrée

réduire tout

Première géométrie de collision, spécifiée comme l'un de ces objets de géométrie de collision :

Géométrie de collision, spécifiée comme l'un de ces objets de géométrie de collision :

Arguments de sortie

réduire tout

Statut de collision, renvoyé sous la forme 0 ou 1. Si les deux géométries sont en collision, collisionStatus est 1. Sinon, la valeur est 0.

Types de données : double

Distance minimale entre les deux géométries de collision, renvoyée sous forme de nombre réel. Le segment de ligne qui relie les points témoins witnesspts détermine la distance minimale entre les deux géométries. Lorsque les deux géométries sont en collision, sepdist est NaN.

Types de données : double

Points témoins sur chaque géométrie, renvoyés sous forme de matrice 3x2. Chaque colonne est l'emplacement du point témoin sur la géométrie correspondante, geom1 ou geom2. Le segment de ligne qui relie les deux points témoins a une longueur septdist. Lorsque les deux géométries sont en collision, chaque élément de witnesspts est NaN.

Types de données : double

Limites

  • Les résultats de la vérification des collisions ne sont pas fiables lorsque la distance minimale est inférieure à 10-5 m.

Références

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

Capacités étendues

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Historique des versions

Introduit dans R2019b