模拟/建模/设计

借助 AI 智能体更快地开发轻量级 USD 运行时

OpenUSD 是一个开放、可扩展的框架,可为物理 AI 提供通用场景描述语言。它使团队能够将 CAD 数据、仿真资产和现实世界的遥测数据引入物理属性准确的共享世界视图中。

到目前为止,构建 USD 实现通常需要调整现有的大型代码库,即使对于需要特定内存占用、不同应用程序二进制接口 (ABI) 或不同性能特征的团队而言也是如此。nanousd-labs 提供了另一种途径:直接从标准中生成运行时。

这种方法之所以可行,是因为 USD 由正式的机器可读规范定义。USD 核心规范由 OpenUSD 联盟 (AOUSD) 开发,是版本化标准,定义了 USD 数据模型在各层堆栈中的构成和解析方式,详见 USD 核心规范

由于该规范是面向人类和智能体的精确合同,因此开发者可以指导智能体生成特定工作负载所需的内容。这种方法补充了调整现有代码库或手动实施规格,从而加快实施周期,并使最终用户的物理 AI 产品适合其部署环境。

nanousd-labs 作为 NVIDIA Omniverse Labs 的一部分发布,后者是一系列开放的实验性项目。它在内部编程马拉松期间构建,为开发者提供了一种使用 AI 智能体直接根据 USD Core 规范生成 USD 运行时的轻量级方式。本文将介绍开发者如何使用 AI 智能体和 USD 核心规范来生成有效的 USD 实现,将 nanousd-labs 作为该方法的真实示例,并为开发者在自己的物理 AI 项目中试用提供两个切入点。

AI 智能体如何根据 USD 核心规范进行构建?

nanousd-labs 方法基于将 USD 核心规范视为合同的单一理念。该规范定义了兼容的运行时必须产生的行为,而不是其构建方式。智能体不会修改现有的代码库,而是直接阅读规范,编写必须满足该行为的代码,并使用源自规范的测试套件验证输出。该标准经久耐用,生成的代码具有弹性。它旨在针对不同的约束条件 (例如内存、性能或语言) 重新生成,而不会失去合规性。

智能体在开发者的指导下工作,逐节使用规范,生成实现每种行为的代码,并根据源自同一标准的测试套件运行代码,不断迭代,直到输出符合规格要求。控制场景数据的结构、解决和覆盖方式的规则均以文本形式表示,供智能体应用并检查工作。这就是该方法切实可行的原因。该规范将成为合同开发者指导智能体构建和验证的规范,而非某人曾经读取并手动解释的文档。

由于实施是根据规范生成的,因此合规性内置于方法中,而不与任何单一实施绑定。其目标是让开发者针对不同的约束条件重新生成运行时,在不牺牲标准合规性的情况下根据工作负载进行调整。

在实践中,这种方法具有明确的界限。规格是输入数据,是否符合标准是成功的衡量标准。这并不意味着完全自动化生成,也不意味着目前涵盖了整个规范。在构建 nanousd-labs 的过程中,智能体处理从规格到代码的机械工作,包括解析、场景合成以及如何跨层解析场景值,而工程师则负责性能、权衡和架构决策。书面标准意味着每个实现任务都有可测试的正确定义。

import nanousd

RACK_ASSET = "./assets/shelving_unit.usd"   # your part on disk (referenced, not copied)
FORKLIFT_ASSET = "./assets/forklift.usd"

# 1) New stage with warehouse conventions (Z-up, meters)
stage = nanousd.Stage.create()
stage.set_metadata_token("upAxis", "Z")
stage.set_metadata_double("metersPerUnit", 1.0)
stage.set_metadata_token("defaultPrim", "World")
stage.define_prim("/World", "Xform")

# 2) ASSEMBLE: reference an external part into place, once per grid cell.
#    add_reference(asset_path, prim_path="") pulls the part in without copying it.
for row in range(3):
    for col in range(5):
        rack = stage.define_prim(f"/World/Racks/Rack_{row}_{col}", "Xform")
        rack.add_reference(RACK_ASSET)                     # <- assembly via reference
        rack.create_attribute("xformOp:translate", "double3")
        rack.set_vec3d("xformOp:translate", (col * 3.0, row * 6.0, 0.0))
        order.append("xformOp:translate")

# 3) Built-in geometry so the file is non-empty even without external assets:
floor = stage.define_prim("/World/Floor", "Cube")
floor.create_attribute("size", "double")
floor.set_double("size", 1.0)
place(floor, translate=(6.0, 6.0, -0.05), scale=(30.0, 40.0, 0.1))

# 4) MOVE: animate a forklift with a time-sampled translate op (this "moves" geometry).
stage.set_metadata_double("startTimeCode", 0.0)
stage.set_metadata_double("endTimeCode", 96.0)
stage.set_metadata_double("timeCodesPerSecond", 24.0)

forklift = stage.define_prim("/World/Forklift", "Xform")
forklift.add_reference(FORKLIFT_ASSET)
forklift.create_attribute("xformOp:translate", "double3")
waypoints = [(0.0, (0.0, 0.0, 0.0)),
             (48.0, (12.0, 0.0, 0.0)),
             (72.0, (12.0, 18.0, 0.0)),
             (96.0, (0.0, 18.0, 0.0))]
for t, pos in waypoints:
    forklift.set_sample_vec3d("xformOp:translate", t, list(pos))   # keyframe at time t
forklift.create_attribute("xformOpOrder", "token[]")
forklift.set_token_array("xformOpOrder", ["xformOp:translate"])

