Isaac Sim 与 Isaac Lab 的边界#

学习目标

读完本页你能:

  • 面对一个需求,判断它该在 Isaac Sim 层做还是 Isaac Lab 层做

  • 说出 Isaac Lab 的四个核心类分别封装了 Isaac Sim 的什么

  • 知道何时绕过 Isaac Lab 直接调用 Isaac Sim API,以及这样做的风险

  • 解释 AppLauncher 在启动时替你做了什么

前置知识

职责划分#

这一节回答:一件事到底归谁管?

0.2 说过,Isaac Lab 是构建在 Isaac Sim 之上的独立框架。它和 Isaac Sim 的关系有三种:直接沿用 Isaac Sim 的能力(Sim 提供)、在 Isaac Sim 的能力外面包一层批量化、配置化的接口(Lab 封装)、Isaac Sim 里没有而由 Isaac Lab 自己实现(Lab 新增)。

职责

归属

说明

来源

场景与资产加载

Lab 封装

spawners 用配置类描述资产,底层直接调用 USD API;URDF 导入仍交给 Isaac Sim 的导入器扩展

[1] [2]

物理步进

Lab 封装

Isaac Lab 的 SimulationContext 继承 Isaac Sim 的同名类

[3]

关节与刚体读写

Lab 封装

Articulation 通过 PhysX 张量 API 批量读写所有环境

[4]

相机

Lab 封装

Camera 建立在 Replicator 的 annotator 之上

[5]

射线类传感器

Lab 新增

RayCaster 用 Warp 自行实现射线检测

[6]

并行环境克隆

Lab 封装

InteractiveScene 调用 Isaac Sim 的 GridCloner

[7]

观测、奖励、终止

Lab 新增

Manager 体系与 Direct 环境基类,Isaac Sim 中没有对应概念

[8]

RL 库对接

Lab 新增

isaaclab_rl 为 rsl_rl、skrl 等提供适配层(wrapper)

[9]

渲染

Sim 提供

RTX 渲染由 Isaac Sim / Kit 完成,Isaac Lab 只决定何时调用

[10] [11]

GUI 交互

Sim 提供

视口、属性面板、脚本编辑器都是 Isaac Sim 的;Isaac Lab 只是用非 headless 模式启动同一个应用

[12] [13]

ROS 2

Sim 提供

ROS 2 bridge 是 Isaac Sim 的扩展,Isaac Lab 源码中没有对应封装(推断:依据 v2.3.2 源码中搜不到 isaacsim.ros2 的引用)

[14]

一个简单的判断方法:需要"对几千个环境同时做"的事,放在 Isaac Lab;只关心"这一个场景长什么样、怎么交互"的事,放在 Isaac Sim。

四个核心类的对应关系#

这一节回答:Isaac Lab 的类背后是哪个 Isaac Sim 或 USD 接口?

Isaac Lab(v2.3.2)

底层接口

关系

源码

isaaclab.sim.SimulationContext

isaacsim.core.api.SimulationContext

子类;增加 SimulationCfg 配置、渲染模式、设备设置等

[3]

isaaclab.sim.spawners

USD API(pxr)与 isaaclab.sim.utils

自 2.3.2 起不再依赖 isaacsim.core.utils.prims,改用 Isaac Lab 自带的 USD 工具函数(2.3.1 仍在使用);@clone 装饰器负责把一个资产复制到所有环境路径

[1] [15] [16]

isaaclab.assets.Articulation

PhysX 张量 API(omni.physics.tensors)

经 Isaac Sim 的 SimulationManager.get_physics_sim_view() 取得 physics sim view,再通过 create_articulation_view 建立覆盖所有环境的视图,数据都是 (num_envs, …) 张量

[4] [17]

isaaclab.scene.InteractiveScene

isaacsim.core.cloner.GridCloner

用 GridCloner 克隆环境;replicate_physics 决定是否让所有环境共享同一份物理解析结果

[7] [18]

注意第二行:旧版 Isaac Lab 教程里常见的 isaacsim.core.utils.prims(或更早的 omni.isaac.core.utils.prims),在 2.3.2 中已被 isaaclab.sim.utils 取代。Isaac Lab 把少数旧函数保留在 legacy 模块里,源码注释建议尽量直接使用 USD API[15]。

什么时候直接用 Isaac Sim API#

这一节回答:什么情况下可以不经过 Isaac Lab?

三个典型场景:

  • 单机器人交互式调试:在 GUI 里拖动关节、看碰撞体、调驱动参数。这类工作不需要并行,也不需要奖励,直接用 Isaac Sim GUI 与脚本编辑器更快[12]。

  • 非 RL 的数字孪生:产线仿真、ROS 2 联调、合成数据生成,核心是场景与传感器,而不是 MDP。直接写 Isaac Sim 的 standalone 脚本即可[12][14]。

  • 自定义传感器或 Isaac Lab 尚未封装的功能:先用 Isaac Sim 扩展实现,验证后再考虑包装成 Isaac Lab 的传感器类。

