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
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 的基本使用流程。
代碼實現
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
AI代碼解釋
gs.init(backend=gs.cpu)
gs.init() 用於初始化 Genesis 環境。backend 參數指定計算後端:
gs.cpu:使用 CPU 計算(適用於所有平台)gs.gpu:使用 NVIDIA GPU(需要 CUDA)gs.vulkan:使用 Vulkan 後端(適用於 AMD GPU)
2. 創建場景
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. 添加實體
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. 構建場景
AI代碼解釋
scene.build()
在添加完所有實體後,必須調用 build()。這一步會編譯底層的計算圖,準備物理引擎所需的數據結構。這是關鍵步驟,忘記調用會導致錯誤。
5. 自動調整位置
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. 仿真循環
AI代碼解釋
while True:
scene.step()
time.sleep(0.01)
scene.step() 推進仿真一步,計算物理狀態並更新渲染。time.sleep(0.01) 控制循環頻率,避免佔用過多 CPU 資源。
使用方法
保存上述代碼為 urdf_viewer.py,然後在命令行中運行:
AI代碼解釋
python3 urdf_viewer.py path/to/your/robot.urdf
例如,如果您有 宇樹機器人G1 的 URDF 文件:
AI代碼解釋
python3 urdf_viewer.py g1_29dof.urdf
運行後會彈出一個 3D 窗口,顯示加載的機器人模型。您可以通過鼠標交互來旋轉、縮放和平移視角。
性能優化建議
- 使用 GPU 後端:如果有 NVIDIA GPU,使用
gs.gpu可以顯著提升性能 - 批量仿真:Genesis 支持批量仿真,可以同時運行多個場景
- 減少渲染頻率:如果不需要實時可視化,可以設置
show_viewer=False並手動控制渲染