見出し画像

Genesis 入門 (1) - 事始め

「Mac」で「Genesis」の「Hello, 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/activate

2-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 pyrender

2-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

アームがロードされ、床に自由落下します。

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.5

3-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

次回



いいなと思ったら応援しよう!