Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

vhacdOptions

Opciones de resolución para V-HACD

Desde R2023b

    Descripción

    El objeto vhacdOptions define opciones de solver de descomposición convexa aproximada jerárquica voxelizada (V-HACD) para funciones como collisionVHACD y importrobot (Robotics System Toolbox). Para descomponer mallas cóncavas individuales en mallas convexas para verificar colisiones, use vhacdOptions con la propiedad Type establecida en "IndividualMesh". Para descomponer las mallas de un árbol de cuerpo rígido, use vhacdOptions con la propiedad Type establecida en "RigidBodyTree".

    Creación

    Descripción

    OPTS = vhacdOptions crea un objeto de opciones de solver V-HACD con valores de propiedad predeterminados para descomponer mallas individuales con la función collisionVHACD .

    OPTS = vhacdOptions(type) especifica el tipo de descomposición y establece la propiedad Type en type. Utilice esta sintaxis para crear opciones de solver de V-HACD con la propiedad Type establecida en "RigidBodyTree" para usar con la función importrobot (Robotics System Toolbox) .

    Nota

    Si establece solo la propiedad Type en la construcción del objeto, entonces las propiedades usan los valores predeterminados para el tipo de descomposición correspondiente.

    ejemplo

    OPTS = vhacdOptions(type,Name=Value) establece propiedades usando uno o más argumentos de nombre-valor.

    Propiedades

    expandir todo

    Tipo de descomposición, especificada como "IndividualMesh" o "RigidBodyTree". Para descomponer una sola malla usando la función collisionVHACD (Robotics System Toolbox) , establezca Type en "IndividualMesh". Para descomponer modelos de robots durante la importación con la función importrobot (Robotics System Toolbox) , establezca Type en "RigidBodyTree".

    Los valores predeterminados de las propiedades VoxelResolution, MaxNumConvexHulls y MaxNumVerticesPerHull dependen del Type especificado.

    Tipos de datos: char | string

    Resolución de vóxel de la descomposición, especificada como un número entero positivo o un vector de elemento N de números enteros positivos. N es el número de cuerpos rígidos en el modelo de árbol de cuerpos rígidos especificado en la función importrobot (Robotics System Toolbox) . El uso de una resolución de vóxel más alta puede mejorar la precisión de la descomposición a costa de aumentar el tiempo de descomposición.

    Si establece la propiedad Type en "RigidBodyTree" en la construcción del objeto, el valor predeterminado de VoxelResolution es 2000 para todos los cuerpos del árbol de cuerpos rígidos. Para establecer una resolución de vóxel para todos los cuerpos rígidos del árbol de cuerpos rígidos, especifique VoxelResolution como un entero positivo. Para especificar individualmente resoluciones de vóxeles para cada cuerpo del árbol de cuerpo rígido, especifique VoxelResolution como un vector de elementos N de enteros positivos.

    Número máximo de cascos convexos después de la descomposición, especificado como un entero positivo o un vector de elementos N de enteros positivos. N es el número de cuerpos rígidos en el modelo de árbol de cuerpos rígidos especificado en la función importrobot (Robotics System Toolbox) . Aumentar el número de cascos convexos puede mejorar la precisión de la descomposición, pero también puede dar como resultado un aumento en el número de mallas convexas producidas por la descomposición. Más mallas pueden generar resultados más precisos a costa de un mayor tiempo de verificación de colisiones.

    Si establece la propiedad Type en "RigidBodyTree" en la construcción del objeto, el valor predeterminado de MaxNumConvexHulls es 8 para todos los cuerpos del árbol de cuerpos rígidos. Para establecer una resolución de vóxel para todos los cuerpos rígidos del árbol de cuerpos rígidos, especifique MaxNumConvexHulls como un entero positivo. Para especificar individualmente las resoluciones de vóxeles para cada cuerpo, especifique MaxNumConvexHulls como un vector de elementos N de enteros positivos.

    Número máximo de vértices por envolvente convexa después de la descomposición, especificado como un entero positivo o un vector de elemento N de enteros positivos. N es el número de cuerpos rígidos en el modelo de árbol de cuerpos rígidos especificado en la función importrobot (Robotics System Toolbox) . Aumentar el número máximo de vértices por envolvente convexa puede mejorar la precisión de cada envolvente convexa a costa de un mayor tiempo de descomposición.

    Si establece la propiedad Type en "RigidBodyTree" en la construcción del objeto, el valor predeterminado de MaxNumVerticesPerHull es 16 para todos los cuerpos del árbol de cuerpos rígidos. Para establecer una resolución de vóxel para todos los cuerpos rígidos del árbol de cuerpos rígidos, especifique MaxNumVerticesPerHull como un entero positivo. Para especificar una resolución de vóxel para cada cuerpo, especifique MaxNumVerticesPerHull como un vector de elementos N de enteros positivos.

    Modo de relleno para los vóxeles interiores de la malla después de la voxelización, especificado como "FLOOD_FILL", "SURFACE_ONLY" o "RAYCAST_FILL":

    • "FLOOD_FILL" — El modo de relleno por inundación utiliza el algoritmo de relleno por inundación para determinar la superficie exterior de la malla. Después de determinar la superficie exterior de la malla, el solver V-HACD llena los vóxeles interiores encerrados por la superficie exterior. El modo "FLOOD_FILL" produce el resultado más preciso para mallas cerradas. Si utiliza el modo de relleno inundado para una malla abierta, el algoritmo de relleno inundado considera la superficie interior de la malla como conectada a la superficie exterior de la malla, lo que da como resultado una malla hueca. Si la malla está abierta, use el modo "RAYCAST_FILL" para obtener mejores resultados.

    • "RAYCAST_FILL" : el modo de relleno Raycasting utiliza raycasting para identificar la superficie exterior de la malla y rellenar los vóxeles interiores encerrados por la superficie exterior de la malla. Utilice este modo para rellenar vóxeles interiores de mallas abiertas. Para mayor precisión, use software de modelado 3D para cerrar la malla y use el modo "FLOOD_FILL" .

    • "SURFACE_ONLY" : el modo de relleno solo de superficie no rellena ningún vóxel interior en la malla. Utilice este modo para mallas que no deberían tener volumen.

    Tipos de datos: char | string

    Tipo de malla de origen del árbol de cuerpo rígido que se descompondrá cuando se utiliza la función importrobot (Robotics System Toolbox) , especificada como "CollisionGeometry" o "VisualGeometry":

    • "CollisionGeometry" : descompone las geometrías de colisión del modelo de árbol de cuerpo rígido, que se utilizan para la verificación de colisiones. La descomposición de las mallas de geometría de colisión puede reducir la complejidad de las mallas y mejorar la velocidad de verificación de colisiones a costa de la precisión de la verificación de colisiones.

      Este código muestra las geometrías de colisión de un robot sin las geometrías visuales:

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

      Collision geometries of Rethink Robotics Sawyer robot

    • "VisualGeometry" : descompone las geometrías visuales del modelo de árbol de cuerpo rígido, que representan una visualización más precisa de la apariencia del robot. La descomposición de las geometrías visuales puede mejorar la precisión de la verificación de colisiones con respecto a la proporcionada por las geometrías de colisión.

      Este código muestra las geometrías visuales de un robot sin las geometrías de colisión:

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

      Visual geometries of Rethink Robotics Sawyer robot

    Dependencias

    Para habilitar esta propiedad, debe establecer la propiedad Type en "RigidBodyTree".

    Tipos de datos: char | string

    Ejemplos

    contraer todo

    Cargue el robot Sawyer de Rethink Robotics.

    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'
    
    

    Muestre el robot solo con las mallas visuales y muestre el robot solo con las mallas de colisión. Utilice una vista vertical para que la diferencia entre los brazos sea más clara.

    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.

    Tenga en cuenta que cada cuerpo del brazo está representado por una única malla convexa que no representa con precisión los límites físicos del brazo. Para lograr una verificación de colisiones más precisa, es necesario descomponer las mallas visuales del robot. El árbol de cuerpos rígidos almacena los cuerpos rígidos del brazo en índices 9 a 17.

    Primero, cree opciones de solver V-HACD para descomposiciones de malla individuales con el número máximo de cascos convexos establecido en 10.

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

    Luego para cada cuerpo rígido:

    1. Obtenga el cuerpo rígido actual y borre la malla de colisión actual.

    2. Obtenga los datos visuales correspondientes si los hay.

    3. Si hay datos visuales, use collisionVHACD (Robotics System Toolbox) con las opciones de solver personalizadas para descomponer la triangulación de los datos visuales en un arreglo de mallas de colisión.

    4. Agregue cada malla de colisión del arreglo de mallas de colisión al cuerpo rígido.

    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

    Muestre las mallas de colisión originales del brazo del robot junto a la malla de colisión actualizada del brazo.

    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.

    Tenga en cuenta que en este caso las nuevas mallas de colisión representan el brazo del robot con mayor precisión.

    Importar un robot KUKA LBR iiwa 14.

    robot = importrobot("iiwa14.urdf");

    Muestra el robot con las mallas de colisión predeterminadas.

    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.

    Importe un robot pero descomponga las mallas de colisión mediante descomposición convexa aproximada jerárquica voxelizada (V-HACD).

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

    Muestra el robot con las mallas de colisión actualizadas a partir de la descomposición.

    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.

    Por defecto, el solver V-HACD descompone las mallas de colisión del robot. Para descomponer las mallas visuales del robot, importe el robot con opciones personalizadas del solver V-HACD.

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

    Muestra el robot con las mallas de colisión actualizadas a partir de la descomposición.

    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.

    Lea un archivo STL de un vehículo terrestre para obtener una triangulación. Luego use trisurf para visualizar la malla.

    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.

    Utilice la función collisionVHACD para descomponer los datos de la malla en un arreglo de objetos collisionMesh .

    collisionArray = collisionVHACD(meshData);

    Muestra el arreglo de malla de colisión.

    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.

    Cree opciones de solver que especifiquen un número máximo inferior de cascos convexos y descomponga la malla nuevamente con las nuevas opciones.

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

    Muestra el arreglo de malla de colisión.

    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.

    Referencias

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

    Historial de versiones

    Introducido en R2023b

    Consulte también

    | | (Robotics System Toolbox)