vhacdOptions
Descripción
El objeto vhacdOptions
define opciones de solucionador 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, utilice vhacdOptions
con la propiedad Type
establecida en "IndividualMesh"
. Para descomponer las mallas de un árbol de cuerpo rígido, utilice vhacdOptions
con la propiedad Type
establecida en "RigidBodyTree"
.
Creación
Descripción
OPTS = vhacdOptions
crea un objeto de opciones del solucionador V-HACD con valores de propiedad predeterminados para descomponer mallas individuales con la función collisionVHACD
.
OPTS = vhacdOptions(
especifica el tipo de descomposición. Utilice esta sintaxis para crear opciones de solucionador V-HACD con la propiedad Type
)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, las propiedades usan los valores predeterminados para el tipo de descomposición correspondiente.
OPTS = vhacdOptions(
establece propiedades utilizando uno o más argumentos de nombre-valor.Type
,Name=Value
)
Propiedades
Tipo de descomposición, especificado como "IndividualMesh"
o "RigidBodyTree"
. Para descomponer una sola malla utilizando la función collisionVHACD
(Robotics System Toolbox), configure Type
en "IndividualMesh"
. Para descomponer modelos de robot durante la importación con la función importrobot
(Robotics System Toolbox), configure 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 entero positivo o un vector de N elementos 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). 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"
durante 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 las resoluciones de vóxel para cada cuerpo del árbol de cuerpo rígido, especifique VoxelResolution
como un vector de N elementos de números enteros positivos.
Número máximo de envolturas convexas después de la descomposición, especificado como un entero positivo o un vector de N elementos 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"
durante 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óxel para cada cuerpo, especifique MaxNumConvexHulls
como un vector de N elementos de números enteros positivos.
Número máximo de vértices por envoltura convexa después de la descomposición, especificado como un entero positivo o un vector de N elementos 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"
durante 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 N elementos de números enteros positivos.
Modo de relleno para 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 solucionador V-HACD rellena 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, utilice 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 una mayor precisión, utilice un software de modelado 3D para cerrar la malla y utilice el modo"FLOOD_FILL"
."SURFACE_ONLY"
— El modo de relleno de solo superficie no rellena ningún vóxel interior de 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 a descomponer 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 comprobació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
"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
Dependencias
Para habilitar esta propiedad, debe establecer la propiedad Type
en "RigidBodyTree"
.
Tipos de datos: char
| string
Ejemplos
Cargue el robot Sawyer de Rethink Robotics.
robot = loadrobot("rethinkSawyer",DataFormat="row")
robot = rigidBodyTree with properties: NumBodies: 20 Bodies: {1×20 cell} Base: [1×1 rigidBody] BodyNames: {1×20 cell} BaseName: 'base' Gravity: [0 0 0] DataFormat: 'row' FrameNames: {1×21 cell}
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)
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 los índices 9
a 17
.
Primero, cree opciones de solucionador V-HACD para descomposiciones de malla individuales con el número máximo de envolturas convexas establecido en 10
.
opts = vhacdOptions("IndividualMesh",MaxNumConvexHulls=10);
Luego para cada cuerpo rígido:
Obtenga el cuerpo rígido actual y borre la malla de colisión actual.
Obtenga los datos visuales correspondientes si los hay.
Si hay datos visuales, utilice
collisionVHACD
(Robotics System Toolbox) con las opciones de solucionador personalizadas para descomponer la triangulación de los datos visuales en una matriz de mallas de colisión.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
Tenga en cuenta que en este caso las nuevas mallas de colisión representan el brazo del robot con mayor precisión.
Importe un robot KUKA LBR iiwa 14.
robot = importrobot("iiwa14.urdf");
Muestre 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
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
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
Lea un archivo STL de un vehículo terrestre para obtener una triangulación. Luego usa trisurf
para visualizar la malla.
meshData = stlread("groundvehicle.stl"); trisurf(meshData) view(135,8) axis equal
Utilice la función collisionVHACD
para descomponer los datos de la malla en una matriz 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"])
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"])
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
collisionVHACD
| showCollisionArray
| rigidBodyTree
(Robotics System Toolbox)
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Seleccione un país/idioma
Seleccione un país/idioma para obtener contenido traducido, si está disponible, y ver eventos y ofertas de productos y servicios locales. Según su ubicación geográfica, recomendamos que seleccione: .
También puede seleccionar uno de estos países/idiomas:
Cómo obtener el mejor rendimiento
Seleccione China (en idioma chino o inglés) para obtener el mejor rendimiento. Los sitios web de otros países no están optimizados para ser accedidos desde su ubicación geográfica.
América
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)