Genesis 是一個面向通用機器人學和具身人工智能(Embodied AI)的高性能物理仿真引擎。它由 Genesis-Embodied-AI 團隊開發,旨在為機器人學習、物理AI應用提供強大的仿真環境。Genesis 集成了多種物理求解器,支持剛體、可變形物體、流體等多種材料模型的仿真,並提供了直觀的 Python API 接口。

Genesis 核心特性

1. 高性能仿真

Genesis 在性能方面表現卓越。根據官方數據,在單個 RTX 4090 顯卡上模擬 Franka 機械臂時,仿真速度可達每秒 4300 萬幀,比實時快 43 萬倍。這使得 Genesis 特別適合需要大量仿真數據的強化學習和機器人學習任務。

2. 多物理求解器支持

Genesis 集成了多種物理求解器,包括:

  • 剛體動力學:用於模擬剛體機器人、機械臂等
  • MPM(Material Point Method):用於模擬可變形物體
  • SPH(Smoothed Particle Hydrodynamics):用於流體仿真
  • FEM(Finite Element Method):有限元方法
  • PBD(Position Based Dynamics):基於位置的動力學
  • 穩定流體:用於氣體和液體仿真

3. 廣泛的文件格式支持

Genesis 支持多種機器人描述文件格式:

  • URDF(Unified Robot Description Format):ROS 生態系統中的標準格式
  • MJCF(MuJoCo XML Format):MuJoCo 物理引擎的 XML 格式
  • 3D 模型格式:.obj、.glb、.ply、.stl 等

4. 跨平台與多後端支持

  • 操作系統:支持 Linux、macOS 和 Windows
  • 計算後端
  • CPU 後端:適用於所有平台
  • NVIDIA GPU:CUDA 加速
  • AMD GPU:支持 Vulkan 後端
  • Apple Metal:適用於 Apple Silicon 芯片

5. 高質量渲染

Genesis 內置基於光線追蹤的渲染功能,能夠提供照片級真實感的視覺效果,這對於視覺引導的機器人學習任務尤為重要。

6. 可微分設計

Genesis 支持可微分物理仿真,這意味着可以通過梯度反向傳播來優化控制策略和物理參數。目前支持 MPM 求解器和工具求解器的可微分計算,其他求解器的可微分支持正在開發中。

安裝指南

前置要求

Genesis 需要 Python 3.10 或更高版本(但低於 3.14)。首先需要安裝 PyTorch,請按照 PyTorch 官方文檔 的指引進行安裝。

安裝 Genesis

代碼語言:bash

AI代碼解釋

pip3 install genesis-world

核心概念

在深入代碼示例之前,讓我們先了解 Genesis 的幾個核心概念:

Scene(場景)

Scene 是 Genesis 中所有物理實體的容器。所有的物體、機器人、環境元素都需要添加到場景中。場景負責管理物理仿真和渲染。

Entity(實體)

實體是場景中的物理對象,可以是機器人、剛體、可變形物體等。通過 scene.add_entity() 方法添加實體。

Morphs(形態)

morphs 是 Genesis 中用於創建不同類型實體的模塊。例如:

  • gs.morphs.URDF():加載 URDF 格式的機器人
  • gs.morphs.MJCF():加載 MJCF 格式的模型
  • gs.morphs.Plane():創建平面(地面)
  • gs.morphs.Box():創建立方體
  • gs.morphs.Sphere():創建球體

仿真循環

仿真通過 scene.step() 方法推進。每次調用 step() 會計算下一幀的物理狀態(位置、速度、碰撞等)並刷新渲染。

實踐示例:URDF 查看器

下面我們通過一個完整的示例來演示如何使用 Genesis 加載和可視化 URDF 文件。這個示例展示了 Genesis 的基本使用流程。

代碼實現

代碼語言:python

AI代碼解釋

import time
import argparse
import genesis as gs


