Genesis-Embodied-AI/Genesis

⭐ 25,681 🍴 2,310 Python📄 Apache License 2.0 GitHubで見る →

主な特徴

  • **超高速**: RTX 4090で最大4300万FPS(リアルタイムの43万倍)
  • **クロスプラットフォーム**: Linux、macOS、Windows対応
  • **多様な物理ソルバー**: 剛体、MPM、SPH、FEM、PBD、Stable Fluid
  • **幅広い材料モデル**: 剛体、液体、気体、変形体、薄殻物体、粒状材料
  • **フォトリアリスティックレンダリング**: レイトレーシングベース
  • **微分可能性**: MPMとToolソルバーが微分可能
  • **マルチレベル時間ステップ**: ステップとサブステップの階層構造
  • **統一API**: 各種ロボットフォーマット(MJCF、URDF、USDA)のサポート

リポジトリ解析: Genesis-Embodied-AI/Genesis

基本情報

  • リポジトリ名: Genesis-Embodied-AI/Genesis
  • 主要言語: Python
  • スター数: 25,681
  • フォーク数: 2,310
  • 最終更新: 活発にメンテナンス中(v0.2.1リリース済み)
  • ライセンス: Apache License 2.0
  • トピックス: physics-simulation, robotics, embodied-ai, differentiable-simulation, computer-graphics, taichi

概要

一言で言うと

ロボティクスと身体化AI学習のための汎用的な生成的世界を提供する、高速かつ多様な物理シミュレーションプラットフォーム。

詳細説明

Genesisは、ロボティクス、身体化AI、物理AIアプリケーション向けに設計された汎用物理シミュレーションプラットフォームです。Taichiをバックエンドとして使用し、CPUやGPU上で高速に動作します。剛体、液体、気体、変形体、薄殻物体、粒状材料など、幅広い材料と現象をシミュレートでき、異なる物理ソルバー間の統合も可能です。

主な特徴

  • 超高速: RTX 4090で最大4300万FPS(リアルタイムの43万倍)
  • クロスプラットフォーム: Linux、macOS、Windows対応
  • 多様な物理ソルバー: 剛体、MPM、SPH、FEM、PBD、Stable Fluid
  • 幅広い材料モデル: 剛体、液体、気体、変形体、薄殻物体、粒状材料
  • フォトリアリスティックレンダリング: レイトレーシングベース
  • 微分可能性: MPMとToolソルバーが微分可能
  • マルチレベル時間ステップ: ステップとサブステップの階層構造
  • 統一API: 各種ロボットフォーマット(MJCF、URDF、USDA)のサポート

使用方法

インストール

前提条件

  • Python 3.10 - 3.12(Python 3.13はまだサポートされていません)
  • Linux、macOS、またはWindows
  • GPU推奨(CPUでも動作可能ですが遅い)

インストール手順

# 方法1: pip経由(推奨)
pip install genesis-world

# 方法2: ソースからビルド
git clone https://github.com/Genesis-Embodied-AI/Genesis.git
cd Genesis
pip install -e .

基本的な使い方

Hello World相当の例

import genesis as gs

# バックエンドをGPUに設定(CPU、デフォルト)
gs.init(backend=gs.gpu)

# シーン作成
scene = gs.Scene()

# 平面とキューブを追加
plane = scene.add_entity(gs.morphs.Plane())
cube = scene.add_entity(
    gs.morphs.Box(pos=(0, 0, 1), size=(0.2, 0.2, 0.2))
)

# シーンをビルド
scene.build()

# シミュレーション実行
for i in range(1000):
    scene.step()

実践的な使用例

import genesis as gs

gs.init(backend=gs.cuda)

# ロボットを含むシーン
scene = gs.Scene(show_viewer=True)  # ビューア表示

# 平面とFrankaロボットを追加
plane = scene.add_entity(gs.morphs.Plane())
franka = scene.add_entity(
    gs.morphs.MJCF(file="xml/franka_emika_panda/panda.xml")
)

scene.build()

