跳至内容
人工智能
大语言模型

Genesis 物理引擎:逐步搭建 Genesis 的指南

了解如何在 Google Colab 上安装并运行 Genesis 物理引擎,克服安装难点,开启物理仿真之旅。
Dr Ana Rojo-Echeburúa's photo
Dr Ana Rojo-Echeburúa
已更新 · 12分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

去年,Genesis 发布,作为一个令人兴奋的新工具,它可以用来创建逼真的物理仿真、交互式 4D 世界等。我迫不及待想试试,但要让它跑起来并不容易。我得承认,在搭建过程中遇到了不少麻烦。 

在本教程中,我会简要分享遇到的问题,并展示我是如何借助 Google Colab 和一些小技巧最终让它运行起来的。

如果您只想了解 Genesis 的概览,请查看我之前的文章 Genesis 物理引擎:含示例的指南。

我最初的 Genesis 安装体验

刚开始使用 Genesis 时,我按照文档中的安装步骤操作。很快我就卡在了依赖问题上。Genesis 需要一个名为 Taichi 的模块的特定版本(1.7.x),但我的 macOS 并不支持。供您参考,我的 Mac 已经有 8 年机龄了……

经过一番查找,我发现其他用户也遇到了相同的问题,哪怕他们的电脑更好。花了好几个小时的功夫,并意识到 Genesis 只适配某些 Python 版本之后,我终于把它装上了。

但新问题又出现了。它无法渲染任何内容,我还遇到了多处 OpenGL 相关问题。即使尝试运行其 GitHub 上的示例文件,仍不断碰到报错和冲突。

等我以为已经搞定时,又开始报出类似 "uniform not found" 的错误,这意味着一些渲染设置缺失。

整个过程中,我不断在网上搜索看是否有人遇到相同问题。结果发现我并不孤单——很多人都面临同样的困境,而且不少人似乎没能找到让脚本顺利运行的解决方案。

我是如何让 Genesis 跑起来的:Google Colab 拯救一切

在最初的挫败之后,我决定尝试开通 Google Colab Pro,结果这正是我所需要的。借助 Colab 的 GPU 资源,我能够:

  • 毫无阻碍地安装所有所需依赖。
  • 使用 GPU 后端,获得优秀的性能和逼真的渲染效果。
  • 最终跑通基础示例并探索 Genesis 的潜力。

我选择了 NVIDIA A100-SXM4-40GB,事实证明它足够强大,能高效处理 Genesis 的仿真。

在配置好 Google Colab 环境并安装 Genesis 后,我尝试运行文档中最简单的示例:

import genesis as gs
gs.init(backend=gs.cpu)
scene = gs.Scene(show_viewer=True)

这个示例应当在 CPU 后端初始化 Genesis 并显示一个基础场景。然而,我立刻遇到了如下错误:

GenesisException: No display detected. Use show_viewer=False for headless mode.

错误信息表明 Genesis 正在尝试创建一个图形窗口来渲染场景,但 Google Colab 不支持实时可视化。Colab 运行在远程环境中,无法访问本地显示器,因此在初始化 gs.Scene() 时设置的 show_viewer=True 并不起作用。

按照错误提示,我修改代码以禁用查看器:

scene = gs.Scene(show_viewer=False)

这样脚本就能正常执行而不会崩溃了。不过,这样一来就无法直接可视化结果。

在网上搜索后,我发现其他人也遇到了相同问题。很多解决方案建议配置远程 OpenGL 环境,或者使用 Xvfb 创建虚拟显示器。不幸的是,我没能在 Colab 中可靠地跑通这些方法,大概是因为依赖冲突以及环境的限制。

这时我需要一个更实际可行的变通方案!

既然在 Colab 中无法进行实时渲染,我决定把渲染输出逐帧保存为图像。借助这些思路,我得以生成一系列图片,之后可以合成为动画。

实现与输出

本节我将带您走一遍代码实现以及我得到的输出。

