Genesisを使ってみる その1(環境構築、サンプルプログラムの実行)
はじめに
今回はGenesisという物理シミュレーションソフトウェアを試してみました。
3か月ほど前に公開されたばかりで、デモ動画が面白そうでした。グラフィックはUnreal Engineのようにリアルで、ROSのように多軸のロボットアームをシミュレーション上で動かしていました。
▼面白そうなデモ動画がいろいろあります。
https://genesis-embodied-ai.github.io
AI関連の技術とも組み合わせて使うことができ、Pythonで開発できるようです。
▼私はこれまで、Unreal EngineとROSをNode-REDでつないで、ロボットのデジタルツインのようなものを試していました。Genesisでどこまでできるのかが気になっています。
▼以前の記事はこちら
環境を構築する
READMEを参考に環境を構築します。なお実行環境はWindows 11、Pythonのバージョンは3.10です。
▼GitHubのページはこちら
https://github.com/Genesis-Embodied-AI/Genesis
まずはPythonの仮想環境を作成して、有効化しておきます。
py -3.10 -m venv pyenv-genesis
cd pyenv-genesis
.\Scripts\activate
PyTorchが必要なようです。
▼YOLOをGPUで実行できるように設定したときに、インストールを行いました。同じコマンドを実行しました。
以下のコマンドでインストールしました。CUDA 12.6用のコマンドになっているので、お使いの環境に合わせて実行してください。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
Genesisのパッケージをインストールしました。pipでもインストールできるようですが、今回はGitHubのリポジトリをクローンしてインストールしました。
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e .
または
pip install genesis-world
サンプルプログラムを試してみる
まだ公開されたばかりですが、Genesisを試している記事がいくつかありました。この記事では3つしか試していないので、詳しくは他の方の記事をご覧ください。
▼以下のページで、サンプルプログラムの実行結果が動画付きで見やすくまとめられていました。どんなことができるのかが分かりやすいです。
https://note.com/npaka/n/nb76d7cf5aae7
基本的なコード
▼以下のページを参考にしました。
https://genesis-world.readthedocs.io/ja/latest/user_guide/getting_started/hello_genesis.html
元々のプログラムはloopで処理していたのですが、すぐに終了していたのでwhileに変更しています。
# https://genesis-world.readthedocs.io/ja/latest/user_guide/getting_started/hello_genesis.html
import genesis as gs
gs.init(backend=gs.cpu)
scene = gs.Scene(show_viewer=True)
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
scene.build()
while True:
scene.step()
▼実行が始まりました。

▼ロボットアームが表示されました。重力の影響を受けています。

▼Iキーを入力すると、キーが表示されました。マウス操作でカメラの視点を変更することもできました。

ビジュアライゼーション
▼以下のページを参考にしました。
https://genesis-world.readthedocs.io/ja/latest/user_guide/getting_started/visualization.html
ページにあったサンプルプログラムを実行後、video.mp4として結果が保存されていました。
▼カメラが回転しながら撮影が行われています。
以下のように、プログラムのパラメータを変更して実行してみました。
# https://genesis-world.readthedocs.io/ja/latest/user_guide/getting_started/visualization.html
import genesis as gs
gs.init(backend=gs.cpu)
scene = gs.Scene(
show_viewer = True,
viewer_options = gs.options.ViewerOptions(
res = (1280, 960),
camera_pos = (3.5, 0.0, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 40,
max_FPS = 60,
),
vis_options = gs.options.VisOptions(
show_world_frame = False, # ワールド座標系のフレームを表示
world_frame_size = 1.0, # ワールドフレームの長さを1.0メートルに設定
show_link_frame = True, # リンクフレームは非表示
show_cameras = True, # カメラのメッシュと視錐体は非表示
plane_reflection = True, # 平面反射を有効化
ambient_light = (0.5, 0.5, 0.5), # 環境光を設定
),
renderer=gs.renderers.Rasterizer(), # ラスタライザを使用
)
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(file='xml/franka_emika_panda/panda.xml'),
)
cam = scene.add_camera(
res = (640, 480),
pos = (3.5, 0.0, 2.5),
lookat = (0, 0, 0.5),
fov = 30,
GUI = True,
)
scene.build()
# RGB、深度、セグメンテーションマスク、法線をレンダリング
rgb, depth, segmentation, normal = cam.render(rgb=True, depth=True, segmentation=True, normal=True)
cam.start_recording()
import numpy as np
for i in range(1000):
scene.step()
cam.set_pose(
pos = (3.0 * np.sin(i / 60), 3.0 * np.cos(i / 60), 2.5),
lookat = (0, 0, 0.5),
)
cam.render()
cam.stop_recording(save_to_filename='video.mp4', fps=60)
▼いろんなパターンで結果が表示されました。RGB、深度、セグメンテーションマスク、法線のレンダリングを有効化した影響です。