def main():
    # 1. 解析命令行參數
    # 使用 argparse 庫讓我們可以在運行腳本時傳入 URDF 文件的路徑。
    # 這樣做的好處是我們不需要每次修改代碼來查看不同的模型。
    parser = argparse.ArgumentParser(description="簡單的 Genesis URDF 查看器")
    parser.add_argument("urdf_path", type=str, help="URDF 文件的路徑")
    args = parser.parse_args()

    # 2. 初始化 Genesis 環境
    # backend=gs.gpu 指定使用 GPU 進行並行計算加速。
    # 如果沒有 NVIDIA GPU,可以嘗試改為 gs.cpu,但性能會受影響。
    gs.init(backend=gs.cpu)

    # 3. 創建場景 (Scene)
    # Scene 是 Genesis 中所有物理實體的容器。
    # show_viewer=True 會自動彈出一個 3D 窗口讓我們看到渲染結果。
    scene = gs.Scene(
        show_viewer=True,
        sim_options=gs.options.SimOptions(
            gravity=(0, 0, 0)  # 關閉重力,機器人將保持靜止
        )
    )

    # 4. 添加地面
    # Plane() 創建一個無限大的平面,通常作為地面使用。
    # 如果沒有地面,物體受重力影響會一直下墜。
    scene.add_entity(
        gs.morphs.Plane()
    )

    # 5. 加載 URDF 模型
    # URDF (Unified Robot Description Format) 是機器人常用的描述文件。
    try:
        robot = scene.add_entity(
            gs.morphs.URDF(
                file=args.urdf_path,
                fixed=True, # 將機器人的基座固定在世界座標系中,防止它倒下或移動
            )
        )
    except Exception as e:
        print(f"加載 URDF 失敗: {e}")
        return

    # 6. 構建場景
    # 在添加完所有實體後,必須調用 build()。
    # 這一步會編譯底層的計算圖,準備好物理引擎所需的數據結構。
    scene.build()

    # 7. 自動調整機器人高度,確保完全在地面以上
    # 獲取機器人的邊界框(最低點)
    aabb = robot.get_AABB()  # 獲取軸對齊邊界框 (Axis-Aligned Bounding Box)
    min_z = aabb[0][2]  # 邊界框最低點的 z 座標

    # 如果最低點在地面以下(z < 0),則抬高機器人
    if min_z < 0:
        current_pos = robot.get_pos()
        robot.set_pos((current_pos[0], current_pos[1], current_pos[2] - min_z + 0.01))
        print(f"機器人已自動抬高 {-min_z + 0.01:.3f} 米,確保完全在地面以上")

    print("查看器已啓動。關閉窗口即可退出。")
    
    # 8. 運行仿真循環
    # 這是一個無限循環,不斷推進物理世界的"時間"。
    # scene.step() 會計算下一幀的物理狀態(位置、速度、碰撞等)並刷新渲染。
    while True:
        scene.step()
        time.sleep(0.01)

if __name__ == "__main__":
    main()

代碼解析

讓我們逐步分析這個示例的關鍵部分:

1. 初始化 Genesis

代碼語言:python

AI代碼解釋

gs.init(backend=gs.cpu)

gs.init() 用於初始化 Genesis 環境。backend 參數指定計算後端:

  • gs.cpu:使用 CPU 計算(適用於所有平台)
  • gs.gpu:使用 NVIDIA GPU(需要 CUDA)
  • gs.vulkan:使用 Vulkan 後端(適用於 AMD GPU)

2. 創建場景

代碼語言:python

AI代碼解釋

scene = gs.Scene(
    show_viewer=True,
    sim_options=gs.options.SimOptions(
        gravity=(0, 0, 0)  # 關閉重力
    )
)

Scene 是仿真的核心容器。show_viewer=True 會打開一個 3D 可視化窗口。SimOptions 允許我們配置仿真參數,這裏將重力設置為 (0, 0, 0) 以保持機器人靜止。

3. 添加實體

代碼語言:python

AI代碼解釋

scene.add_entity(gs.morphs.Plane())  # 添加地面
robot = scene.add_entity(gs.morphs.URDF(file=args.urdf_path, fixed=True))
  • Plane() 創建一個無限大的平面作為地面
  • URDF() 加載 URDF 文件,fixed=True 將機器人基座固定在世界座標系中

4. 構建場景

代碼語言:python

AI代碼解釋

scene.build()

在添加完所有實體後,必須調用 build()。這一步會編譯底層的計算圖,準備物理引擎所需的數據結構這是關鍵步驟,忘記調用會導致錯誤。

5. 自動調整位置

代碼語言:python

AI代碼解釋

aabb = robot.get_AABB()
min_z = aabb[0][2]
if min_z < 0:
    current_pos = robot.get_pos()
    robot.set_pos((current_pos[0], current_pos[1], current_pos[2] - min_z + 0.01))

這段代碼獲取機器人的軸對齊邊界框(AABB),如果機器人的最低點在地面以下,則自動抬高機器人,確保其完全在地面以上。

6. 仿真循環

代碼語言:python

AI代碼解釋

while True:
    scene.step()
    time.sleep(0.01)

scene.step() 推進仿真一步,計算物理狀態並更新渲染。time.sleep(0.01) 控制循環頻率,避免佔用過多 CPU 資源。

使用方法

保存上述代碼為 urdf_viewer.py,然後在命令行中運行:

代碼語言:bash

AI代碼解釋

python3 urdf_viewer.py path/to/your/robot.urdf

例如,如果您有 宇樹機器人G1 的 URDF 文件:

代碼語言:bash

AI代碼解釋

python3 urdf_viewer.py g1_29dof.urdf

運行後會彈出一個 3D 窗口,顯示加載的機器人模型。您可以通過鼠標交互來旋轉、縮放和平移視角。

性能優化建議

  1. 使用 GPU 後端:如果有 NVIDIA GPU,使用 gs.gpu 可以顯著提升性能
  2. 批量仿真:Genesis 支持批量仿真,可以同時運行多個場景
  3. 減少渲染頻率:如果不需要實時可視化,可以設置 show_viewer=False 並手動控制渲染