# ロボット制御
for i in range(1000):
    if i < 500:
        # 最初の500ステップは位置制御
        franka.set_dofs_position(
            [0, -0.785, 0, -2.356, 0, 1.571, 0.785, 0.04, 0.04]
        )
    else:
        # 次の500ステップはトルク制御
        franka.control_dofs_force([0, 0, 0, 0, 0, 0, 0, 0.1, 0.1])
    
    scene.step()

高度な使い方

import genesis as gs
import numpy as np

# MPMソルバーで液体シミュレーション
gs.init(backend=gs.cuda)

scene = gs.Scene(
    sim_options=gs.options.SimOptions(
        dt=5e-4,
        substeps=1,
    ),
    mpm_options=gs.options.MPMOptions(
        dt=1e-4,
        substeps=5,
    ),
    viewer_options=gs.options.ViewerOptions(
        camera_pos=(3.5, 0.0, 2.5),
        camera_lookat=(0.0, 0.0, 0.5),
        camera_fov=40,
    ),
)

# 器を追加
scene.add_entity(
    gs.morphs.Mesh(
        file="meshes/container.obj",
        convex=True,
        material=gs.materials.Rigid(rho=1000),
    )
)

# 液体を追加
liquid = scene.add_entity(
    gs.morphs.Box(
        material=gs.materials.MPM.Liquid(),
        pos=(0.0, 0.0, 1.0),
        size=(0.5, 0.5, 0.5),
    )
)

# SPHと剛体の結合シミュレーションも可能
# scene.add_entity(
#     gs.morphs.Box(
#         material=gs.materials.SPH.Liquid(),
#         ...
#     )
# )

scene.build()

# シミュレーション実行
for i in range(2000):
    scene.step()

ドキュメント・リソース

公式ドキュメント

  • README.md: プロジェクト概要、クイックスタート、基本アーキテクチャ
  • GitHub Wiki: 詳細なドキュメントとチュートリアル
  • Discordサーバー: コミュニティサポートと議論
  • GitHub Discussions: Q&Aフォーラム

サンプル・デモ

  • examples/tutorials/: 基本チュートリアル
    • hello_genesis.py: 最もシンプルな例
    • control_your_robot.py: ロボット制御の基本
    • parallel_simulation.py: 並列シミュレーション
    • batched_IK.py: バッチ逆運動学
  • examples/coupling/: ソルバー結合例
    • sph_rigid.py: SPH液体と剛体
    • cloth_on_rigid.py: 布と剛体
    • water_wheel.py: 水車シミュレーション
  • examples/rigid/: 剛体ロボット例
    • ik_franka.py: FrankaロボットのIK
    • control_franka.py: Franka制御
    • suction_cup.py: 吸着カップグリッパー
  • examples/locomotion/: 歩行ロボット
    • go2_train.py: Go2の強化学習
    • go2_eval.py: 訓練済みモデルの評価
    • go2_backflip.py: バックフリップ動作

チュートリアル・ガイド

  • 基本チュートリアル(examples/tutorials/)
  • GitHub Wikiの詳細ガイド
  • Discordのチュートリアルチャンネル
  • YouTubeVideoデモ(プロジェクトページにリンク)

技術的詳細

アーキテクチャ

全体構造

Genesisはモジュラーな設計で、異なる物理ソルバーを統一的なAPIで管理し、ソルバー間の結合をCouplerシステムで実現。Taichiをバックエンドとして使用し、CPU/GPU上で高速並列計算を実行。

ディレクトリ構成

Genesis/
├── genesis/              # コアライブラリ
│   ├── engine/         # シミュレーションエンジン
│   │   ├── simulator.py  # メインシミュレーター
│   │   ├── scene.py      # シーン管理
│   │   ├── coupler.py    # ソルバー間結合
│   │   └── bvh.py        # BVH衝突検出
│   ├── solvers/        # 各物理ソルバー
│   │   ├── rigid/        # 剛体力学
│   │   ├── mpm/          # Material Point Method
│   │   ├── sph/          # Smoothed Particle Hydrodynamics
│   │   ├── fem/          # 有限要素法
│   │   ├── pbd/          # Position Based Dynamics
│   │   └── sf/           # Stable Fluids
│   ├── materials/      # 材料定義
│   ├── morphs/         # ジオメトリプリミティブ
│   ├── vis/            # ビジュアライゼーション
│   ├── grad/           # 微分機能
│   └── utils/          # ユーティリティ
├── examples/            # サンプルコード
│   ├── tutorials/      # 基本チュートリアル
│   ├── coupling/       # ソルバー結合例
│   ├── rigid/          # 剛体ロボット
│   ├── locomotion/     # 歩行ロボット
│   ├── drone/          # ドローン制御
│   └── rendering/      # レンダリングデモ
└── tests/               # テストスイート