设置 GPU 环境

首先,我安装了 Genesis:

pip install genesis-world

接着,我用 CUDA 后端进行初始化,以启用 GPU 加速。

import genesis as gs
gs.init(backend=gs.cuda)

这是我得到的输出:

[Genesis] [INFO] Running on [NVIDIA A100-SXM4-40GB] with backend gs.cuda. Device memory: 39.56 GB.
[Genesis] [INFO] 🚀 Genesis initialized. Version: 0.2.1, Seed: None, Precision: 32.

创建并构建场景

创建保存结果的目录

首先我需要一个文件夹,让 Genesis 可以将渲染的图像保存在其中。 

import os
save_dir = "/content/simulation_frames"
os.makedirs(save_dir, exist_ok=True)

os.makedirs() 会在指定路径下创建一个名为 simulation_frames 的文件夹,参数 exist_ok=True 则确保当文件夹已存在时不会抛出错误。

这样,我就有了一个专门用于保存仿真帧和输出的目录。

初始化场景

接下来,我需要创建一个可以添加并交互对象的场景。

scene = gs.Scene(show_viewer=False)

gs.Scene() 用于初始化一个新的仿真空间,而 show_viewer=False 会禁用实时可视化。此时,我已拥有一个空场景,准备在其上进行搭建。

添加一个平面和一个盒子

场景就绪后,我开始添加对象。首先添加一个平面,作为地面。

plane = scene.add_entity(gs.morphs.Plane())

这个平面充当仿真的平坦基底。默认情况下,它是无限大的,并沿 x-y 轴放置。

接着,我向场景中添加一个盒子:

box = scene.add_entity(
    gs.morphs.Box(
        pos=(0, 0, 0),        # Position of the box
        size=(0.5, 0.5, 0.5)  # Size of the box
    )
)

我将盒子放在 (0, 0, 0),也就是场景中心位置,并将其尺寸调整为 0.5(宽、高、深),比默认更小。

至此,我有了一个简单的设置:以平面为地面,盒子放置其上。

添加相机

为了捕捉场景中的变化,我添加了一个相机。

cam = scene.add_camera(
    res=(320, 240),       # Resolution: 320x240 pixels
    pos=(3.5, 2.0, 2.5),  # Camera position
    lookat=(0, 0, 0.5),   # Point the camera is focused on
    fov=30                # Field of view (in degrees)
)

我将图像分辨率设为 320x240 像素,便于测试;把相机摆在 (3.5, 2.0, 2.5),能从略高且侧的位置清晰看到场景。为确保盒子始终在焦点内,我将相机对准 (0, 0, 0.5),也就是盒子中心的上方。30 度的视场(FOV)带来较窄而聚焦的画面。

构建场景

下一步是构建场景,为仿真与渲染做准备。

scene.build()

这一步至关重要,因为 Genesis 使用即时编译(JIT)来优化仿真。我构建场景时,Genesis 会:

  • 为场景中的对象分配内存。
  • 为渲染和物理计算准备 GPU 内核。
  • 设置运行仿真所需的全部数据结构。

至此一切就绪——平面、盒子、相机均已设置好,场景也已构建完成。

渲染并保存输出

为了可视化仿真过程,我将输出逐帧渲染并保存。每一帧都会作为图像保存在 simulation_frames 目录中。 

from PIL import Image
import numpy as np

# Render and save images
for i in range(30):
    scene.step()  # Advance simulation
    if i % 5 == 0:  # Save every 5th frame
        print(f"Step {i}/30")
        rgb_data = cam.render(rgb=True)
        
        # Extract image data and save it
        img_array = rgb_data[0]
        img = Image.fromarray((img_array * 255).astype(np.uint8))
        img.save(f"{save_dir}/frame_{i:03d}.png")
        print(f"Frame {i} saved to {save_dir}")