# 5) Save
stage.write_usda("warehouse.usda")
print("Wrote warehouse.usda")

什么是 nanousd-labs?

nanousd 是 USD 运行时数据模型 (控制加载和查询时 USD 场景行为的规则) 的独立实现,直接衍生自 USD 核心规范,并通过稳定的 C 语言 ABI 公开。该实现使用 C++ 编写,具有任何语言都可以直接调用的公共 C API。

nanousd 是数据层,而非渲染器。它可以解析、合成、查询和写入,并在像素开始时停止。智能体实施核心规范的运行时数据模型,而 nanousd 仅携带特定工作负载所需的内容,并通过稳定的 C 语言 ABI 公开。现有的 OpenUSD 堆栈保持正常运行。该方法值得采用。实施就是明证。

USD Core 规范定义了运行时必须执行的操作,并对如何将内存、线程、ABI 和语言作为实现选择 (而非要求) 保留了开放性。对于 nanousd 而言,目前的主要选择是稳定的 C++ ABI。它背后的内存和性能细节仍在探索之中。客户端代码针对固定的 C API 进行编译,并在运行时加载其实现,因此后端可以在调用代码保持不变的情况下进行更改。后端可以进行交换,OpenUSD 位于 Omniverse 库中,或 Nanousd 插入,而无需接触客户端。

它还能保持测量结果的准确性。一个脚本针对通用 API 运行,而后端交换位于下方。重点不在于一种实现比另一种实现更快。标准加上稳定的 ABI 使得引导智能体以适合工作负载的方式进行迭代成为可能。

使用 USD Core 规范和 AI 智能体进行构建的两种方式

需要轻量级专用 USD 运行时环境来构建物理 AI 工作流和应用的开发者可以通过两种方式开始使用 nanousd-labs。第一个问题是,如果团队希望获得可立即使用的工作实施方案,可以考虑采用哪种方式。第二种是适合想要了解方法并将其应用于自己的堆栈的团队。

第一个切入点是直接克隆和构建 nanousd。这是一个使用任何编程语言都可以调用的 C API 进行编译的实现,可以指向当今现有的 USD 阶段。大多数物理 AI 开发者都会从 nanousd-python 开始,nanousd-python 是基于 nanousd C API 构建的 Python 软件包,不需要 GPU,可以在任何机器上无头运行。可以通过以下方式轻松安装:

python -m pip install -e ./nanousd-python

打开场景并行走其基元 (构成 USD 场景的各个元素) 如下所示:

import nanousd

stage = nanousd.Stage.open("scene.usda")

for prim in stage.traverse():
    print(prim.path, prim.type_name, prim.attribute_names())

cube = stage.get_prim_at_path("/World/Cube")
if cube is not None and cube.has_attribute("size"):
    print(cube.read_double("size"))

之后,基于 USD 核心规范的智能体负责创作和验证。构建素材如下所示:

Author a USD stage for a warehouse AMR: a base transform, a lidar sensor prim, and two wheel meshes brought in as instanceable references to one shared wheel asset. 
Follow the USD Core Spec. 
When you're done, compose it back and show me the resolved prim tree, and flag anything you had to correct to stay spec-compliant.

智能体负责创作场景,通过 nanousd-labs 将场景合成回场景,以确认场景可以正确解析,然后返回已合成的场景结构及其所修复内容的注释。

以下输出显示了场景中的每个元素、其类型及其组装方式:

/World/Lidar           Cube          (sensor placeholder)
/World/WheelL          Xform    [instanceable → /_assets/Wheel]
/World/WheelR          Xform    [instanceable → /_assets/Wheel]

note: your first draft referenced the wheel without marking the
prims instanceable, so each wheel composed as a full unique copy.
Per the Core Spec that defeats scene-graph instancing — set
instanceable = true on both, re-composed, both now share one prototype.

可实例化意味着两个轮子在场景中共享一个定义,而不是每个轮子都携带一个完全独立的副本。这是 USD 高效处理重复元素的方式。

验证现有素材的工作方式相同:

Here's robot.usda straight from our exporter. 
Check whether it's Core-Spec-compliant: compose it, walk the result, and tell me exactly where it diverges from what the spec says should resolve. 
Don't guess from the text — open it and read the composed values.

智能体负责编写文件,根据规范规则检查已解决的结果,并返回具体答案:场景的确切哪个部分偏离、原因以及正确的结果应该是什么。开发者可以获得清晰的合规性信号,而不必解释特定工具的行为。

第二种方式是方法的核心,即动手实践。当直接代理首次根据核心规范构建时,每个指令都是手写的。在技能图中,人类的方向被编入可重复使用的技能。结构化的方法、提示和测试记录了如何生成符合规格的行为。

整个教程大约需要 10 分钟的时间。运行生成符合核心规范的 USD ASCII (USDA) 解析器的技能,最后对方法有一定的了解,并为实施奠定基础。它尚未生成所有内容。图还在增长,多部分内聚性是前沿领域,但它是持久耐用的层。标准是合同;技能图使工作流程可重复使用,而不是针对每个实现进行重塑。

开始使用

现在,无需从头开始构建专用的 USD 运行时环境。USD 核心规范为智能体提供了构建的精确基础,而 nanousd-labs 则展示了它在实践中的样子。方法是开放的,标准是公开的,还有更多内容需要构建。

开发者现在可以在 GitHub 上贡献新技能、语言支持和物理 AI 用例。AOUSD 成员组织可以通过核心规格工作组帮助制定标准本身。核心规格是持久的基础,而 nanousd-labs 就是一个例子,说明当智能体和开放标准协同工作时,可能会发生什么。

标签