Main Content

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

collisionVHACD

Décomposer le maillage en maillages de collision convexes à l'aide de V-HACD

Depuis R2023b

    Description

    exemple

    convexCollMeshes = collisionVHACD(sourceMesh) décompose un maillage de triangulation en maillages de collision convexes à l'aide d'un solveur de décomposition convexe approximative hiérarchique voxélisée (V-HACD).

    convexCollMeshes = collisionVHACD(sourceMesh,options) spécifie les options du solveur V-HACD.

    [convexCollMeshes,info] = collisionVHACD(___) renvoie des informations sur la décomposition. en plus des maillages de collision convexes décomposés, en utilisant n'importe quelle combinaison d'arguments d'entrée des syntaxes précédentes.

    Exemples

    réduire tout

    Chargez un fichier STL contenant une triangulation de bacs rectangulaires, puis visualisez la triangulation de bacs.

    meshTri = stlread("bin.stl");
    trisurf(meshTri)
    axis equal

    Figure contains an axes object. The axes object contains an object of type patch.

    Créez un maillage de collision en utilisant les points de la triangulation du bac, puis visualisez le maillage. Notez que, lorsque vous approximez la triangulation de casiers comme un maillage de collision, l'objet collisionMesh utilise l'enveloppe convexe de la triangulation de casiers pour approximer le casier. En conséquence, le maillage de collision est convexe, contrairement à la triangulation non convexe. L'objet collisionMesh fait cela car la vérification des collisions est plus efficace avec des maillages convexes. Cependant, cette approximation convexe n’est pas idéale pour les bacs car les robots peuvent manipuler des bacs ou des objets à l’intérieur des bacs.

    meshColl = collisionMesh(meshTri.Points);
    [~,p] = show(meshColl);
    view(145,30) % Change view so it is easier to view the inside of bin
    axis equal
    hold on

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

    Créez une canette de soda à l'aide d'un cylindre de collision et définissez la pose de telle sorte qu'elle repose au centre de la poubelle. Ensuite, montrez-le dans le maillage de collision convexe.

    sodacan = collisionCylinder(0.1,0.4,Pose=trvec2tform([0 0 .3]));
    show(sodacan);

    Réglez la boîte pour qu'elle soit transparente afin que vous puissiez voir le chevauchement entre le bac et la canette de soda.

    p.FaceAlpha = 0.25;
    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 la canette de soda et l'approximation convexe du bac, et notez qu'ils sont en collision.

    isCollidingConvex = checkCollision(sodacan,meshColl)
    isCollidingConvex = 1
    

    Pour obtenir une meilleure approximation du bac pour la vérification des collisions, décomposez le maillage non convexe d'origine en plusieurs maillages convexes à l'aide de la décomposition convexe approximative hiérarchique voxelisée (V-HACD).

    Utilisez la fonction collisionVHACD pour décomposer la triangulation non convexe d'origine en maillages de collision convexes. Ensuite, montrez le bac décomposé avec la canette de soda.

    decomposedBin = collisionVHACD(meshTri);
    showCollisionArray([decomposedBin {sodacan}]);
    view(145,30)
    axis equal

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

    Vérifiez la collision avec tous les maillages qui se rapprochent du bac. A noter que la canette de soda n'est pas en collision avec l'approximation décomposée non convexe du bac. Si vous avez besoin d'une décomposition plus précise du bac, vous pouvez spécifier des options de solveur personnalisées à l'aide de l'objet vhacdOptions .

    isColliding = false(1,length(decomposedBin));
    for i = 1:length(decomposedBin)
        isColliding(i) = checkCollision(sodacan,decomposedBin{i});
    end
    isCollidingAll = all(isColliding)
    isCollidingAll = logical
       0
    
    

    Chargez le robot Rethink Robotics Sawyer.

    robot = loadrobot("rethinkSawyer",DataFormat="row")
    robot = 
      rigidBodyTree with properties:
    
         NumBodies: 20
            Bodies: {1x20 cell}
              Base: [1x1 rigidBody]
         BodyNames: {1x20 cell}
          BaseName: 'base'
           Gravity: [0 0 0]
        DataFormat: 'row'
    
    

    Montrez le robot avec uniquement les maillages visuels et montrez le robot avec uniquement les maillages de collision. Utilisez une vue verticale pour que la différence entre les bras soit plus claire.

    tiledlayout(1,2)
    sgtitle("Rethink Robotics Sawyer")
    nexttile
    show(robot,Visuals="on",Collisions="off");
    title("Top Down View")
    axis auto
    view(90,90)
    nexttile
    show(robot,Visuals="off",Collisions="on");
    title("Top Down View")
    axis auto
    view(90,90)

    Figure contains 2 axes objects. Axes object 1 with title Top Down View, xlabel X, ylabel Y contains 53 objects of type patch, line. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh. Axes object 2 with title Top Down View, xlabel X, ylabel Y contains 55 objects of type patch, line. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh, controller_box_coll_mesh, pedestal_feet_coll_mesh, pedestal_coll_mesh, right_arm_base_link_coll_mesh, right_l0_coll_mesh, head_coll_mesh, screen_coll_mesh, right_l1_coll_mesh, right_l2_coll_mesh, right_l3_coll_mesh, right_l4_coll_mesh, right_l5_coll_mesh, right_l6_coll_mesh, right_hand_coll_mesh.

    Notez que chaque corps du bras est représenté par un seul maillage convexe qui ne représente pas avec précision les limites physiques du bras. Pour obtenir une vérification plus précise des collisions, vous devez décomposer les maillages visuels du robot. L'arbre des corps rigides stocke les corps rigides du bras aux indices 9 à 17.

    Tout d'abord, créez des options de solveur V-HACD pour les décompositions de maillage individuelles avec le nombre maximum d'enveloppes convexes défini sur 10.

    opts = vhacdOptions("IndividualMesh",MaxNumConvexHulls=10);

    Alors pour chaque corps rigide :

    1. Obtenez le corps rigide actuel et effacez le maillage de collision actuel.

    2. Obtenez les données visuelles correspondantes s'il y en a.

    3. S'il existe des données visuelles, utilisez collisionVHACD (Robotics System Toolbox) avec les options du solveur personnalisé pour décomposer la triangulation des données visuelles en un tableau de maillages de collision.

    4. Ajoutez chaque maillage de collision du tableau de maillages de collision au corps rigide.

    for bodyIdxToReplace = 9:17
        % 1. Get current body and clear collision mesh
        currBody = robot.Bodies{bodyIdxToReplace};
        clearCollision(currBody);
    
        % 2. Get Corresponding visual data
        vizData = getVisual(robot.Bodies{bodyIdxToReplace});
    
        % 3. If visual data, decompose visual data
        if ~isempty(vizData)
            collisionArray = collisionVHACD(vizData(1).Triangulation,opts);
    
            % 4. Add each collision mesh to the rigid body
            for j = 1:numel(collisionArray)
                addCollision(currBody,collisionArray{j});
            end
        end
    end

    Affichez les maillages de collision d'origine du bras du robot à côté du maillage de collision mis à jour du bras.

    tiledlayout(1,2);
    sgtitle("Rethink Robotics Sawyer")
    nexttile
    robotOriginal = loadrobot("rethinkSawyer",DataFormat="row");
    show(robotOriginal,Visuals="off",Collisions="on");
    title("Before Decomposition")
    axis auto
    view(90,90)
    nexttile
    show(robot,Visuals="off",Collisions="on");
    title("After Decomposition")
    view(90,90)
    axis auto

    Figure contains 2 axes objects. Axes object 1 with title Before Decomposition, xlabel X, ylabel Y contains 55 objects of type patch, line. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh, controller_box_coll_mesh, pedestal_feet_coll_mesh, pedestal_coll_mesh, right_arm_base_link_coll_mesh, right_l0_coll_mesh, head_coll_mesh, screen_coll_mesh, right_l1_coll_mesh, right_l2_coll_mesh, right_l3_coll_mesh, right_l4_coll_mesh, right_l5_coll_mesh, right_l6_coll_mesh, right_hand_coll_mesh. Axes object 2 with title After Decomposition, xlabel X, ylabel Y contains 108 objects of type patch, line. These objects represent base, controller_box, pedestal_feet, pedestal, right_arm_base_link, right_l0, head, screen, head_camera, right_l1, right_l2, right_l3, right_l4, right_arm_itb, right_l5, right_hand_camera, right_l6, right_hand, right_wrist, right_torso_itb, torso, pedestal_mesh, right_arm_base_link_mesh, right_l0_mesh, head_mesh, screen_mesh, right_l1_mesh, right_l2_mesh, right_l3_mesh, right_l4_mesh, right_l5_mesh, right_l6_mesh, torso_mesh, controller_box_coll_mesh, pedestal_feet_coll_mesh, pedestal_coll_mesh, right_arm_base_link_coll_mesh, right_l0_coll_mesh, head_coll_mesh, screen_coll_mesh, right_l1_coll_mesh, right_l2_coll_mesh, right_l3_coll_mesh, right_l4_coll_mesh, right_l5_coll_mesh, right_l6_coll_mesh.

    Notez que dans ce cas, les nouveaux maillages de collision représentent le bras du robot avec plus de précision.

    Arguments d'entrée

    réduire tout

    Triangulation de la géométrie du maillage à décomposer, spécifiée comme objet triangulation .

    Pour visualiser les triangulations de maillages avant décomposition, vous pouvez utiliser la fonction trimesh ou trisurf .

    Options du solveur V-HACD, ​​spécifiées comme objet vhacdOptions .

    Vous devez définir la propriété Type (Robotics System Toolbox) de l'objet vhacdOptions sur "IndividualMesh" pour spécifier des options V-HACD personnalisées pour le collisionVHACD. Fonction . Si la propriété Type est définie sur "RigidBodyTree", alors vous ne pouvez utiliser que l'objet vhacdOptions pour importer des arbres de corps rigides à l'aide du importrobot (Robotics System Toolbox) fonction

    Arguments de sortie

    réduire tout

    Maillages de collision convexes, renvoyés sous la forme d'un cell array à N d'objets collisionMesh .

    Vous pouvez utiliser la fonction showCollisionArray (Robotics System Toolbox) pour visualiser les maillages de collision.

    Informations sur la solution de décomposition, renvoyées sous forme de structure contenant ces champs :

    • SourceVolume — Volume du maillage source d'entrée spécifié par l'argument sourceMesh .

    • CompositeDecompVolume — Volume total combiné des maillages de collision convexes en sortie. Ce total inclut le volume des mailles superposées.

    • RawDataN - cell array d'éléments de sommets de maillage utilisé pour générer le tableau de collision. N est le nombre total d'objets de collision nécessaires pour représenter le maillage décomposé.

    Références

    [1] Mammou, Khaled, et al. “Voxelized Hierarchical Approximate Convex Decomposition - V-HACD Version 4.” GitHub, October 24, 2022. https://github.com/kmammou/v-hacd.

    Historique des versions

    Introduit dans R2023b