Genesis 是一个面向通用机器人学和具身人工智能(Embodied AI)的高性能物理仿真引擎。它由 Genesis-Embodied-AI 团队开发,旨在为机器人学习、物理AI应用提供强大的仿真环境。Genesis 集成了多种物理求解器,支持刚体、可变形物体、流体等多种材料模型的仿真,并提供了直观的 Python API 接口。

Genesis 在性能方面表现卓越。根据官方数据,在单个 RTX 4090 显卡上模拟 Franka 机械臂时,仿真速度可达每秒 4300 万帧,比实时快 43 万倍。这使得 Genesis 特别适合需要大量仿真数据的强化学习和机器人学习任务。
Genesis 集成了多种物理求解器,包括:
Genesis 支持多种机器人描述文件格式:
Genesis 内置基于光线追踪的渲染功能,能够提供照片级真实感的视觉效果,这对于视觉引导的机器人学习任务尤为重要。
Genesis 支持可微分物理仿真,这意味着可以通过梯度反向传播来优化控制策略和物理参数。目前支持 MPM 求解器和工具求解器的可微分计算,其他求解器的可微分支持正在开发中。
Genesis 需要 Python 3.10 或更高版本(但低于 3.14)。首先需要安装 PyTorch,请按照 PyTorch 官方文档 的指引进行安装。
pip3 install genesis-world在深入代码示例之前,让我们先了解 Genesis 的几个核心概念:
Scene 是 Genesis 中所有物理实体的容器。所有的物体、机器人、环境元素都需要添加到场景中。场景负责管理物理仿真和渲染。
实体是场景中的物理对象,可以是机器人、刚体、可变形物体等。通过 scene.add_entity() 方法添加实体。
morphs 是 Genesis 中用于创建不同类型实体的模块。例如:
gs.morphs.URDF():加载 URDF 格式的机器人gs.morphs.MJCF():加载 MJCF 格式的模型gs.morphs.Plane():创建平面(地面)gs.morphs.Box():创建立方体gs.morphs.Sphere():创建球体仿真通过 scene.step() 方法推进。每次调用 step() 会计算下一帧的物理状态(位置、速度、碰撞等)并刷新渲染。
下面我们通过一个完整的示例来演示如何使用 Genesis 加载和可视化 URDF 文件。这个示例展示了 Genesis 的基本使用流程。
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()让我们逐步分析这个示例的关键部分:
gs.init(backend=gs.cpu)gs.init() 用于初始化 Genesis 环境。backend 参数指定计算后端:
gs.cpu:使用 CPU 计算(适用于所有平台)gs.gpu:使用 NVIDIA GPU(需要 CUDA)gs.vulkan:使用 Vulkan 后端(适用于 AMD GPU)scene = gs.Scene(
show_viewer=True,
sim_options=gs.options.SimOptions(
gravity=(0, 0, 0) # 关闭重力
)
)Scene 是仿真的核心容器。show_viewer=True 会打开一个 3D 可视化窗口。SimOptions 允许我们配置仿真参数,这里将重力设置为 (0, 0, 0) 以保持机器人静止。
scene.add_entity(gs.morphs.Plane()) # 添加地面
robot = scene.add_entity(gs.morphs.URDF(file=args.urdf_path, fixed=True))Plane() 创建一个无限大的平面作为地面URDF() 加载 URDF 文件,fixed=True 将机器人基座固定在世界坐标系中scene.build()在添加完所有实体后,必须调用 build()。这一步会编译底层的计算图,准备物理引擎所需的数据结构。这是关键步骤,忘记调用会导致错误。
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),如果机器人的最低点在地面以下,则自动抬高机器人,确保其完全在地面以上。
while True:
scene.step()
time.sleep(0.01)scene.step() 推进仿真一步,计算物理状态并更新渲染。time.sleep(0.01) 控制循环频率,避免占用过多 CPU 资源。
保存上述代码为 urdf_viewer.py,然后在命令行中运行:
python3 urdf_viewer.py path/to/your/robot.urdf例如,如果您有 宇树机器人G1 的 URDF 文件:
python3 urdf_viewer.py g1_29dof.urdf运行后会弹出一个 3D 窗口,显示加载的机器人模型。您可以通过鼠标交互来旋转、缩放和平移视角。

gs.gpu 可以显著提升性能show_viewer=False 并手动控制渲染原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。