在 Isaac Lab 代码里"下探"到 Isaac Sim 也很常见:InteractiveScene 持有当前 USD stage(scene.stage)[7],可以用 pxr API 直接读写 prim;资产对象的 root_physx_view 就是 PhysX 张量视图[4]。

USD 写入与张量视图不同步

仿真开始后,PhysX 已经解析过 USD,之后再改 USD 属性,物理引擎不会自动看到。Isaac Lab 的 randomize_rigid_body_scale 就明确要求只在仿真开始前(usd 模式)使用,运行中调用会直接报错[19];而运行中的质量、摩擦随机化走的是 root_physx_view.set_masses、set_material_properties 这类张量接口[20]。规则:仿真开始前改 USD,开始后改张量视图。

两个入口#

这一节回答:Isaac Sim 有 GUI 和脚本两种用法,Isaac Lab 用的是哪种?

Isaac Sim 官方文档列出了几种工作流,其中两种最常用:在 GUI 里操作(可配合脚本编辑器执行 Python 片段),以及 standalone Python,由脚本自己启动应用并控制仿真循环[12]。

Isaac Lab 只走 standalone 这条路,入口是 AppLauncher[13]。它替你做了三件事:

  1. 解析启动参数:--headless、--livestream、--enable_cameras、--device 等[21]。

  2. 选择 Kit 体验文件:根据是否 headless、是否需要相机渲染,在 isaaclab.python.kit、isaaclab.python.headless.kit、isaaclab.python.rendering.kit 等之间选择,从而决定加载哪些扩展[21]。

  3. 创建 SimulationApp:这是 Isaac Sim 提供的类,它启动 Kit 应用本身[21]。

这也解释了 Isaac Lab 脚本里一条固定的顺序:先创建 AppLauncher,再导入 isaaclab.sim 等模块。后者依赖的 Isaac Sim 扩展要在应用启动后才能加载(推断:依据官方教程中 AppLauncher 放在所有 Isaac Lab 导入之前,以及 SimulationApp 负责加载扩展[13])。

命名空间速查#

这一节回答:看到一个 import,怎么知道它属于哪一层?

  • isaacsim.*:Isaac Sim 的扩展,按领域分组,如 isaacsim.core(仿真上下文、prim 封装、克隆)、isaacsim.sensors、isaacsim.asset(导入、导出)、isaacsim.robot、isaacsim.replicator、isaacsim.ros2。4.5 之前叫 omni.isaac.*[22]。速查见 3.11 Isaac Sim 的 Python API 地图。

  • isaaclab.*:Isaac Lab 核心包,子模块有 app、sim、assets、sensors、actuators、scene、managers、envs、terrains 等;同仓库还有 isaaclab_assets、isaaclab_tasks、isaaclab_rl、isaaclab_mimic 几个独立包[23]。详见 4.2 代码仓库地图。

omni.*、pxr、carb 则来自更底层的 Omniverse Kit 与 USD。

常见误解#

误解一:Isaac Lab 是 Isaac Sim 的一个模块

不是。Isaac Lab 是独立仓库、独立许可、独立发版的框架[8]。从上面的对应关系表可以看出,它是 Isaac Sim 的使用者:继承 Isaac Sim 的类、调用 Isaac Sim 的扩展,但 Isaac Sim 不依赖 Isaac Lab。反过来,Isaac Lab 也不只是薄薄一层胶水,Manager、执行器模型、射线传感器、RL wrapper 都是它自己新增的。

误解二:Isaac Lab 里不能用 Isaac Sim API

可以用,Isaac Lab 自己就在大量使用:SimulationContext 继承自 isaacsim.core.api,InteractiveScene 导入 isaacsim.core.cloner[3][7]。需要注意的是版本:Isaac Lab 2.3.2 对应 Isaac Sim 4.5 起的 isaacsim.* 命名,而且要在 AppLauncher 启动之后导入。

误解三:改 USD 就能改并行环境里的物理参数

仿真开始后不行。PhysX 在开始时解析 USD,之后要通过张量视图修改,见上文"USD 写入与张量视图不同步"[19][20]。另外,replicate_physics=True 时所有环境共享一份物理解析结果,需要逐环境不同的 USD 属性(例如不同尺寸)时,必须设为 False[19][7]。

延伸阅读#

版本说明#

  • Isaac Lab 2.3.1 及更早:spawner 等模块仍直接调用 Isaac Sim 的 stage_utils、prim_utils,2.3.2 起改为 Isaac Lab 自带实现[16][24]。读旧代码时会看到更多 isaacsim.core.utils.* 导入。

  • Isaac Lab 3.0.0-EA:Isaac Sim 变为可选依赖;不再预加载扩展,直接导入 Isaac Sim 扩展的代码需要在应用启动后先调用 enable_extension;旧的 isaacsim.core.* 导入建议换成 Isaac Lab API 或 Isaac Sim 的 experimental API[25]。详见 8.1 3.0 改了什么、为什么改。