Main Content

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

vhacdOptions

Options du solveur pour V-HACD

Depuis R2023b

    Description

    L'objet vhacdOptions définit les options de solveur de décomposition convexe hiérarchique approximative voxelisée (V-HACD) pour des fonctions telles que collisionVHACD et importrobot (Robotics System Toolbox). Pour décomposer des maillages concaves individuels en maillages convexes pour la vérification des collisions, utilisez vhacdOptions avec la propriété Type définie sur "IndividualMesh". Pour décomposer les maillages d'un arbre à corps rigide, utilisez vhacdOptions avec la propriété Type définie sur "RigidBodyTree".

    Création

    Description

    OPTS = vhacdOptions crée un objet d'options de solveur V-HACD avec des valeurs de propriété par défaut pour décomposer des maillages individuels avec la fonction collisionVHACD .

    OPTS = vhacdOptions(type) spécifie le type de décomposition et en définissant la propriété Type sur type. Utilisez cette syntaxe pour créer des options de solveur V-HACD avec la propriété Type définie sur "RigidBodyTree" à utiliser avec la fonction importrobot (Robotics System Toolbox) .

    Remarque

    Si vous définissez uniquement la propriété Type lors de la construction de l'objet, les propriétés utilisent les valeurs par défaut pour le type de décomposition correspondant.

    exemple

    OPTS = vhacdOptions(type,Name=Value) définit les propriétés en utilisant un ou plusieurs arguments nom-valeur.

    Propriétés

    développer tout

    Type de décomposition, spécifié comme "IndividualMesh" ou "RigidBodyTree". Pour décomposer un seul maillage à l'aide de la fonction collisionVHACD (Robotics System Toolbox) , définissez Type sur "IndividualMesh". Pour décomposer les modèles de robots lors de l'importation avec la fonction importrobot (Robotics System Toolbox) , définissez Type sur "RigidBodyTree".

    Les valeurs par défaut des propriétés VoxelResolution, MaxNumConvexHulls et MaxNumVerticesPerHull dépendent du Type spécifié.

    Types de données : char | string

    Résolution voxel de la décomposition, spécifiée comme un entier positif ou un vecteur d'éléments N d'entiers positifs. N est le nombre de corps rigides sur le modèle d'arbre de corps rigide spécifié dans la fonction importrobot (Robotics System Toolbox) . L’utilisation d’une résolution de voxel plus élevée peut améliorer la précision de la décomposition au prix d’une augmentation du temps de décomposition.

    Si vous définissez la propriété Type sur "RigidBodyTree" lors de la construction de l'objet, la valeur par défaut de VoxelResolution est 2000 pour tous les corps de l'arbre des corps rigides. Pour définir une résolution de voxel pour tous les corps rigides de l'arbre des corps rigides, spécifiez VoxelResolution sous forme d'entier positif. Pour spécifier individuellement les résolutions de voxel pour chaque corps de l'arbre du corps rigide, spécifiez VoxelResolution comme vecteur d'élément N d'entiers positifs.

    Nombre maximum d'enveloppes convexes après décomposition, spécifié comme un entier positif ou un N - vecteur d'éléments d'entiers positifs. N est le nombre de corps rigides sur le modèle d'arbre de corps rigide spécifié dans la fonction importrobot (Robotics System Toolbox) . L'augmentation du nombre d'enveloppes convexes peut améliorer la précision de la décomposition, mais peut également entraîner une augmentation du nombre de mailles convexes produites par la décomposition. Un plus grand nombre de maillages peut générer des résultats plus précis au prix d'un temps de vérification des collisions plus long.

    Si vous définissez la propriété Type sur "RigidBodyTree" lors de la construction de l'objet, la valeur par défaut de MaxNumConvexHulls est 8 pour tous les corps de l'arbre des corps rigides. Pour définir une résolution de voxel pour tous les corps rigides de l'arborescence des corps rigides, spécifiez MaxNumConvexHulls sous forme d'entier positif. Pour spécifier individuellement les résolutions de voxel pour chaque corps, spécifiez MaxNumConvexHulls comme vecteur d'élément N d'entiers positifs.

    Nombre maximum de sommets par coque convexe après décomposition, spécifié comme un entier positif ou un N - vecteur d'éléments d'entiers positifs. N est le nombre de corps rigides sur le modèle d'arbre de corps rigide spécifié dans la fonction importrobot (Robotics System Toolbox) . Augmenter le nombre maximum de sommets par coque convexe peut améliorer la précision de chaque coque convexe au prix d'un temps de décomposition plus long.

    Si vous définissez la propriété Type sur "RigidBodyTree" lors de la construction de l'objet, la valeur par défaut de MaxNumVerticesPerHull est 16 pour tous les corps de l'arbre des corps rigides. Pour définir une résolution de voxel pour tous les corps rigides de l'arborescence des corps rigides, spécifiez MaxNumVerticesPerHull sous forme d'entier positif. Pour spécifier une résolution de voxel pour chaque corps, spécifiez MaxNumVerticesPerHull comme vecteur d'élément N d'entiers positifs.

    Mode de remplissage des voxels intérieurs du maillage après voxélisation, spécifié comme "FLOOD_FILL", "SURFACE_ONLY", ou "RAYCAST_FILL":

    • "FLOOD_FILL" — Le mode de remplissage par inondation utilise l'algorithme de remplissage par inondation pour déterminer la surface extérieure du maillage. Après avoir déterminé la surface externe du maillage, le solveur V-HACD remplit les voxels intérieurs entourés par la surface externe. Le mode "FLOOD_FILL" produit le résultat le plus précis pour les maillages fermés. Si vous utilisez le mode de remplissage par inondation pour un maillage ouvert, l'algorithme de remplissage par inondation considère la surface interne du maillage comme connectée à la surface externe du maillage, ce qui donne un maillage creux. Si le maillage est ouvert, utilisez le mode "RAYCAST_FILL" pour de meilleurs résultats.

    • "RAYCAST_FILL" — Le mode de remplissage Raycasting utilise le raycasting pour identifier la surface extérieure du maillage et remplir les voxels intérieurs entourés par la surface extérieure du maillage. Utilisez ce mode pour remplir les voxels intérieurs des maillages ouverts. Pour une meilleure précision, utilisez un logiciel de modélisation 3D pour fermer le maillage et utilisez le mode "FLOOD_FILL" .

    • "SURFACE_ONLY" — Le mode de remplissage de surface uniquement ne remplit aucun voxel intérieur dans le maillage. Utilisez ce mode pour les maillages qui ne doivent avoir aucun volume.

    Types de données : char | string

    Type de maillage source de l'arbre du corps rigide à décomposer lors de l'utilisation de la fonction importrobot (Robotics System Toolbox) , spécifié comme "CollisionGeometry" ou "VisualGeometry":

    • "CollisionGeometry" — Décompose les géométries de collision du modèle d'arbre de corps rigide, qui sont utilisées pour la vérification des collisions. La décomposition des maillages géométriques de collision peut réduire la complexité des maillages et améliorer la vitesse de vérification des collisions au détriment de la précision de la vérification des collisions.

      Ce code affiche les géométries de collision d'un robot sans les géométries visuelles :

      robot = loadrobot("rethinkSawyer");
      show(robot,homeConfiguration(robot),Collisions="on",Visuals="off");
      axis auto

      Collision geometries of Rethink Robotics Sawyer robot

    • "VisualGeometry" — Décomposez les géométries visuelles du modèle d'arbre de corps rigide, qui représentent une visualisation plus précise de l'apparence du robot. La décomposition des géométries visuelles peut améliorer la précision de la vérification des collisions par rapport à celle fournie par les géométries des collisions.

      Ce code affiche les géométries visuelles d'un robot sans les géométries de collision :

      robot = loadrobot("rethinkSawyer");
      show(robot,homeConfiguration(robot),Collisions="off",Visuals="on");
      axis auto

      Visual geometries of Rethink Robotics Sawyer robot

    Dépendances

    Pour activer cette propriété, vous devez définir la propriété Type sur "RigidBodyTree".

    Types de données : char | string

    Exemples

    réduire tout

    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.

    Importez un robot KUKA LBR iiwa 14.

    robot = importrobot("iiwa14.urdf");

    Affichez le robot avec les maillages de collision par défaut.

    t = tiledlayout(1,2);
    title(t,"KUKA iiwa 14")
    nexttile;
    show(robot,Visuals="off",Collisions="on");
    title("Default Collision Meshes");
    axis auto
    nexttile;
    show(robot);
    title("Visual Meshes");
    axis auto

    Figure contains 2 axes objects. Axes object 1 with title Default Collision Meshes, xlabel X, ylabel Y contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh, iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh. Axes object 2 with title Visual Meshes, xlabel X, ylabel Y contains 29 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh.

    Importez un robot mais décomposez les maillages de collision à l'aide de la décomposition convexe approximative hiérarchique voxelisée (V-HACD).

    robotCollisionDecomp = importrobot("iiwa14.urdf",CollisionDecomposition=true);

    Affichez le robot avec les maillages de collision mis à jour à partir de la décomposition.

    figure
    show(robotCollisionDecomp,Visuals="off",Collisions="on");
    title("Decomposition of Collision Meshes");
    axis auto

    Figure contains an axes object. The axes object with title Decomposition of Collision Meshes, xlabel X, ylabel Y contains 85 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh, iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh.

    Par défaut le solveur V-HACD décompose les maillages de collision du robot. Pour décomposer les maillages visuels du robot, importez le robot avec les options personnalisées du solveur V-HACD.

    options = vhacdOptions("RigidBodyTree",SourceMesh="VisualGeometry");
    robotVisualDecomp = importrobot("iiwa14.urdf",CollisionDecomposition=options);

    Affichez le robot avec les maillages de collision mis à jour à partir de la décomposition.

    figure
    show(robotVisualDecomp,Visuals="off",Collisions="on");
    title("Decomposition of Visual Meshes");
    axis auto

    Figure contains an axes object. The axes object with title Decomposition of Visual Meshes, xlabel X, ylabel Y contains 85 objects of type patch, line. These objects represent world, iiwa_link_0, iiwa_link_1, iiwa_link_2, iiwa_link_3, iiwa_link_4, iiwa_link_5, iiwa_link_6, iiwa_link_7, iiwa_link_ee, iiwa_link_ee_kuka, iiwa_link_0_mesh, iiwa_link_1_mesh, iiwa_link_2_mesh, iiwa_link_3_mesh, iiwa_link_4_mesh, iiwa_link_5_mesh, iiwa_link_6_mesh, iiwa_link_7_mesh, iiwa_link_0_coll_mesh, iiwa_link_1_coll_mesh, iiwa_link_2_coll_mesh, iiwa_link_3_coll_mesh, iiwa_link_4_coll_mesh, iiwa_link_5_coll_mesh, iiwa_link_6_coll_mesh, iiwa_link_7_coll_mesh.

    Lisez un fichier STL d'un véhicule terrestre pour obtenir une triangulation. Utilisez ensuite trisurf pour visualiser le maillage.

    meshData = stlread("groundvehicle.stl");
    trisurf(meshData)
    view(135,8)
    axis equal

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

    Utilisez la fonction collisionVHACD pour décomposer les données de maillage en un tableau d'objets collisionMesh .

    collisionArray = collisionVHACD(meshData);

    Affichez le tableau de maillage de collision.

    figure
    showCollisionArray(collisionArray);
    title(["Decomposed Ground Vehicle Mesh","Default Solver Options"])

    Figure contains an axes object. The axes object with title Decomposed Ground Vehicle Mesh Default Solver Options, xlabel X, ylabel Y contains 32 objects of type patch.

    Créez des options de solveur qui spécifient un nombre maximum inférieur d'enveloppes convexes et décomposez à nouveau le maillage avec les nouvelles options.

    opts = vhacdOptions("IndividualMesh",SourceMesh="VisualGeometry",MaxNumConvexHulls=5);
    collisionArray2 = collisionVHACD(meshData,opts);

    Affichez le tableau de maillage de collision.

    figure
    showCollisionArray(collisionArray2);
    title(["Decomposed Ground Vehicle Mesh","Fewer Convex Hulls"])

    Figure contains an axes object. The axes object with title Decomposed Ground Vehicle Mesh Fewer Convex Hulls, xlabel X, ylabel Y contains 5 objects of type patch.

    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

    Voir aussi

    | | (Robotics System Toolbox)