
Genesis å ¥é (1) - äºå§ã
ãMacãã§ãGenesisãã®ãHello, Genesisãã詊ããã®ã§ãŸãšããŸããã
ã»Python 3.10
ã»macOS Sequoia 15.2
ã»Ubuntu 22.04
1. Genesis
ãGenesisãã¯ãããããå·¥åŠãEmbodied AIãPhysical AIã¢ããªã±ãŒã·ã§ã³åãã«èšèšãããå æ¬çãªç©çã·ãã¥ã¬ãŒã·ã§ã³ãã©ãããã©ãŒã ã§ããåæã«è€æ°ã®æ©èœãåããŠããŸã
2. Macã§Genesisãã¯ããã
2-1. Minicondaã®æºå
pipã ãšããŸããããªãã£ãã®ã§ããMinicondaãã䜿ããŸãã
(1) ãMinicondaãã®ã€ã³ã¹ããŒã«ã
mkdir -p ~/miniconda3
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh(2)  ã¢ã¯ãã£ããŒãã
ããã³ãããã(base) ~ %ãã«ãªããŸãã
source ~/miniconda3/bin/activate2-2. Genesis ã®ã€ã³ã¹ããŒã«
ãGenesisãã®ã€ã³ã¹ããŒã«æé ã¯ã次ã®ãšããã§ãã
(1) Pythonã®ä»®æ³ç°å¢ã®æºåã
ããã³ãããã(my_env) ~ %ãã«ãªããŸãã
conda create --name my_env python=3.10 -y
conda activate my_env
conda install pytorch torchvision torchaudio -c pytorch(2) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
pip install genesis-worldèªåã®ç°å¢ã§ã¯ããpyrenderããã€ã³ã¹ããŒã«ããå¿ èŠããããŸããã
conda config --add channels conda-forge
conda install pyrender2-3. Hello, Genesis ã®å®è¡
ãHello, Genesisãã®ãµã³ãã«ã³ãŒãã詊ããŸãã
(1) ãµã³ãã«ã³ãŒãã®å®è¡ã
ãrender_on_macos.pyããå®è¡ããŸãã
git clone https://github.com/Genesis-Embodied-AI/Genesis
cd Genesis
python examples/render_on_macos.py -v
Genesisã®åäœç¢ºèª (1)https://t.co/dAM2T1IZG9 pic.twitter.com/jegeZVU8zh
â åžçå·è±äž / Hidekazu Furukawa (@npaka123) December 21, 2024
ã¢ãŒã ãããŒããããåºã«èªç±èœäžããŸãã
3. Ubuntuã§Genesisãã¯ããã
3-1. Genesis ã®ã€ã³ã¹ããŒã«
(1) Pythonã®ä»®æ³ç°å¢ã®æºåã
ããã³ãããã(my_env) ~ %ãã«ãªããŸãã
python -m venv env
source env/bin/activate
pip install torch torchvision torchaudio(2) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
pip install genesis-worldèªåã®ç°å¢ã§ã¯ããPyOpenGL==3.1.5ãã«ããŠã³ã°ã¬ãŒãããå¿ èŠããããŸããã
pip install PyOpenGL==3.1.53-2. Hello, Genesis ã®å®è¡
ãHello, Genesisãã®ãµã³ãã«ã³ãŒãã詊ããŸãã
(1) ãµã³ãã«ã³ãŒãã®å®è¡ã
ãhello_genesis.pyããå®è¡ããŸãã
git clone https://github.com/Genesis-Embodied-AI/Genesis
cd Genesis
python examples/tutorials/hello_genesis.py
ã¢ãŒã ãããŒããããåºã«èªç±èœäžããŸãã
4. ã³ãŒãã®èª¬æ
4-1. åæå
gs.init() ã§GenesisãåæåããŸãã
# åæå
gs.init(backend=gs.cpu)ãã©ã¡ãŒã¿ã¯ã次ã®ãšããã§ãã
gs.init(
seed = None, # ä¹±æ°ã·ãŒã
precision = '32', # 粟床ã¬ãã« ('32'/'64')
debug = False, # ãããã°
eps = 1e-12, # EPS
backend = gs_backend.gpu, # ããã¯ãšã³ãããã€ã¹ (gs.cpu/gs.cuda/gs.vulkan/gs.metal)
theme = 'dark', # ã«ã©ãŒããŒã (dark/light/dumb)
logging_level = None, # ãã°ã¬ãã« ('warning'ãªã©)
logger_verbose_time = False, # ãã°ã«æéæ
å ±ãå«ããã
)4-2. ã·ãŒã³ã®äœæ
gs.Scene() ã§ã·ãŒã³ãäœæããŸããGenesiså ã®ãªããžã§ã¯ã (ãããããã«ã¡ã©ãªã©) ã¯ããã¹ãŠã·ãŒã³ã«é 眮ãããŸãã
scene = gs.Scene()ãã©ã¡ãŒã¿ã¯ã次ã®ãšããã§ãã
ã»sim_options (gs.options.SimOptions)
ã·ãã¥ã¬ãŒã¿å šäœãæ§æãããªãã·ã§ã³ããœã«ããŒã管çã
ã»coupler_options (gs.options.CouplerOptions)
ç°ãªããœã«ããŒéã®ã«ãã©ãŒãæ§æãããªãã·ã§ã³ã
ã»tool_options (gs.options.ToolOptions)
tool_solver (scene.sim.ToolSolver) ãæ§æãããªãã·ã§ã³ã
ã»rigid_options (gs.options.RigidOptions)
rigid_solver (scene.sim.RigidSolver) ãæ§æãããªãã·ã§ã³ã
ã»avatar_options (gs.options.AvatarOptions)
avatar_solver (scene.sim.AvatarSolver) ãæ§æãããªãã·ã§ã³ã
ã»mpm_options (gs.options.MPMOptions)
mpm_solver (scene.sim.MPMSolver) ãæ§æãããªãã·ã§ã³ã
ã»sph_options (gs.options.SPHOptions)
sph_solver (scene.sim.SPHSolver) ãæ§æãããªãã·ã§ã³ã
ã»fem_options (gs.options.FEMOptions)
fem_solver (scene.sim.FEMSolver) ãæ§æãããªãã·ã§ã³ã
ã»sf_options (gs.options.SFOptions)
sf_solver (scene.sim.SFSolver) ãæ§æãããªãã·ã§ã³ã
ã»pbd_options (gs.options.PBDOptions)
pbd_solver (scene.sim.PBDSolver) ãæ§æãããªãã·ã§ã³ã
ã»vis_options (gs.options.VisOptions)
visualizer (scene.visualizer) ãæ§æãããªãã·ã§ã³ã
ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ãšã«ã¡ã©ã®äž¡æ¹ãå¶åŸ¡ã
ã»viewer_options (gs.options.ViewerOptions)
viewer (scene.visualizer.viewer) ãæ§æãããªãã·ã§ã³ã
ã»renderer (gs.renderers.Renderer)
ã«ã¡ã©ãç»åãã¬ã³ããªã³ã°ããéã«äœ¿çšããã¬ã³ãã©ãŒã
ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã®åäœã«ã¯åœ±é¿ããªãã
ã»show_viewer (bool)
ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã衚瀺ãããã©ãããæå®ã
ã»show_FPS (bool)
ã¿ãŒããã«ã« FPS ã衚瀺ãããã©ãããæå®ã
ã¡ãœããã¯ã次ã®ãšããã§ãã
ã»add_entity() : ã·ãŒã³ã«ãšã³ãã£ãã£ã远å ã
ã»add_light() : ã·ãŒã³ã«ã©ã€ãã远å ã
ã»add_camera() : ã·ãŒã³ã«ã«ã¡ã©ã远å ã
ã»add_emitter() : ã·ãŒã³ã«æµäœãšããã¿ãŒã远å ã
ã»add_force_field() : ã·ãŒã³ã«åå Žã远å ã
ã»build() : ã·ãŒã³ã®ãã«ãã
ã»reset() : ã·ãŒã³ã®ãªã»ããã
ã»get_state() : ã·ãŒã³ã®çŸåšã®ç¶æ ãååŸã
ã»step() : ã·ãã¥ã¬ãŒã·ã§ã³ãæéçã«1ã¹ãããé²ããã
ã»draw_debug_line() : ã©ã€ã³ã®æç»ã
ã»draw_debug_arrow() : ç¢å°ã®æç»ã
ã»draw_debug_frame() : 3軞座æšãã¬ãŒã ã®æç»ã
ã»draw_debug_mesh() : ã¡ãã·ã¥ã®æç»ã
ã»draw_debug_sphere() : çäœã®æç»ã
ã»draw_debug_box() : ããã¯ã¹ã®æç»ã
ã»draw_debug_points() : ãã€ã³ãã®æç»ã
ã»clear_debug_objects() : ãããã°ãªããžã§ã¯ãã®ã¯ãªã¢ã
å°ãè€éãªäŸã¯ã次ã®ãšããã§ãã
ã·ãã¥ã¬ãŒã·ã§ã³ã® dt ã 0.01 ç§ã«èšå®ããéåãèšå®ããã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã®åæã«ã¡ã©ããŒãºãèšå®ããŠããŸãã
scene = gs.Scene(
sim_options=gs.options.SimOptions(
dt=0.01,
gravity=(0, 0, -10.0),
),
show_viewer=True,
viewer_options=gs.options.ViewerOptions(
camera_pos=(3.5, 0.0, 2.5),
camera_lookat=(0.0, 0.0, 0.5),
camera_fov=40,
),
)4-3. ã·ãŒã³ã«ãšã³ãã£ãã£ã远å
scene.add_entity() ã§ãšã³ãã£ãã£ã远å ããŸãã
ä»åã¯ã1ã€ã®å¹³é¢ãš1ã€ã®ã¢ãŒã ã远å ããŠããŸãã
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)ã»Entity
Genesiså
ã®ãªããžã§ã¯ã (ãããããã«ã¡ã©ãªã©) ã¯ããEntityãã§è¡šããŸããadd_entity() ã®æåã®ãã©ã¡ãŒã¿ã¯ãMorphãã§ãã
ã»Morph
ãMorphãã¯ããEntityãã®Â geometry ãšÂ pose ãã«ãã»ã«åããŸãããMorphãã䜿çšããããšã§ãããªããã£ããå€éšãã¡ã€ã«ãããEntityããã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
franka = scene.add_entity(
gs.morphs.MJCF(
file = 'xml/franka_emika_panda/panda.xml'
pos = (0, 0, 0),
euler = (0, 0, 90), # ãªã€ã©ãŒ (x-y-z èŠå)
# quat = (1.0, 0.0, 0.0, 0.0), # ã¯ã©ãŒã¿ããªã³ (w-x-y-z èŠå)
scale = 1.0,
),
)ã»ããªããã£ã
ãµããŒãããŠããããªããã£ãã¯ã次ã®ãšããã§ãã
ã»gs.morphs.Plane
ã»gs.morphs.Box
ã»gs.morphs.Cylinder
ã»gs.morphs.Sphere
ç§»åã¿ã¹ã¯ã®åŠç¿ã§ã¯ãæ§ã ãªçš®é¡ã®çµã¿èŸŒã¿å°åœ¢ãšãgs.morphs.Terrain ãä»ããŠãŠãŒã¶ãŒãæå®ããé«ããããããåæåãããå°åœ¢ããµããŒãããŠããŸãã
ã»å€éšãã¡ã€ã«
ãµããŒãããŠããå€éšãã¡ã€ã«ã¯ã次ã®ãšããã§ãã
ã»gs.morphs.MJCF
ã»gs.morphs.URDF
ã»gs.morphs.Mesh (*.obj, *.ply, *.stl, *.glb, *.gltf)
å€éšãã¡ã€ã«ããèªã¿èŸŒãå Žåã¯ãfile ã§ãã¡ã€ã«ã®å Žæãæå®ããå¿ èŠããããŸãããã®æã絶察ãã¹ãšçžå¯Ÿãã¹ã®äž¡æ¹ããµããŒãããŸããçžå¯Ÿãã¹ã®å Žåã¯ãçŸåšã®äœæ¥ãã£ã¬ã¯ããªã®çžå¯Ÿãã¹ã ãã§ãªããgenesis/assets äžã®ãã¹ãæ€çŽ¢ããŸãã
å€éšãURDFãã䜿çšã㊠Frankaã¢ãŒã ãããŒãããå Žåã¯ããMorphãã gs.morphs.URDF(file='urdf/panda_bullet/panda.urdf', fixed=True) ã«å€æŽããŸããããããã®ããŒã¹ãªã³ã¯ãšã¯ãŒã«ããæ¥ç¶ãããžã§ã€ã³ãã¿ã€ããæ¢ã«æå®ããŠãããMJCFããšã¯ç°ãªãããURDFãã«ã¯ãã®æ å ±ãä»å±ããŠããŸããããã®ãããããã©ã«ãã§ã¯ããURDFãã®ããããããªãŒã®ããŒã¹ãªã³ã¯ã¯ã¯ãŒã«ãããåæãããŠããŸã (ããæ£ç¢ºã«ã¯ãèªç±ãª6èªç±åºŠãžã§ã€ã³ããä»ããŠã¯ãŒã«ãã«æ¥ç¶ãããŠããŸã)ããããã£ãŠãããŒã¹ãªã³ã¯ãåºå®ããå Žåã¯ãmorphs.URDF ãš morphs.Mesh ã« fixed=True ãæå®ããå¿ èŠããããŸãã
4-4. ã·ãŒã³ã®ãã«ã ãš ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã§ã®è¡šç€º
scene.build()
for i in range(1000):
scene.step()ã»ã·ãŒã³ã®ãã«ã
scene.build() ã§ã·ãŒã³ããã«ãããŸããããã«ããããã¹ãŠãé
眮ãããããã€ã¹ã¡ã¢ãªãå²ãåœãŠãããã·ãã¥ã¬ãŒã·ã§ã³ã®åºç€ãšãªãããŒã¿ãã£ãŒã«ããäœæãããŸãã
ã»ã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢
ã·ãŒã³ããã«ãããããšãã€ã³ã¿ã©ã¯ãã£ããã¥ãŒã¢ã衚瀺ãããŸãããã¥ãŒã¢ã«ã¯ããããªé²ç»ã»ã¹ã¯ãªãŒã³ã·ã§ããã»èŠèŠåã¢ãŒãåãæ¿ããªã©ã®ããŒããŒãã·ã§ãŒãã«ãããä»å±ããŠããŸãã
ãããŸãã Miniconda ã®äž»ãªã³ãã³ã
(1) baseã«ã¢ã¯ãã£ããŒã (condaç°å¢å€ãããå¯èœ)ã
source ~/miniconda3/bin/activate(2) my_envã«ã¢ã¯ãã£ããŒã (condaç°å¢å ã®ã¿)ã
conda activate my_env(3) ç°å¢ã®äžèЧã
conda info --envs(4) ãã¢ã¯ãã£ããŒãã
conda deactivate(5) my_envã®åé€ã
conda remove --name my_env --all