Genesisを使ってみる その1(環境構築、サンプルプログラムの実行)

はじめに

 今回はGenesisという物理シミュレーションソフトウェアを試してみました。

 3か月ほど前に公開されたばかりで、デモ動画が面白そうでした。グラフィックはUnreal Engineのようにリアルで、ROSのように多軸のロボットアームをシミュレーション上で動かしていました。

▼面白そうなデモ動画がいろいろあります。

https://genesis-embodied-ai.github.io

 AI関連の技術とも組み合わせて使うことができ、Pythonで開発できるようです。

▼私はこれまで、Unreal EngineとROSをNode-REDでつないで、ロボットのデジタルツインのようなものを試していました。Genesisでどこまでできるのかが気になっています。

▼以前の記事はこちら

Unreal Engine 5を使ってみる その9(Remote Control API、Node-RED)

はじめに  以前HTTP Blueprintを使ってUnreal Engine 5(UE5)からNode-REDへの通信は試したのですが、今回はその逆です。  HTTP Remote Control APIを使ってNod [&hell…

WSL2を使ってみる その4(Ubuntu 16.04、ROS Kinetic、Open Manipulator)

はじめに  これまでWSL2にUbuntu 18.04、20.04、22.04をインストールして、ROS/ROS2の環境を構築しました。今回はUbuntu 16.04です。  オンラインドキュメントや書籍の…

環境を構築する

 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で実行できるように設定したときに、インストールを行いました。同じコマンドを実行しました。

YOLOで物体検出 その4(GPUの設定、CUDA 12.6)

はじめに  今回はGPUを利用したYOLOの物体検出を試してみました。  Ultralyticsのドキュメントではオプションで切り替えることができるようでしたが、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で深度画像を撮影したときは、物体の輪郭が曖昧でした。深度カメラによって異なるとは思いますが、シミュレーションだときれいな画像になっていますね。

YOLOで物体検出 その3(ROSとの連携、WSL2 Ubuntu 18.04)

はじめに  今回はWSL2のUbuntu18.04でYOLOとROSを連携させてみました。  実際にYOLOで物体を検出し、その検出した位置にロボットを動かすために使われていました。リア…

▼環境光や回転回数の変更、ワイヤフレームの表示などを変えてみました。

▼ROSでURDFファイルを読み込んだときと似ています。Genesisでxmlファイルを読み込んでいるので、同じように扱えそうです。

ROS1を使ってみる その4(URDFファイルの作成、Open Manipulator)

はじめに  今回はOpen ManipulatorのURDFファイルを作成してみました。  これまではROSですでに用意されていたOpen Manipulatorのモデルを利用していましたが、URDFファ…

 このサンプルの後にフォトリアリスティックなレイトレーシングレンダリングという項目があったのですが、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というわけではありません。

ちょっと買い物:新しいノートPCとSSDの増設

はじめに  今回はこれまで使っていたPCが壊れたので買い替えましたという話です。  以前はよく分からないGPUが載っていたノートPCを使っていたのですが、最近はUnreal E…

▼最終的に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のコードで簡単にできるなら、ぜひ利用したいなと思っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です