在渲染过程中,我观察到前几帧的渲染速度很快(最高达 2,297 FPS),但随着仿进行进,性能下降。到第 25 帧时,FPS 最终降至约 0.33。原因可能是仿真的计算复杂度在增加,或较大场景下 GPU 资源受到限制。

这是我得到的输出:

[Genesis] [22:16:38] [INFO] Running at 2297.81 FPS.
INFO:genesis:Running at ~<2297.81>~ FPS.
Step 0/30
[Genesis] [22:16:56] [INFO] Running at 1.11 FPS.
INFO:genesis:Running at ~<1.11>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.17 FPS.
INFO:genesis:Running at ~<1.17>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.23 FPS.
INFO:genesis:Running at ~<1.23>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.29 FPS.
INFO:genesis:Running at ~<1.29>~ FPS.
[Genesis] [22:16:56] [INFO] Running at 1.36 FPS.
INFO:genesis:Running at ~<1.36>~ FPS.
Frame 0 saved to /content/simulation_frames
Step 5/30
[Genesis] [22:17:14] [INFO] Running at 0.63 FPS.
INFO:genesis:Running at ~<0.63>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.67 FPS.
INFO:genesis:Running at ~<0.67>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.70 FPS.
INFO:genesis:Running at ~<0.70>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.74 FPS.
INFO:genesis:Running at ~<0.74>~ FPS.
[Genesis] [22:17:14] [INFO] Running at 0.78 FPS.
INFO:genesis:Running at ~<0.78>~ FPS.
Frame 5 saved to /content/simulation_frames
Step 10/30
[Genesis] [22:17:32] [INFO] Running at 0.47 FPS.
INFO:genesis:Running at ~<0.47>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.50 FPS.
INFO:genesis:Running at ~<0.50>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.53 FPS.
INFO:genesis:Running at ~<0.53>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.55 FPS.
INFO:genesis:Running at ~<0.55>~ FPS.
[Genesis] [22:17:32] [INFO] Running at 0.58 FPS.
INFO:genesis:Running at ~<0.58>~ FPS.
Frame 10 saved to /content/simulation_frames
Step 15/30
[Genesis] [22:17:49] [INFO] Running at 0.40 FPS.
INFO:genesis:Running at ~<0.40>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.42 FPS.
INFO:genesis:Running at ~<0.42>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.44 FPS.
INFO:genesis:Running at ~<0.44>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.46 FPS.
INFO:genesis:Running at ~<0.46>~ FPS.
[Genesis] [22:17:49] [INFO] Running at 0.49 FPS.
INFO:genesis:Running at ~<0.49>~ FPS.
Frame 15 saved to /content/simulation_frames
Step 20/30
[Genesis] [22:18:07] [INFO] Running at 0.35 FPS.
INFO:genesis:Running at ~<0.35>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.37 FPS.
INFO:genesis:Running at ~<0.37>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.39 FPS.
INFO:genesis:Running at ~<0.39>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.41 FPS.
INFO:genesis:Running at ~<0.41>~ FPS.
[Genesis] [22:18:07] [INFO] Running at 0.43 FPS.
INFO:genesis:Running at ~<0.43>~ FPS.
Frame 20 saved to /content/simulation_frames
Step 25/30
[Genesis] [22:18:24] [INFO] Running at 0.33 FPS.
INFO:genesis:Running at ~<0.33>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.35 FPS.
INFO:genesis:Running at ~<0.35>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.36 FPS.
INFO:genesis:Running at ~<0.36>~ FPS.
[Genesis] [22:18:24] [INFO] Running at 0.38 FPS.
INFO:genesis:Running at ~<0.38>~ FPS.
Frame 25 saved to /content/simulation_frames

这些是我得到的图像:

帧 1

帧 2

帧 3

帧 4

帧 5

每张图像都展示了随着时间推移,盒子相对于平面的运动轨迹,从相机视角观测。仿真按步运行,每一步盒子的位置都会改变,因此看起来像盒子在移动。

