collisionVHACD
Descomponga la malla en mallas de colisión convexas usando V-HACD
Desde R2023b
Sintaxis
Descripción
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
)
especifica las opciones del solver solver -HACD.convexCollMeshes
= collisionVHACD(sourceMesh
,options
)
[
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.convexCollMeshes
,info
] = collisionVHACD(___)
Ejemplos
Descomponer mallas no convexas para comprobar colisiones
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
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
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
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
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
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.
Argumentos de entrada
sourceMesh
— Triangulación de la geometría de la malla para descomponer.
triangulation
objeto
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
.
options
— Opciones del solver V-HACD
vhacdOptions
objeto
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
convexCollMeshes
— Mallas de colisión convexas
N arreglo de celdas de elementos de collisionMesh
objetos
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.
info
— Información de la solución de descomposición.
estructura
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 argumentosourceMesh
.CompositeDecompVolume
— Volumen total combinado de las mallas de colisión convexas de salida. Este total incluye el volumen de mallas superpuestas.RawData
— N 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
Consulte también
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)