Remarque : La bibliothèque n'est pas activement maintenue/construite, si vous souhaitez contribuer, veuillez ouvrir un ticket.
Simulate est une bibliothèque permettant de créer et de partager facilement des environnements de simulation pour des agents intelligents (par exemple apprentissage par renforcement) ou pour la génération de données synthétiques.
Installez Simulate (de préférence dans un environnement virtuel) avec un simple pip install simulate
Remarque : vtk
n'est pas construit pour Apple Silicon avec Python 3.8. Veuillez installer avec >3.9 dans ce cas.
Créez un environnement virtuel puis installez les outils de style/qualité de code ainsi que la base de code localement
pip install --upgrade simulate
Avant de fusionner un PR, corrigez le style (nous utilisons isort
+ black
)
make style
L'API de Simulate est inspirée de la grande API de Kubric. L'utilisateur crée une Scene
et y ajoute Assets
(objets, caméras, lumières, etc.).
Une fois la scène créée, vous pouvez la sauvegarder et la partager sous forme de fichier. Il s'agit d'un fichier GIFT, alias un fichier JSON avec les ressources associées.
Vous pouvez également restituer la scène ou effectuer des simulations en utilisant l'un des moteurs de rendu/simulation backend (actuellement Unity, Blender et Godot).
Le format de sauvegarde/partage est indépendant du moteur et utilise une norme de l’industrie graphique.
Faisons une petite exploration ensemble.
import simulate as sm
scene = sm.Scene()
L'API Python se trouve dans src/simulate. Il permet la création et le chargement de scènes, ainsi que l'envoi de commandes au backend.
Nous fournissons plusieurs backends pour restituer et/ou exécuter la scène. Le backend par défaut ne nécessite aucune installation spécifique et est basé sur pyvista. Il permet de rendre/explorer rapidement une scène mais ne gère pas la simulation physique. Pour permettre des simulations physiques, le backend Unity peut par exemple être utilisé en définissant engine="unity"
(et bientôt le backend Godot et Blender Engines également). Une version Unity sera automatiquement téléchargée (si ce n'est déjà fait) et créée pour exécuter des simulations. Alternativement, on peut télécharger et utiliser soi-même l'éditeur Unity, qui doit ensuite être ouvert avec la version 2021.3.2f1 d'Unity.
Le chargement d'une scène à partir d'un fichier local ou du Hub se fait avec Scene.create_from()
, en enregistrant localement ou en poussant vers le Hub avec scene.save()
ou scene.push_to_hub()
:
from simulate import Scene
scene = Scene.create_from('tests/test_assets/fixtures/Box.gltf') # either local (priority) or on the Hub with full path to file
scene = Scene.create_from('simulate-tests/Box/glTF/Box.gltf', is_local=False) # Set priority to the Hub file
scene.save('local_dir/file.gltf') # Save to a local file
scene.push_to_hub('simulate-tests/Debug/glTF/Box.gltf') # Save to the Hub - use a token if necessary
scene.show()
Exemple simple de création d'une scène avec un plan et une sphère au-dessus :
import simulate as sm
scene = sm.Scene()
scene += sm.Plane() + sm.Sphere(position=[0, 1, 0], radius=0.2)
>>> scene
>>> Scene(dimensionality=3, engine='PyVistaEngine')
>>> └── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
scene.show()
Un objet (ainsi que la scène) n'est qu'un nœud dans un arbre fourni avec un maillage optionnel (sous le capot créé/stocké/édité en tant qu'objets pyvista.PolyData
ou pyvista.MultiBlock
) et du matériel et/ou de la lumière, une caméra, des agents. objets spéciaux.
Les aides à la création d'objets suivantes sont actuellement fournies :
Object3D
tout objet avec un maillage et/ou un matériauPlane
Sphere
Capsule
Cylinder
Box
Cone
Line
MultipleLines
Tube
Polygon
Ring
Text3D
Triangle
Rectangle
Circle
StructuredGrid
Beaucoup de ces objets peuvent être visualisés en exécutant l'exemple suivant :
python examples/basic/objects.py
Ajout/suppression d'objets :
+
) (ou alternativement de la méthode .add(object)
) ajoutera un objet en tant qu'enfant d'un objet précédent.-
) ou la commande .remove(object)
..clear()
.scene.sphere += sphere_child
.Accéder aux objets :
name
lors de la création ou générés automatiquement à partir du nom de la classe + du compteur de création)..get_node(name)
.tree_*
sont disponibles sur n'importe quel nœud pour parcourir ou répertorier rapidement une partie de l'arborescence des nœuds.Voici quelques exemples de manipulations :
# Add two copy of the sphere to the scene as children of the root node (using list will add all objects on the same level)
# Using `.copy()` will create a copy of an object (the copy doesn't have any parent or children)
scene += [scene.plane_01.sphere_02.copy(), scene.plane_01.sphere_02.copy()]
>>> scene
>>> Scene(dimensionality=3, engine='pyvista')
>>> ├── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> │ └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
>>> ├── sphere_03 (Sphere - Mesh: 842 points, 870 cells)
>>> └── sphere_04 (Sphere - Mesh: 842 points, 870 cells)
# Remove the last added sphere
>>> scene.remove(scene.sphere_04)
>>> Scene(dimensionality=3, engine='pyvista')
>>> ├── plane_01 (Plane - Mesh: 121 points, 100 cells)
>>> │ └── sphere_02 (Sphere - Mesh: 842 points, 870 cells)
>>> └── sphere_03 (Sphere - Mesh: 842 points, 870 cells)
Les objets peuvent être facilement traduits, pivotés et mis à l'échelle
Voici quelques exemples :
# Let's translate our floor (with the first sphere, it's child)
scene.plane_01.translate_x(1)
# Let's scale the second sphere uniformly
scene.sphere_03.scale(0.1)
# Inspect the current position and scaling values
print(scene.plane_01.position)
>>> array([1., 0., 0.])
print(scene.sphere_03.scaling)
>>> array([0.1, 0.1, 0.1])
# We can also translate from a vector and rotate from a quaternion or along the various axis
Modification d'objets :
Un moteur de visualisation par défaut est fourni avec le backend vtk de pyvista
.
Le démarrage du moteur de visualisation peut se faire simplement avec .show()
.
scene.show()
Vous pouvez trouver des ponts vers d'autres moteurs de rendu/simulation dans le répertoire integrations
.
Si vous utilisez GCP, n'oubliez pas de ne pas installer pyvistaqt
, et si vous l'avez fait, désinstallez-le de votre environnement, car QT ne fonctionne pas bien sur GCP.
@misc { simulate ,
author = { Thomas Wolf, Edward Beeching, Carl Cochet, Dylan Ebert, Alicia Machado, Nathan Lambert, Clément Romac } ,
title = { Simulate } ,
year = { 2022 } ,
publisher = { GitHub } ,
journal = { GitHub repository } ,
howpublished = { url{https://github.com/huggingface/simulate} }
}