Nota : La biblioteca no se mantiene ni se construye activamente; si desea contribuir, abra una incidencia.
Simulate es una biblioteca para crear y compartir fácilmente entornos de simulación para agentes inteligentes (por ejemplo, aprendizaje por refuerzo) o generación de datos sintéticos.
Instale Simulate (preferiblemente en un entorno virtual) con una simple pip install simulate
Nota : vtk
no está diseñado para Apple Silicon con Python 3.8. Instálelo con >3.9 en ese caso.
Cree un entorno virtual y luego instale las herramientas de estilo/calidad del código, así como la base del código localmente
pip install --upgrade simulate
Antes de fusionar un PR, corrija el estilo (usamos isort
+ black
)
make style
La API de Simulate está inspirada en la API del gran Kubric. El usuario crea una Scene
y agrega Assets
en ella (objetos, cámaras, luces, etc.).
Una vez creada la escena, puede guardarla y compartirla como un archivo. Este es un archivo gift, también conocido como archivo JSON con recursos asociados.
También puedes renderizar la escena o hacer simulaciones usando uno de los motores de renderizado/simulación backend (por el momento Unity, Blender y Godot).
El formato para guardar/compartir es independiente del motor y utiliza un estándar de la industria gráfica.
Hagamos una exploración rápida juntos.
import simulate as sm
scene = sm.Scene()
La API de Python se encuentra en src/simulate. Permite la creación y carga de escenas y el envío de comandos al backend.
Proporcionamos varios backends para renderizar y/o ejecutar la escena. El backend predeterminado no requiere instalación específica y está basado en pyvista. Permite renderizar/explorar rápidamente una escena, pero no maneja la simulación física. Para permitir simulaciones físicas, el backend de Unity se puede usar, por ejemplo, configurando engine="unity"
(y pronto también el backend de Godot y Blender Engines). Se descargará automáticamente una compilación de Unity (si no ya) y se generará para ejecutar simulaciones. Alternativamente, uno puede descargar y usar el editor de Unity, que luego debe abrirse con la versión 2021.3.2f1 de Unity.
La carga de una escena desde un archivo local o el Hub se realiza con Scene.create_from()
, se guarda localmente o se envía al Hub con scene.save()
o 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()
Ejemplo básico de creación de una escena con un plano y una esfera encima:
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 objeto (así como la escena) es solo un nodo en un árbol provisto de una malla opcional (debajo del capó creada/almacenada/editada como objetos pyvista.PolyData
o pyvista.MultiBlock
) y material y/o luz, cámara, agentes. objetos especiales.
Actualmente se proporcionan los siguientes ayudantes para la creación de objetos:
Object3D
cualquier objeto con una malla y/o materialPlane
Sphere
Capsule
Cylinder
Box
Cone
Line
MultipleLines
Tube
Polygon
Ring
Text3D
Triangle
Rectangle
Circle
StructuredGrid
Muchos de estos objetos se pueden visualizar ejecutando el siguiente ejemplo:
python examples/basic/objects.py
Agregar/eliminar objetos:
+
) (o alternativamente el método .add(object)
) agregará un objeto como hijo de un objeto anterior.-
) o el comando .remove(object)
..clear()
.scene.sphere += sphere_child
.Accediendo a objetos:
name
en el momento de la creación o generados automáticamente a partir del nombre de la clase + contador de creación)..get_node(name)
.tree_*
están disponibles en cualquier nodo para navegar rápidamente o enumerar parte del árbol de nodos.Aquí hay un par de ejemplos de manipulaciones:
# 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)
Los objetos se pueden traducir, rotar y escalar fácilmente
Aquí hay un par de ejemplos:
# 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
Editar objetos:
Se proporciona un motor de visualización predeterminado con el backend vtk de pyvista
.
Iniciar el motor de visualización se puede hacer simplemente con .show()
.
scene.show()
Puede encontrar puentes a otros motores de renderizado/simulación en el directorio de integrations
.
Si está ejecutando GCP, recuerde no instalar pyvistaqt
y, si lo hizo, desinstálelo en su entorno, ya que QT no funciona bien en 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} }
}