Main Content

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

checkMapCollision

Vérifier la collision entre la carte d'occupation 3D et la géométrie

Depuis R2022b

    Description

    Vérifiez la collision entre une carte d'occupation 3D et une géométrie de collision convexe. La fonction checkMapCollision peut rechercher des collisions en deux phases : d'abord, une recherche en phase large utilisant une recherche en phase large utilisant des volumes englobants simples, puis par une collision en phase étroite, vérifier si les volumes simples entrer en collision. Pour la recherche en phase large, la fonction vérifie entre des primitives simples constituées de cadres de délimitation alignés axialement (AABB). Pour la phase étroite, la fonction vérifie entre les cellules occupées, représentées par un objet collisionBox (Robotics System Toolbox) , et l'objet géométrique de collision d'entrée.

    collisionStatus = checkMapCollision(map,geometry) vérifie si une carte d'occupation 3D, map, et une géométrie de collision, geometry, sont en collision.

    exemple

    [collisionStatus,details] = checkMapCollision(map,geometry,options) spécifie les options supplémentaires de vérification des collisions options et renvoie les détails de la collision details.

    Exemples

    réduire tout

    Créez une carte d'occupation en 3D.

    map = occupancyMap3D;

    Spécifiez 25 coordonnées aléatoires dans la carte d'occupation comme étant occupées.

    rng(0)
    pt = (rand(25,3)-.5)*20;
    setOccupancy(map,pt,1);

    Créez une sphère de collision et un objet cylindre de collision.

    sphere = collisionSphere(1);
    cylinder = collisionCylinder(3,6);
    sphere.Pose = trvec2tform([6.1 -4 -7.5]);

    Visualisez la carte d'occupation et la géométrie des collisions dans la même figure.

    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)

    Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 3 objects of type patch.

    Effectuez uniquement la vérification de collision en phase large pour la sphère et le cylindre en définissant la propriété CheckNarrowPhase d'un objet occupancyMap3DCollisionOptions sur false. Renvoie les informations sur les voxels et la distance jusqu'aux voxels occupés les plus proches.

    bpOpts = occupancyMap3DCollisionOptions(CheckNarrowPhase=false,ReturnDistance=true,ReturnVoxels=true);
    [bpIsCollidingCylinder,bpResultsCylinder] = checkMapCollision(map,cylinder,bpOpts);

    Vérifiez les distances des voxels pour les géométries de collision. Notez que, comme le cylindre est en collision avec des voxels, les valeurs de distance sont NaN. Étant donné que la sphère n'est en collision avec aucun voxel, ses résultats de distance ne sont pas des valeurs NaN .

    bpDistCylinder = bpResultsCylinder.DistanceInfo.Distance
    bpDistCylinder = NaN
    
    bpWitnessptsCylinder = bpResultsCylinder.DistanceInfo.WitnessPoints
    bpWitnessptsCylinder = 3×2
    
       NaN   NaN
       NaN   NaN
       NaN   NaN
    
    

    Étant donné que le cylindre est en collision avec les voxels, les résultats de distance contiennent des valeurs NaN . Puisque la sphère n'est pas en collision avec les voxels, les résultats de distance sont constitués de valeurs non NaN .

    [bpIsCollidingSphere,bpResultsSphere] = checkMapCollision(map,sphere,bpOpts);
    bpDistSphere = bpResultsSphere.DistanceInfo.Distance
    bpDistSphere = 2.3259
    
    bpWitnessptsSphere = bpResultsSphere.DistanceInfo.WitnessPoints
    bpWitnessptsSphere = 3×2
    
        3.0000    5.1000
       -6.0000   -5.0000
       -7.5000   -7.5000
    
    

    Tracez une ligne entre la sphère et le voxel le plus proche en utilisant ses points témoins.

    figure
    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)
    hold on
    plot3(bpWitnessptsSphere(1,:),bpWitnessptsSphere(2,:),bpWitnessptsSphere(3,:),LineWidth=2,Color='r')
    hold off

    Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, line.

    Effectuez maintenant une vérification en phase étroite, en utilisant un objet occupancyMap3DCollisionOptions avec la propriété CheckNarrowPhase définie sur true.

    npOpts = occupancyMap3DCollisionOptions(CheckNarrowPhase=true,ReturnDistance=true,ReturnVoxels=true);
    [npIsCollidingSphere,bpResultsSphere] = checkMapCollision(map,sphere,npOpts);

    Renvoie la distance du voxel et les coordonnées du point témoin de la sphère. La distance et les points témoins sont légèrement plus précis cette fois, car la phase étroite utilise la distance entre la primitive et le voxel, tandis que la phase large précédente utilise la distance entre la boîte englobante alignée sur l'axe (AABB) de l'objet de collision et l'objet de collision. voxel.

    npDist = bpResultsSphere.DistanceInfo.Distance
    npDist = 2.6892
    
    npWitnesspts = bpResultsSphere.DistanceInfo.WitnessPoints
    npWitnesspts = 3×2
    
        3.0000    5.2596
       -6.0000   -4.5419
       -7.5000   -7.5000
    
    

    Visualisez à nouveau la carte d’occupation et tracez la ligne indiquant la distance la plus courte entre le voxel et la sphère. La ligne entre les points témoins semble visuellement précise après avoir effectué la vérification en phase étroite.

    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)
    hold on
    plot3(npWitnesspts(1,:),npWitnesspts(2,:),npWitnesspts(3,:),LineWidth=2,Color='r')
    hold off

    Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, line.

    Arguments d'entrée

    réduire tout

    Carte d'occupation 3D, spécifiée comme objet occupancyMap3D .

    Exemple : occupancyMap3D(10)

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

    • collisionBox

    • collisionCapsule

    • collisionCylinder

    • collisionMesh

    • collisionSphere

    Exemple : collisionBox(1,1,3)

    Options de vérification des collisions, spécifiées comme objet occupancyMap3DCollisionOptions .

    Exemple : occupancyMap3DCollisionOptions(CheckNarrowPhase=false,ReturnDistance=true);

    Arguments de sortie

    réduire tout

    Statut de collision, renvoyé sous la forme 0 ou 1. Si la géométrie croise un voxel occupé, collisionStatus est 1. Sinon, la valeur est 0.

    Types de données : double

    Détails de la collision, renvoyés sous forme de structure pouvant contenir jusqu'à deux champs, DistanceInfo et VoxelInfo:

    • DistanceInfo — Ce champ est présent lorsque la propriété ReturnDistance de options est true. Le champ est une structure qui contient ces champs.

      • Distance — Si la propriété NarrowPhase de options est définie sur true, ce champ contient la distance minimale entre la géométrie de collision et la géométrie la plus proche. voxel ou cellule occupée, représenté comme un objet collisionBox . Si NarrowPhase est false, alors Distance est la distance minimale entre les AABB de la géométrie de collision et le voxel le plus proche.

        Pour les géométries de collision qui ne sont pas en collision, Distance est renvoyé sous forme de scalaire numérique. Pour les géométries de collision en collision, Distance est renvoyé sous la forme NaN.

      • WitnessPoints — Points témoins entre la géométrie de collision et le voxel le plus proche. Si la géométrie de collision n'est pas en collision, WitnessPoints est renvoyé tel que renvoyé sous forme de matrice 3 par 2, où chaque colonne représente les points témoins sous la forme [XYZ]. Si la géométrie de collision est en collision, WitnessPoints est renvoyé sous la forme nan(3,2).

    • VoxelInfo — Ce champ est présent lorsque la propriété ReturnVoxels de options est true. Le champ est une structure qui contient ces champs.

      • Location — Centre(s) des voxels en collision. Le format de ce champ dépend de la valeur de la propriété Exhaustive de options:

        • trueN-matrice par 3, où N est le nombre total de voxels en collision. Chaque ligne est une coordonnée sous la forme [X Y Z].

        • false — Vecteur ligne à trois éléments qui contient le premier voxel de collision comme coordonnée sous la forme [X Y Z], ou comme vecteur vide s'il n'y a pas de collision.

      • Size — Longueurs des bords des voxels en collision. Le format de ce champ dépend de la valeur de la propriété Exhaustive de options:

        • trueN - vecteur de colonne d'éléments, où N est le nombre total de voxels en collision. La longueur du bord de chaque élément définit la taille du voxel centré à l'emplacement correspondant dans Location.

        • false — Longueur du bord du premier voxel en collision, renvoyée sous forme de scalaire numérique en cas de collision, ou sous forme de vecteur vide s'il n'y a pas de collision.

    Capacités étendues

    Historique des versions

    Introduit dans R2022b

    développer tout