# 📦 加载 USD 场景 Genesis 支持从 Universal Scene Description (USD) 文件加载复杂场景,使你能够导入具有正确物理属性和关节配置的铰接机器人、刚体对象和完整环境。USD 是由 Pixar 开发的开源框架,用于在 3D 世界中进行描述、合成、模拟和协作。 本教程将指导你在 Genesis 中加载 USD 文件、配置解析选项以及使用基于 USD 的场景。该解析器设计为与从 NVIDIA Isaac Sim 等流行工具导出的资源无缝协作,同时支持标准 USD 物理模式。 ## 安装 要将 USD 资源加载到 Genesis 场景中,请安装所需的依赖项: ```bash pip install -e .[usd] ``` ### 可选:USD 材质烘焙 对于超越 `UsdPreviewSurface` 的高级材质解析,你可以选择性安装 Omniverse Kit 进行 USD 材质烘焙。此功能仅适用于 Python 3.10 和 3.11 以及 GPU 后端。(对于 Python 3.12,场景中大部分材质可能成功烘焙,但有些会保持未烘焙状态。) ```bash pip install --extra-index-url https://pypi.nvidia.com/ omniverse-kit export OMNI_KIT_ACCEPT_EULA=yes ``` **注意:** 必须设置 `OMNI_KIT_ACCEPT_EULA` 环境变量以接受 EULA。这是一次性操作。一旦设置,将不会再次提示。如果禁用 USD 烘焙,Genesis 将仅解析 `UsdPreviewSurface` 类型的材质。 如果你遇到 Genesis 警告 "Baking process failed: ...",以下是一些故障排除提示: - **EULA 接受**:首次启动可能需要接受 Omniverse EULA。在运行时接受或设置 `OMNI_KIT_ACCEPT_EULA=yes` 自动接受。 - **IOMMU 警告**:首次启动时可能会弹出显示 "IOMMU Enabled" 警告的窗口。及时点击 "OK" 以避免超时。 - **初始安装**:首次启动可能会安装额外的依赖项,这可能导致超时。安装完成后再次运行你的程序;后续运行将不需要安装。 - **多个 Python 环境**:如果你有多个 Python 环境(特别是不同 Python 版本),Omniverse Kit 扩展可能会跨环境冲突。删除共享的 Omniverse 扩展文件夹(例如 Linux 上的 `~/.local/share/ov/data/ext`)然后重试。 ## 概述 Genesis 的 USD 解析器支持以下功能: ### 关节类型 - **旋转关节** (`UsdPhysics.RevoluteJoint`):具有角度限制的旋转关节 - **滑动关节** (`UsdPhysics.PrismaticJoint`):具有距离限制的线性/滑动关节 - **球形关节** (`UsdPhysics.SphericalJoint`):具有 3 个旋转自由度的球关节 - **固定关节** (`UsdPhysics.FixedJoint`):连杆之间的刚性连接 - **自由关节** (`UsdPhysics.Joint`,类型为 "PhysicsJoint"):具有完整平移和旋转自由度的 6-DOF 关节 ### 物理属性 - **关节限制**(下限/上限):支持旋转和滑动关节 - **关节摩擦** (`dofs_frictionloss`):支持旋转、滑动和球形关节 - **关节惯量** (`dofs_armature`):支持旋转、滑动和球形关节 - **关节刚度** (`dofs_stiffness`):支持旋转和滑动关节的被动属性 - **关节阻尼** (`dofs_damping`):支持旋转和滑动关节的被动属性 - **驱动 API** (`dofs_kp`, `dofs_kv`, `dofs_force_range`):支持旋转、滑动和球形关节的 PD 控制参数 ### 几何体 - **视觉几何体**:从匹配视觉模式的 USD 几何体 prim 解析 - **碰撞几何体**:从匹配碰撞模式的 USD 几何体 prim 解析 ### 材质与渲染 - **UsdPreviewSurface**:完全支持漫反射颜色、不透明度、金属度、粗糙度、自发光、法线贴图和 IOR - **材质烘焙**:通过 Omniverse Kit 可选支持超越 **UsdPreviewSurface** 的复杂材质 - **显示颜色**:当材质不可用时回退到 `displayColor` ## 基本示例 让我们从一个简单的示例开始,加载包含铰接对象的 USD 文件: ```python import genesis as gs from huggingface_hub import snapshot_download # 初始化 Genesis gs.init(backend=gs.cpu) # 创建场景 scene = gs.Scene( viewer_options=gs.options.ViewerOptions( camera_pos=(3.5, 0.0, 2.5), camera_lookat=(0.0, 0.0, 0.5), camera_fov=40, ), show_viewer=True, ) # 下载 USD 资源(Genesis 资源的示例) asset_path = snapshot_download( repo_type="dataset", repo_id="Genesis-Intelligence/assets", revision="c50bfe3e354e105b221ef4eb9a79504650709dd2", allow_patterns="usd/Refrigerator055/*", max_workers=1, ) # 加载 USD stage entities = scene.add_stage( morph=gs.morphs.USD( file=f"{asset_path}/usd/Refrigerator055/Refrigerator055.usd", ), ) # 构建并模拟 scene.build() ``` USD 文件可以在单个文件中包含多个刚体实体(关节体和刚体)。Genesis 提供两种加载 USD 的方法: - **`scene.add_stage()`**:自动发现并加载 USD 文件中的**所有**刚体实体。这是加载具有多个实体的完整 USD 场景的推荐方法。 - **`scene.add_entity()`**:从 USD 文件加载**单个**实体。如果未指定 `prim_path`,则使用 USD stage 的默认 prim。设置 `prim_path` 以定位 stage 中的特定 prim。 ## USD Morph 配置 `gs.morphs.USD` 类提供了广泛的配置选项来控制 USD 文件的解析方式: ### 关节动力学配置 Genesis 可以从 USD 属性解析关节属性。 由于某些关节物理属性不是 USD 标准的一部分,Genesis 提供了默认的属性名称候选,以适应成熟的导出器,特别是 Isaac Sim,它使用自定义属性如 `physxJoint:jointFriction` 和 `physxLimit:angular:stiffness`。 例如,以下代码配置关节摩擦的属性名称候选。解析器将按顺序尝试这些候选,并使用找到的第一个。 ```python gs.morphs.USD( file="robot.usd", # 关节摩擦属性(按顺序尝试) joint_friction_attr_candidates=[ "physxJoint:jointFriction", # Isaac Sim 兼容性 "physics:jointFriction", "jointFriction", "friction", ], ) ``` 支持的属性列在下表中: | Genesis 属性名称 | 来源 / 默认属性名称候选 | 描述 | |----------------|-------------|-------------| | `dofs_frictionloss` | `["physxJoint:jointFriction", "physics:jointFriction", "jointFriction", "friction"]` | 关节摩擦(被动属性) | | `dofs_armature` | `["physxJoint:armature", "physics:armature", "armature"]` | 关节惯量(被动属性) | | `dofs_kp` | `"physics:stiffness"` | PD 控制比例增益 (kp) - 来自 DriveAPI | | `dofs_kv` | `"physics:angular:damping"` | PD 控制微分增益 (kv) - 来自 DriveAPI | | `dofs_stiffness` | **旋转关节:** `["physxLimit:angular:stiffness", "physics:stiffness", "stiffness"]`
**滑动关节:** `["physxLimit:linear:stiffness", "physxLimit:X:stiffness", "physxLimit:Y:stiffness", "physxLimit:Z:stiffness", "physics:linear:stiffness", "linear:stiffness"]` | 被动关节刚度(取决于关节类型) | | `dofs_damping` | **旋转关节:** `["physxLimit:angular:damping", "physics:angular:damping", "angular:damping"]`
**滑动关节:** `["physxLimit:linear:damping", "physxLimit:X:damping", "physxLimit:Y:damping", "physxLimit:Z:damping", "physics:linear:damping", "linear:damping"]` | 被动关节阻尼(取决于关节类型) | 注意,方括号 (`[...]`) 内的属性名称是非官方的 USD 属性,用户可以设置自己的属性名称候选来自定义解析行为,而没有方括号 (`...`) 的属性名称是官方 USD 属性,直接从 USD 文件解析。 ### 几何体解析选项 Genesis 可以从 USD 文件解析碰撞和视觉几何体。你可以配置正则表达式模式来识别哪些 prim 应被视为仅碰撞或仅视觉几何体。解析器使用 `re.match()` 检查 prim 的名称是否从字符串开头匹配每个模式。 **识别规则:** 1. **模式匹配**:解析器递归遍历 prim 层次结构。对于每个 prim,它按顺序检查 prim 的名称是否匹配模式。一旦 prim 匹配模式,它就被标记为视觉匹配或碰撞匹配,该分类由其所有子 prim 递归继承。 2. **几何体分类**: - 匹配视觉模式的 prim 被视为仅视觉几何体(不用于碰撞检测)。 - 匹配碰撞模式的 prim 被视为仅碰撞几何体(不用于可视化)。 - 同时匹配两种模式的 prim 被视为视觉和碰撞几何体。 - 不匹配任何模式的 prim 也被视为视觉和碰撞几何体(这是仅网格 USD 资源的默认行为)。 3. **可见性和用途**:仅解析可见的 prim(未标记为 "invisible")。用途为 "guide" 的 prim 从视觉几何体中排除,但仍可以是碰撞几何体。 **配置示例:** ```python gs.morphs.USD( file="robot.usd", # 识别碰撞网格的正则表达式模式(按顺序尝试) collision_mesh_prim_patterns=[ r"^([cC]ollision).*", # 匹配以 "Collision" 或 "collision" 开头的 prim ], # 识别视觉网格的正则表达式模式 visual_mesh_prim_patterns=[ r"^([vV]isual).*", # 匹配以 "Visual" 或 "visual" 开头的 prim ], ) ``` **Stage 结构示例:** - **刚体上的直接几何体**:几何体 prim 本身不匹配任何模式,因此被视为视觉和碰撞几何体。 ```usd def Cube "Cube" ( prepend apiSchemas = ["PhysicsRigidBodyAPI"] ) { } ``` - **单独的视觉和碰撞子项**:匹配模式的直接子项被相应处理,匹配传播到其子树。 ```usd def Xform "ObjectA" ( prepend apiSchemas = ["PhysicsRigidBodyAPI"] ) { def Cube "Visual" # 匹配视觉模式 → 仅视觉 { } def Cube "Collision" # 匹配碰撞模式 → 仅碰撞 { } } ``` - **嵌套层次结构**:一旦父项匹配模式,所有后代继承该分类。 ```usd def Xform "ObjectB" ( prepend apiSchemas = ["PhysicsRigidBodyAPI"] ) { def Xform "Visual" # 匹配视觉模式 { def Mesh "Cube" # 继承仅视觉(整个子树) { } def Mesh "Sphere" # 继承仅视觉 { } } def Xform "Collision" # 匹配碰撞模式 { def Cube "Cube" # 继承仅碰撞(整个子树) { } } } ``` - **无模式匹配**:不匹配任何模式的 prim 被视为视觉和碰撞几何体。 ```usd def Xform "ObjectC" ( prepend apiSchemas = ["PhysicsRigidBodyAPI"] ) { def Mesh "Whatever" # 无模式匹配 → 视觉和碰撞 { } } ``` ## 下一步 - 了解如何在 Genesis 中[控制机器人](control_your_robot.md) - 探索 USD 加载机器人的[逆运动学](inverse_kinematics_motion_planning.md) - 查看[并行模拟](parallel_simulation.md)了解如何使用 USD 资源进行训练 - 参阅 [API 参考](../../api_reference/options/morph/file_morph/file_morph.md)了解详细的 USD morph 选项 - 参阅[约定](conventions.md)了解 Genesis 使用的坐标系和数学约定的更多详细信息。