Nota : A biblioteca não é mantida/construída ativamente, se você quiser contribuir, abra um issue.
Simulate é uma biblioteca para criar e compartilhar facilmente ambientes de simulação para agentes inteligentes (por exemplo, aprendizagem por reforço) ou geração de dados sintéticos.
Instale o Simulate (preferencialmente em um ambiente virtual) com um simples pip install simulate
Nota : vtk
não foi desenvolvido para Apple Silicon com Python 3.8. Instale com> 3,9 nesse caso.
Crie um ambiente virtual e instale as ferramentas de estilo/qualidade de código, bem como a base de código localmente
pip install --upgrade simulate
Antes de mesclar um PR, corrija o estilo (usamos isort
+ black
)
make style
A API do Simulate é inspirada na grande API do Kubric. O usuário cria uma Scene
e adiciona Assets
nela (objetos, câmeras, luzes etc).
Depois que a cena for criada, você poderá salvá-la e compartilhá-la como um arquivo. Este é um arquivo gIFT, também conhecido como arquivo JSON com recursos associados.
Você também pode renderizar a cena ou fazer simulações usando um dos mecanismos de renderização/simulação de backend (no momento Unity, Blender e Godot).
O formato de salvamento/compartilhamento é independente do mecanismo e usa um padrão da indústria gráfica.
Vamos fazer uma rápida exploração juntos.
import simulate as sm
scene = sm.Scene()
A API Python está localizada em src/simulate. Permite a criação e carregamento de cenas e o envio de comandos para o backend.
Fornecemos vários backends para renderizar e/ou executar a cena. O backend padrão não requer instalação específica e é baseado em pyvista. Ele permite renderizar/explorar rapidamente a cena, mas não suporta simulação de física. Para permitir simulações físicas, o backend do Unity pode, por exemplo, ser usado configurando engine="unity"
(e em breve o backend dos motores Godot e Blender também). Uma compilação do Unity será baixada automaticamente (se ainda não) e gerada para executar simulações. Alternativamente, pode-se baixar e usar o próprio editor Unity, que deve então ser aberto com Unity versão 2021.3.2f1.
Carregar uma cena de um arquivo local ou do Hub é feito com Scene.create_from()
, salvando localmente ou enviando para o Hub com 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()
Exemplo básico de criação de uma cena com um plano e uma esfera acima dele:
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()
Um objeto (assim como a cena) é apenas um nó em uma árvore fornecida com malha opcional (sob o capô criado/armazenado/editado como objetos pyvista.PolyData
ou pyvista.MultiBlock
) e material e/ou luz, câmera, agentes objetos especiais.
Os seguintes auxiliares de criação de objetos são fornecidos atualmente:
Object3D
qualquer objeto com uma malha e/ou materialPlane
Sphere
Capsule
Cylinder
Box
Cone
Line
MultipleLines
Tube
Polygon
Ring
Text3D
Triangle
Rectangle
Circle
StructuredGrid
Muitos desses objetos podem ser visualizados executando o seguinte exemplo:
python examples/basic/objects.py
Adicionando/removendo objetos:
+
) (ou alternativamente o método .add(object)
) adicionará um objeto como filho de um objeto anterior.-
) ou o comando .remove(object)
..clear()
.scene.sphere += sphere_child
.Acessando objetos:
name
na criação ou gerados automaticamente a partir do nome da classe + contador de criação)..get_node(name)
.tree_*
estão disponíveis em qualquer nó para navegar rapidamente ou listar parte da árvore de nós.Aqui estão alguns exemplos de manipulações:
# 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)
Os objetos podem ser facilmente traduzidos, girados e dimensionados
Aqui estão alguns exemplos:
# 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
Editando objetos:
Um mecanismo de visualização padrão é fornecido com o backend vtk do pyvista
.
Iniciar o mecanismo de visualização pode ser feito simplesmente com .show()
.
scene.show()
Você pode encontrar pontes para outros mecanismos de renderização/simulação no diretório integrations
.
Se você estiver executando no GCP, lembre-se de não instalar pyvistaqt
e, se o fez, desinstale-o do seu ambiente, pois o QT não funciona bem no 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} }
}