collisionVHACD
Décomposer le maillage en maillages de collision convexes à l'aide de V-HACD
Depuis R2023b
Syntaxe
Description
décompose un maillage de triangulation en maillages de collision convexes à l'aide d'un solveur de décomposition convexe approximative hiérarchique voxélisée (V-HACD).convexCollMeshes
= collisionVHACD(sourceMesh
)
spécifie les options du solveur V-HACD.convexCollMeshes
= collisionVHACD(sourceMesh
,options
)
[
renvoie des informations sur la décomposition. en plus des maillages de collision convexes décomposés, en utilisant n'importe quelle combinaison d'arguments d'entrée des syntaxes précédentes.convexCollMeshes
,info
] = collisionVHACD(___)
Exemples
Décomposer les maillages non convexes pour la vérification des collisions
Chargez un fichier STL contenant une triangulation de bacs rectangulaires, puis visualisez la triangulation de bacs.
meshTri = stlread("bin.stl"); trisurf(meshTri) axis equal
Créez un maillage de collision en utilisant les points de la triangulation du bac, puis visualisez le maillage. Notez que, lorsque vous approximez la triangulation de casiers comme un maillage de collision, l'objet collisionMesh
utilise l'enveloppe convexe de la triangulation de casiers pour approximer le casier. En conséquence, le maillage de collision est convexe, contrairement à la triangulation non convexe. L'objet collisionMesh
fait cela car la vérification des collisions est plus efficace avec des maillages convexes. Cependant, cette approximation convexe n’est pas idéale pour les bacs car les robots peuvent manipuler des bacs ou des objets à l’intérieur des bacs.
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
Créez une canette de soda à l'aide d'un cylindre de collision et définissez la pose de telle sorte qu'elle repose au centre de la poubelle. Ensuite, montrez-le dans le maillage de collision convexe.
sodacan = collisionCylinder(0.1,0.4,Pose=trvec2tform([0 0 .3])); show(sodacan);
Réglez la boîte pour qu'elle soit transparente afin que vous puissiez voir le chevauchement entre le bac et la canette de soda.
p.FaceAlpha = 0.25;
hold off
Vérifiez la collision entre la canette de soda et l'approximation convexe du bac, et notez qu'ils sont en collision.
isCollidingConvex = checkCollision(sodacan,meshColl)
isCollidingConvex = 1
Pour obtenir une meilleure approximation du bac pour la vérification des collisions, décomposez le maillage non convexe d'origine en plusieurs maillages convexes à l'aide de la décomposition convexe approximative hiérarchique voxelisée (V-HACD).
Utilisez la fonction collisionVHACD
pour décomposer la triangulation non convexe d'origine en maillages de collision convexes. Ensuite, montrez le bac décomposé avec la canette de soda.
decomposedBin = collisionVHACD(meshTri);
showCollisionArray([decomposedBin {sodacan}]);
view(145,30)
axis equal
Vérifiez la collision avec tous les maillages qui se rapprochent du bac. A noter que la canette de soda n'est pas en collision avec l'approximation décomposée non convexe du bac. Si vous avez besoin d'une décomposition plus précise du bac, vous pouvez spécifier des options de solveur personnalisées à l'aide de l'objet vhacdOptions
.
isColliding = false(1,length(decomposedBin)); for i = 1:length(decomposedBin) isColliding(i) = checkCollision(sodacan,decomposedBin{i}); end isCollidingAll = all(isColliding)
isCollidingAll = logical
0
Remplacer les maillages de collision de corps rigides par des décompositions de maillages visuels
Chargez le robot Rethink Robotics Sawyer.
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'
Montrez le robot avec uniquement les maillages visuels et montrez le robot avec uniquement les maillages de collision. Utilisez une vue verticale pour que la différence entre les bras soit plus claire.
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)
Notez que chaque corps du bras est représenté par un seul maillage convexe qui ne représente pas avec précision les limites physiques du bras. Pour obtenir une vérification plus précise des collisions, vous devez décomposer les maillages visuels du robot. L'arbre des corps rigides stocke les corps rigides du bras aux indices 9
à 17
.
Tout d'abord, créez des options de solveur V-HACD pour les décompositions de maillage individuelles avec le nombre maximum d'enveloppes convexes défini sur 10
.
opts = vhacdOptions("IndividualMesh",MaxNumConvexHulls=10);
Alors pour chaque corps rigide :
Obtenez le corps rigide actuel et effacez le maillage de collision actuel.
Obtenez les données visuelles correspondantes s'il y en a.
S'il existe des données visuelles, utilisez
collisionVHACD
(Robotics System Toolbox) avec les options du solveur personnalisé pour décomposer la triangulation des données visuelles en un tableau de maillages de collision.Ajoutez chaque maillage de collision du tableau de maillages de collision au corps rigide.
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
Affichez les maillages de collision d'origine du bras du robot à côté du maillage de collision mis à jour du bras.
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
Notez que dans ce cas, les nouveaux maillages de collision représentent le bras du robot avec plus de précision.
Arguments d'entrée
sourceMesh
— Triangulation de la géométrie du maillage pour décomposer
Objet triangulation
Triangulation de la géométrie du maillage à décomposer, spécifiée comme objet triangulation
.
Pour visualiser les triangulations de maillages avant décomposition, vous pouvez utiliser la fonction trimesh
ou trisurf
.
options
— Options du solveur V-HACD
Objet vhacdOptions
Options du solveur V-HACD, spécifiées comme objet vhacdOptions
.
Vous devez définir la propriété Type
(Robotics System Toolbox) de l'objet vhacdOptions
sur "IndividualMesh"
pour spécifier des options V-HACD personnalisées pour le collisionVHACD
. Fonction . Si la propriété Type
est définie sur "RigidBodyTree"
, alors vous ne pouvez utiliser que l'objet vhacdOptions
pour importer des arbres de corps rigides à l'aide du importrobot
(Robotics System Toolbox) fonction
Arguments de sortie
convexCollMeshes
— Maillages de collision convexes
N- cell array d'éléments d'objets collisionMesh
Maillages de collision convexes, renvoyés sous la forme d'un cell array à N d'objets collisionMesh
.
Vous pouvez utiliser la fonction showCollisionArray
(Robotics System Toolbox) pour visualiser les maillages de collision.
info
— Informations sur la solution de décomposition
structure
Informations sur la solution de décomposition, renvoyées sous forme de structure contenant ces champs :
SourceVolume
— Volume du maillage source d'entrée spécifié par l'argumentsourceMesh
.CompositeDecompVolume
— Volume total combiné des maillages de collision convexes en sortie. Ce total inclut le volume des mailles superposées.RawData
— N - cell array d'éléments de sommets de maillage utilisé pour générer le tableau de collision. N est le nombre total d'objets de collision nécessaires pour représenter le maillage décomposé.
Références
[1] Mammou, Khaled, et al. “Voxelized Hierarchical Approximate Convex Decomposition - V-HACD Version 4.” GitHub, October 24, 2022. https://github.com/kmammou/v-hacd.
Historique des versions
Introduit dans R2023b
Voir aussi
Commande MATLAB
Vous avez cliqué sur un lien qui correspond à cette commande MATLAB :
Pour exécuter la commande, saisissez-la dans la fenêtre de commande de MATLAB. Les navigateurs web ne supportent pas les commandes 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)