vhacdOptions
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(
especifica el tipo de descomposición y establece la propiedad type
)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.
OPTS = vhacdOptions(
establece propiedades usando uno o más argumentos de nombre-valor.type
,Name=Value
)
Propiedades
Type
— Tipo de descomposición
"IndividualMesh"
(predeterminado) | "RigidBodyTree"
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
VoxelResolution
— Resolución de descomposición de vóxeles.
128000
(predeterminado) | número entero positivo | N-vector elemento de enteros positivos
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.
MaxNumConvexHulls
— Número máximo de cascos convexos
32
(predeterminado) | número entero positivo | N-vector elemento 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.
MaxNumVerticesPerHull
— Número máximo de vértices por envolvente convexa
128
(predeterminado) | número entero positivo | N-vector elemento 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.
FillMode
— Modo de relleno para vóxeles interiores de malla.
"FLOOD_FILL"
(predeterminado) | "RAYCAST_FILL"
| "SURFACE_ONLY"
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
SourceMesh
— Tipo de malla de origen del árbol de cuerpo rígido importado para descomponer
"CollisionGeometry"
(predeterminado) | "VisualGeometry"
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
"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
Reemplazar mallas rígidas de colisión de cuerpos con descomposiciones de mallas visuales
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)
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:
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, 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.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.
Descomponer mallas de colisión de robots importados
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
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
Descomponer la malla STL no convexa en compuestos convexos
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
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"])
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)
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)