1. USD

USD 是 Isaac Sim 文件的数据格式,诸如 .obj 或者 .glb 等内容相似,只不过其管理了更多的内容,包括光照、物理等属性,换句话说,事实上 USD 里保存 Prim 的结构以及全部的属性信息。

USD 在 GenManip 项目中的实际作用:

  • 场景模板——预构建的静态世界

    GenManip 运行加载预先制作好 USD 场景文件 ,直接生成仿真数据

  • 物体库——独立的 USD 资产

  • 机器人模型——USD 中的 Articulation

    机器人的 URDF 模型会被转换为 USD 格式,在 USD 中表现为 Articulation (铰接体):一种带有关节层级结构的 Prim,例如 Franka 机器人。

USD 文件的三种格式

格式 特点 使用场景
.usda 纯文本(ASCII),人类可读 开发调试、版本管理、GenManip 场景模板
.usdc 二进制,体积小,加载快 发布、大规模场景
.usd 可以是文本或二进制,不可读 场景组装入口

Genmanip框架中:场景文件格式是.usda,资产文件格式是.usd

添加 USD

在 Isaac Sim 中,每一次的程序运行会打开某种实例,从意义的角度来说,可以称之为 Scene,也就是一个场景,而从定义上来说,我们称为一个 Stage。

把物体注册为一个 prim 并且添加到 Stage 中

from omni.isaac.core.prims import XFormPrim
from omni.isaac.core.utils.stage import add_reference_to_stage

def add_usd_to_world(
    asset_path: str,
    prim_path: str,
    name: str,
    translation: Optional[Sequence[float]] = None,
    orientation: Optional[Sequence[float]] = None,
    scale: Optional[Sequence[float]] = None,
):
    reference = add_reference_to_stage(usd_path=asset_path, prim_path=prim_path)
    prim_path = str(reference.GetPrimPath())
    prim = XFormPrim(
        prim_path,
        name=name,
        translation=translation,
        orientation=orientation,
        scale=scale,
    )
    usd_prim = prim.prim
    if not usd_prim.IsValid():
        print(f"Prim at path {prim_path} is not valid.")
        return prim

通过 add_reference_to_stage 来将 物体USD 添加到 Stage 中,路径是prim_path

2. Prim

概念: Prim 是 USD 中的 基本单元 ,可以说:在 Isaac Sim 中,万物皆 Prim。Isaac Sim 的本质是对于物理世界的模拟,其中的关键在于模拟物理世界中的各种元素,例如物体、光照、纹理等,这些东西都可以用 Prim 来替代,并且进一步延伸XFormPrim、RigidPrim 或者 Shader。Prim 可以有各种属性(位置、缩放、材质等),也可以有子 Prim

常见的 Prim 类型:

  • XFormPrim :带有变换(位置、旋转、缩放)的基础 Prim,作为其他 Prim 的 父节点 ,定义局部坐标系
  • Mesh:带有几何网格的 Prim
  • Light:光源
  • Camera:相机
  • Material: 材质

注意:在 USD 中,并不是所有 Prim 都有 “位置、旋转、缩放” 这些空间属(例如,Material: 材质)。USD 本身提供的是 C++ 层面的底层 API,直接操作起来比较繁琐,Isaac Sim 的 XFormPrim 继承自 Prim 基类,在此基础上专门增加了空间变换相关的方法,把这些底层操作包装成了 Python 友好的接口

prim_path

一个 Stage 下面包括若干的 Prim,这些 Prim 以树状结构组织,每一个 Prim 作为一个结点,因此对于任何一个 Prim,可以使用其递归父结点的名称来表示其路径,例如 /World/_base/robot3 表示的是在 World 下面的_base的robot3机器人

在 Isaac Sim 中,所有的 Prim 的 prim_path 都是唯一的,因此可以通过 prim_path 来访问任何一个 Prim

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