Main Content

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

occupancyMap3DCollisionOptions

Options de contrôle des collisions entre la carte d'occupation 3D et les géométries des collisions

Depuis R2022b

    Description

    L'objet occupancyMap3DCollisionOptions contient des options pour vérifier les collisions à l'aide de la fonction checkMapCollision , entre les cellules occupées d'un objet occupancyMap3D et les objets géométriques de collision.

    Création

    Description

    OPTS = occupancyMap3DCollisionOptions renvoie un objet d'options de vérification des collisions, OPTS.

    OPTS = occupancyMap3DCollisionOptions(Name=Value) spécifie les propriétés en utilisant un ou plusieurs arguments nom-valeur. Par exemple, occupancyMap3DCollisionOptions(SearchDepth=8) définit la propriété SearchDepth de l'objet occupancyMap3DCollisionOptions à une profondeur de 8.

    exemple

    Propriétés

    développer tout

    Vérifiez les collisions entre les AABB de voxels et de géométries, spécifiés comme un 1 logique (true) ou 0 (false).

    Si la propriété CheckNarrowPhase est true, la phase étroite vérifie uniquement les voxels qui ont échoué à la vérification de phase large.

    Exemple : occupancyMap3DCollisionOptions(CheckBroadPhase=false)

    Types de données : logical

    Vérifiez les collisions entre les voxels et les géométries d'entrée brutes, spécifiées comme un 1 logique (true) ou 0 (false).

    Si la propriété CheckBroadPhase est true, la phase étroite vérifie uniquement les voxels qui étaient en collision lors de la vérification de phase large.

    Exemple : occupancyMap3DCollisionOptions(CheckNarrowPhase=false)

    Types de données : logical

    Mode de recherche exhaustif, spécifié comme un 0 logique (false) ou 1 (true). Lorsque exhaustif est spécifié comme faux, la fonction de vérification des collisions arrête la vérification des collisions à la première collision valide dans la phase large ou la phase étroite. Lorsqu'elle est spécifiée comme true, la fonction de vérification des collisions continue la vérification des collisions jusqu'à ce que tous les voxels soient vérifiés.

    Exemple : occupancyMap3DCollisionOptions(Exhaustive=true)

    Types de données : logical

    Renvoie le point et la distance les plus proches, spécifiés comme un 0 (false) ou 1 (true). Lorsqu'elle est spécifiée comme true, la fonction de vérification des collisions renvoie la distance minimale entre les géométries de collision et les voxels les plus proches dans la grille d'occupation.

    Exemple : occupancyMap3DCollisionOptions(ReturnDistance=true)

    Types de données : logical

    Renvoie l'emplacement et la taille des voxels en collision, spécifiés comme un 0 (false) ou 1 (true).

    Exemple : occupancyMap3DCollisionOptions(ReturnVoxels=true)

    Types de données : logical

    Profondeur de recherche maximale à vérifier dans l'octree, spécifiée sous la forme d'un entier compris dans la plage [0, 16].

    Si un voxel à une profondeur de recherche englobe tout voxel occupé à une profondeur de recherche plus grande, alors tout le volume du voxel englobant est considéré comme occupé. Pour plus d'informations, consultez Visualisez des cartes d'occupation en 3D avec différentes profondeurs de recherche.

    Exemple : occupancyMap3DCollisionOptions(SearchDepth=8)

    Types de données : uint8

    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 des collisions 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.

    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 R2022b