主要コンポーネント

  • Simulator: メインシミュレーションエンジン

    • 場所: genesis/engine/simulator.py
    • 依存: 各ソルバー、Coupler、Scene
    • インターフェース: step(), add_solver(), set_viewer_fn()
  • Scene: シーン管理システム

    • 場所: genesis/engine/scene.py
    • 依存: Simulator、Entity、Camera
    • インターフェース: add_entity(), build(), step()
  • Coupler: ソルバー間結合システム

    • 場所: genesis/engine/coupler.py
    • 依存: 各ソルバー、BVH
    • インターフェース: couple(), detect_collision()
  • RigidSolver: 剛体力学ソルバー

    • 場所: genesis/solvers/rigid/
    • 依存: Taichi、PhysX (オプション)
    • インターフェース: step(), add_link(), set_dofs_position()
  • MPMSolver: Material Point Methodソルバー

    • 場所: genesis/solvers/mpm/
    • 依存: Taichi
    • インターフェース: step(), add_particles(), compute_gradients()

技術スタック

コア技術

  • 言語: Python 3.10-3.12(型ヒント、async/await使用)
  • フレームワーク:
    • Taichi: 高性能並列計算バックエンド
    • PyTorch: テンソル演算と自動微分
  • 主要ライブラリ:
    • taichi (1.7.0+): GPU/CPU並列計算
    • torch (2.0.0+): テンソル演算、自動微分
    • numpy: 配列演算
    • trimesh: 3Dメッシュ処理
    • mujoco: ロボットモデル読み込み
    • opencv-python: 画像処理
    • matplotlib: プロット
    • tqdm: 進捗表示

開発・運用ツール

  • ビルドツール: setuptools、pyproject.toml
  • テスト: pytestベースのテストスイート
  • レンダリング:
    • LuisaRender: レイトレーシング
    • PyRender: OpenGLベース
    • Matplotlib: 2Dプロット
  • パフォーマンス: Taichiのプロファイラー、ベンチマークスクリプト

設計パターン・手法

  • モジュラー設計: 各ソルバーが独立したモジュールとして実装
  • Entity-Componentシステム: ジオメトリ、材料、制御を分離
  • マルチレベル時間ステップ: 異なる時間スケールの物理現象を効率的に処理
  • ビジターパターン: レンダラーの柔軟な切り替え
  • ファクトリーパターン: エンティティとマテリアルの生成

データフロー・処理フロー

  1. 初期化フェーズ

    • バックエンド選択(CPU/CUDA/Metal)
    • シーン作成とオプション設定
    • エンティティ追加(ジオメトリ + マテリアル)
  2. ビルドフェーズ

    • ソルバーの自動選択と初期化
    • メモリアロケーション
    • BVH構築(衝突検出用)
    • レンダラー初期化
  3. シミュレーションループ

    • サブステップ処理(各ソルバー独立)
    • 衝突検出(BVHベース)
    • ソルバー間結合(Coupler経由)
    • 次ステップへの更新
  4. レンダリング/出力

    • ビューア更新(インタラクティブ)
    • データ収集(状態、力、速度等)
    • 画像/動画出力

API・インターフェース

公開API

Scene API

  • 目的: シミュレーション環境の構築と管理
  • 使用例:
scene = gs.Scene(
    sim_options=gs.options.SimOptions(
        dt=1/60,              # タイムステップ
        substeps=10,          # サブステップ数
        gravity=(0, 0, -9.8), # 重力
    ),
    viewer_options=gs.options.ViewerOptions(
        camera_pos=(3, 3, 3),
        camera_lookat=(0, 0, 0),
        camera_fov=40,
    ),
)