这个示例突出了 Genesis 如何模拟并展示简单的物理交互。虽然设置很基础,但足以让您了解对象在场景中的行为。当然,您完全可以用 Genesis 创建更复杂、更逼真的场景!我们将在下一节探索其中的一些能力。

探索 Genesis:功能与特性

对象与场景创建

Genesis 允许您通过添加各种对象和变形体(morph)来创建复杂场景。对象既可以是平面、盒子、球体等简单图元,也可以是机器人、地形等更复杂的实体。

形状图元:

  • gs.morphs.Plane
  • gs.morphs.Box
  • gs.morphs.Cylinder
  • gs.morphs.Sphere

外部文件支持:

  • MJCF:gs.morphs.MJCF(用于 MuJoCo XML 机器人配置)。
  • URDF:gs.morphs.URDF(用于统一机器人描述格式文件)。
  • Mesh:gs.morphs.Mesh(用于 .obj、.ply、.stl、.glb、.gltf 等 3D 资源)。

Genesis 使用一种统一的“变形体(morph)”概念,封装几何与位姿信息。这种面向对象的设计使您可以通过方法直接与实体交互。

渲染与可视化

Genesis 的一大优势是能够借助高级相机功能生成精细的可视化输出。相机支持“无头模式”,也就是说无需显示屏即可生成图像。它们可以输出多种视觉效果,包括常规的彩色图像(RGB)、反映对象远近的深度图、标注场景不同部分的分割掩码,以及表示表面细节的法线图。

视频录制

您可以让相机自动记录仿真的每一帧来创建视频。录制过程中还可以移动相机,让视频更加动态、沉浸。

例如,您可以将相机设置为沿场景做圆周运动并捕捉画面。cam.start_recording() 用于开始录制,在仿真的每一步更新相机位置;所有帧捕获完成后,cam.stop_recording() 会将视频保存为 "video.mp4"。

最终的视频能以流畅的视角展现仿真过程,显示对象如何随时间交互与运动。

用于行走/运动任务的地形生成

您还可以为机器人与 AI 训练创建多种地形。可以使用其内置地形选项,或通过 gs.morphs.Terrain 提供自定义高程图来设计地形。这些地形非常适合测试和训练机器人运动,使 Genesis 成为机器人研究的有力工具。

可扩展性

您也可以从多方面自定义仿真。可以为对象添加逼真的纹理,使其更为生动。它还支持多种模型导入格式;若暂不支持某种格式,您可以提出添加请求。此外,您可以通过自定义文件与设置创建自己的对象形状(称为 morph)。

结语

本教程通过一个简单示例,帮助您上手 Genesis。我们覆盖了基础内容,如创建场景、添加对象、渲染输出,以展示这个强大物理引擎的工作方式。

不过,这只是 Genesis 能力的起点。只要硬件到位,如强劲的 GPU 和充足的内存,可能性非常多。您可以用于复杂的机器人仿真,或为 AI 训练创建高质量数据集。尽管搭建过程可能有些棘手,但它的潜力确实巨大!


Dr Ana Rojo-Echeburúa's photo
Author
Dr Ana Rojo-Echeburúa
LinkedIn
Twitter

Ana Rojo Echeburúa 是一位人工智能与数据专家,拥有应用数学博士学位。她热衷于将数据转化为可执行的洞见,并在带领技术团队方面拥有丰富经验。Ana 喜欢与客户密切合作,解决其业务难题并打造创新的 AI 解决方案。她以出色的问题解决能力和清晰的沟通著称,对人工智能,尤其是生成式 AI 充满热情。Ana 致力于持续学习与负责任的 AI 开发,同时专注于简化复杂问题,并以通俗易懂的方式解释技术。

主题
人工智能
大语言模型

用这些课程学习 AI!

学习路径

Llama 基础知识

4 小时
使用 Llama 3 对预训练模型进行推理,在自定义数据集上进行微调,并优化性能。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多