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.

collisionVHACD

Descomponga la malla en mallas de colisión convexas usando V-HACD

Desde R2023b

    Descripción

    ejemplo

    convexCollMeshes = collisionVHACD(sourceMesh) descompone una malla de triangulación en mallas de colisión convexas utilizando un solver de descomposición convexa aproximada jerárquica voxelizada (V-HACD).

    convexCollMeshes = collisionVHACD(sourceMesh,options) especifica las opciones del solver solver -HACD.

    [convexCollMeshes,info] = collisionVHACD(___) devuelve información sobre la descomposición. además de las mallas de colisión convexas descompuestas, utilizando cualquier combinación de argumentos de entrada de sintaxis anteriores.

    Ejemplos

    contraer todo

    Cargue un archivo STL que contenga una triangulación de contenedores rectangulares y luego visualice la triangulación de contenedores.

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

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

    Cree una malla de colisión utilizando los puntos de la triangulación del contenedor y luego visualice la malla. Tenga en cuenta que, cuando aproxima la triangulación del contenedor como una malla de colisión, el objeto collisionMesh utiliza el envolvente convexa de la triangulación del contenedor para aproximar el contenedor. Como resultado, la malla de colisión es convexa, a diferencia de la triangulación bin no convexa. El objeto collisionMesh hace esto porque la verificación de colisiones es más eficiente con mallas convexas. Sin embargo, esta aproximación convexa no es ideal para contenedores porque los robots pueden manipular contenedores u objetos dentro de los contenedores.

    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.

    Crea una lata de refresco usando un cilindro de colisión y establece la pose de modo que quede en el centro del contenedor. Luego, muéstralo en la malla de colisión convexa.

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

    Configure la caja para que sea transparente para que pueda ver la superposición entre el contenedor y la lata de refresco.

    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.

    Verifique la colisión entre la lata de refresco y la aproximación convexa del contenedor, y observe que están en colisión.

    isCollidingConvex = checkCollision(sodacan,meshColl)
    isCollidingConvex = 1
    

    Para obtener una mejor aproximación del contenedor para la verificación de colisiones, descomponga la malla no convexa original en múltiples mallas convexas utilizando la descomposición convexa aproximada jerárquica voxelizada (V-HACD).

    Utilice la función collisionVHACD para descomponer la triangulación no convexa original en mallas de colisión convexas. Luego, muestra el contenedor descompuesto con la lata de refresco.

    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.

    Comprobar colisión con todas las mallas que se aproximan al contenedor. Tenga en cuenta que la lata de refresco no choca con la aproximación no convexa descompuesta del contenedor. Si necesita una descomposición más precisa del contenedor, puede especificar opciones de solver personalizadas utilizando el objeto vhacdOptions .

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

    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.

    Argumentos de entrada

    contraer todo

    Triangulación de la geometría de la malla a descomponer, especificada como un objeto triangulation .

    Para visualizar triangulaciones de mallas antes de la descomposición, puede utilizar la función trimesh o trisurf .

    Opciones del solver V-HACD, ​​especificadas como un objeto vhacdOptions .

    Debe establecer la propiedad Type (Robotics System Toolbox) del objeto vhacdOptions en "IndividualMesh" para especificar opciones V-HACD personalizadas para el collisionVHACD. Función . Si la propiedad Type está establecida en "RigidBodyTree", entonces solo puede usar el objeto vhacdOptions para importar árboles de cuerpo rígido usando importrobot (Robotics System Toolbox) función

    Argumentos de salida

    contraer todo

    Mallas de colisión convexas, devueltas como un arreglo de celdas de elementos N de objetos collisionMesh .

    Puede utilizar la función showCollisionArray (Robotics System Toolbox) para visualizar las mallas de colisión.

    Información de la solución de descomposición, devuelta como una estructura que contiene estos campos:

    • SourceVolume — Volumen de la malla de origen de entrada especificada por el argumento sourceMesh .

    • CompositeDecompVolume — Volumen total combinado de las mallas de colisión convexas de salida. Este total incluye el volumen de mallas superpuestas.

    • RawDataN arreglo de celdas de elementos de vértices de malla utilizada para generar el arreglo de colisión. N es el número total de objetos de colisión necesarios para representar la malla descompuesta.

    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