# エンティティ追加
entity = scene.add_entity(
    gs.morphs.URDF(file="robot.urdf", pos=(0, 0, 1))
)

# ビルドとシミュレーション
scene.build()
scene.step()

設定・カスタマイズ

設定オプション

# シミュレーションオプション
gs.options.SimOptions(
    dt=1/60,                  # タイムステップ
    substeps=10,              # サブステップ
    gravity=(0, 0, -9.8),     # 重力ベクトル
    requires_grad=False,       # 微分可能性
)

# ソルバー固有オプション
gs.options.RigidOptions(
    dt=1/60,
    constraint_solver="TGS",  # PGS, TGS, NGS
    enable_collision=True,
    enable_self_collision=False,
)

gs.options.MPMOptions(
    dt=1e-4,
    substeps=5,
    grid_density=128,         # グリッド解像度
)

拡張・プラグイン開発

新しいマテリアルを追加する場合:

  1. genesis/materials/に新しいマテリアルクラスを作成
  2. 基底クラスMaterialを継承
  3. 必要なパラメータと挙動を実装

新しいソルバーを追加する場合:

  1. genesis/solvers/に新しいソルバーディレクトリを作成
  2. 基底クラスSolverを継承
  3. step()add_entity()等のメソッドを実装
  4. Simulatorに登録

パフォーマンス・スケーラビリティ

パフォーマンス特性

  • ベンチマーク結果:
    • RTX 4090: 最大4300万FPS(リアルタイムの43万倍)
    • 10万体の剛体シミュレーション
    • 1000万パーティクルMPMシミュレーション
  • 最適化手法:
    • TaichiのJITコンパイル
    • GPU並列化
    • メモリコアレッシング
    • スパースデータ構造

スケーラビリティ

  • 並列シミュレーション: 複数シーンの同時実行
  • バッチ処理: 強化学習向けの大量環境
  • GPUスケーリング: マルチGPUサポート
  • メモリ効率: スパース表現でメモリ使用量削減

制限事項

  • 技術的な制限:
    • Python 3.13は未サポート
    • 微分可能なのはMPMとToolソルバーのみ
    • Windowsでの一部機能制限
    • レイトレーシングはリアルタイムではない
  • 運用上の制限:
    • 大規模シミュレーションにはGPU必須
    • メモリ使用量がGPU VRAMに依存
    • ソルバー結合時のパフォーマンス低下

評価・所感

技術的評価

強み

  • 圧倒的な速度: 他の物理シミュレータと比較して桁違いの高速性
  • 統一API: 異なる物理ソルバーを同じインターフェースで使用可能
  • 簡潔なコード: 複雑なシミュレーションも数十行で実装可能
  • 幅広い材料モデル: 剛体から液体、布まで多様な材料をサポート
  • アクティブな開発: 頻繁なアップデートとコミュニティサポート

改善の余地

  • ドキュメント: まだ発展途上で、詳細なAPIドキュメントが不足
  • 微分機能: 現在一部のソルバーのみ対応
  • レンダリング速度: シミュレーションに比べてレンダリングが遅い
  • エコシステム: PyBulletやMuJoCoに比べてツールチェーンが未成熟

向いている用途

  • ロボティクス研究: 高速シミュレーションによる効率的な学習
  • 強化学習: 大量の並列環境での高速学習
  • マルチフィジックスシミュレーション: 複数の材料が相互作用する複雑なシーン
  • プロトタイピング: 素早くアイデアを検証

向いていない用途

  • プロダクションゲーム: まだ安定性が不足
  • 精密な物理シミュレーション: 完全な物理的正確さより速度を優先
  • リアルタイムレンダリング: レイトレーシングが遅い

総評

Genesisは、ロボティクスと身体化AI研究に革命をもたらす可能性を持つ画期的なプロジェクトです。その圧倒的な速度と簡潔なAPIは、研究者が複雑な物理シミュレーションを簡単に実装し、大規模な実験を行うことを可能にします。まだ発展途上であることは事実ですが、活発な開発とコミュニティのサポートにより、今後の成長が期待されます。特に、「物理シミュレーションの民主化」というビジョンは、AIとロボティクスの融合が進む現代において非常に重要な意味を持ちます。