▼以前Intel Realsense D435で深度画像を撮影したときは、物体の輪郭が曖昧でした。深度カメラによって異なるとは思いますが、シミュレーションだときれいな画像になっていますね。

▼環境光や回転回数の変更、ワイヤフレームの表示などを変えてみました。
▼ROSでURDFファイルを読み込んだときと似ています。Genesisでxmlファイルを読み込んでいるので、同じように扱えそうです。

このサンプルの後にフォトリアリスティックなレイトレーシングレンダリングという項目があったのですが、Ubuntu環境での実行について書かれていました。Windowsで実行できるのかは不明で、WSL環境でまた試してみようかなと思います。Unreal Engineのような見た目でした。
強化学習を用いたドローンホバリングポリシーのトレーニング
▼以下のページを参考にしました。
https://genesis-world.readthedocs.io/ja/latest/user_guide/getting_started/hover_env.html
▼アイデアの元になったのは、こちらの論文らしいです。natureのサイトですね。
https://www.nature.com/articles/s41586-023-06419-4
▼以下のリポジトリを利用しています。
https://github.com/leggedrobotics/rsl_rl
以下のコマンドで必要なパッケージをインストールしました。
git clone https://github.com/leggedrobotics/rsl_rl
cd rsl_rl
git checkout v1.0.2
pip install -e .
pip install tensorboard
Genesisのサンプルプログラムを実行しました。なお、-vは可視化のオプションです。
cd ..
cd .\Genesis\examples\drone
python hover_train.py -e drone-hovering -B 8192 --max_iterations 300 -v
▼しばらくして、途中経過が出力されはじめました。

▼以下のようにドローンが動きました。
実行中に以下のコマンドでTensorBoardを起動しました。
tensorboard --logdir logs
▼ブラウザでhttp://localhost:6006にアクセスすると、データが表示されていました。

PCのスペックに依存するとは思いますが、起動と実行に時間がかかっていました。計算しながらシミュレーションを行うのは、負荷が大きいのだと思います。Unreal Engineでもオブジェクトが増えると処理が遅くなりがちです。
▼私は10万円ぐらいのゲーミングノートPCで処理しています。スペックが格別に高いPCというわけではありません。
▼最終的に7477.63sかかったようなので、2時間ぐらいですね。

▼データの見方はよく分かっていないのですが、Trainの項目で数値が増加する結果になっていました。

以下のコマンドで、トレーニング後の評価も行ってみました。
python hover_eval.py -e drone-hovering --ckpt 300 --record
▼シミュレーションの結果として保存された動画がこちら。
ドローンの飛び方がリアルですね。Unreal Engineにもこんな動きをするドローンのオブジェクトがあれば使いたいところです。
この動きが学習でできるようになったのであれば、まさにシミュレーションの理想的な使い方だと思います。
3Dシーンの自動生成について
テキストから3Dシーンを自動生成するデモが、Genesisの紹介ページやSNSでも紹介されていました。
▼こちらでも紹介されています。
ぜひ使ってみたかったのですが、現時点ではGitHubのコードにはまだ実装されていないようです。デモ動画の中にあったgs.generate()を実行しても、存在しないというエラーが出ていました。
GitHub上で検索してみたら他の方も気になっていたようで、まだ実装されていないという回答が返ってきていました。
▼こちらのissueで更新情報が発表されるそうです。
https://github.com/Genesis-Embodied-AI/Genesis/issues/6
今後に期待ですね。
最後に
まだ未実装の部分もあるようですが、開発が進んでデモ動画のようなことができるようになると、ロボットのシミュレーション開発に利用できそうです。
テキストから3D空間を生成するのは、他にもツールがありそうな気もするので、見つけたら試してみたいなと思っています。Unreal Engineで空間を作成するのがいつも大変です。
多軸のロボットアームについて、運動学の計算がPythonのコードで簡単にできるなら、ぜひ利用したいなと思っています。