Isaac Sim 与 Isaac Lab 的边界#
学习目标
读完本页你能:
面对一个需求,判断它该在 Isaac Sim 层做还是 Isaac Lab 层做
说出 Isaac Lab 的四个核心类分别封装了 Isaac Sim 的什么
知道何时绕过 Isaac Lab 直接调用 Isaac Sim API,以及这样做的风险
解释
AppLauncher在启动时替你做了什么
前置知识
0.2 分层依赖图:Isaac Lab 构建在 Isaac Sim 之上
0.6 一个 RL step 里发生了什么:本页会引用其中的调用链
职责划分#
这一节回答:一件事到底归谁管?
0.2 说过,Isaac Lab 是构建在 Isaac Sim 之上的独立框架。它和 Isaac Sim 的关系有三种:直接沿用 Isaac Sim 的能力(Sim 提供)、在 Isaac Sim 的能力外面包一层批量化、配置化的接口(Lab 封装)、Isaac Sim 里没有而由 Isaac Lab 自己实现(Lab 新增)。
职责 |
归属 |
说明 |
来源 |
|---|---|---|---|
场景与资产加载 |
Lab 封装 |
|
|
物理步进 |
Lab 封装 |
Isaac Lab 的 |
|
关节与刚体读写 |
Lab 封装 |
|
|
相机 |
Lab 封装 |
|
|
射线类传感器 |
Lab 新增 |
|
|
并行环境克隆 |
Lab 封装 |
|
|
观测、奖励、终止 |
Lab 新增 |
Manager 体系与 Direct 环境基类,Isaac Sim 中没有对应概念 |
|
RL 库对接 |
Lab 新增 |
|
|
渲染 |
Sim 提供 |
RTX 渲染由 Isaac Sim / Kit 完成,Isaac Lab 只决定何时调用 |
|
GUI 交互 |
Sim 提供 |
视口、属性面板、脚本编辑器都是 Isaac Sim 的;Isaac Lab 只是用非 headless 模式启动同一个应用 |
|
ROS 2 |
Sim 提供 |
ROS 2 bridge 是 Isaac Sim 的扩展,Isaac Lab 源码中没有对应封装(推断:依据 v2.3.2 源码中搜不到 |
一个简单的判断方法:需要"对几千个环境同时做"的事,放在 Isaac Lab;只关心"这一个场景长什么样、怎么交互"的事,放在 Isaac Sim。
四个核心类的对应关系#
这一节回答:Isaac Lab 的类背后是哪个 Isaac Sim 或 USD 接口?
Isaac Lab(v2.3.2) |
底层接口 |
关系 |
源码 |
|---|---|---|---|
|
|
子类;增加 |
|
|
USD API( |
自 2.3.2 起不再依赖 |
|
|
PhysX 张量 API( |
经 Isaac Sim 的 |
|
|
|
用 GridCloner 克隆环境; |
注意第二行:旧版 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]。
两个入口#
这一节回答:Isaac Sim 有 GUI 和脚本两种用法,Isaac Lab 用的是哪种?
Isaac Sim 官方文档列出了几种工作流,其中两种最常用:在 GUI 里操作(可配合脚本编辑器执行 Python 片段),以及 standalone Python,由脚本自己启动应用并控制仿真循环[12]。
Isaac Lab 只走 standalone 这条路,入口是 AppLauncher[13]。它替你做了三件事:
解析启动参数:
--headless、--livestream、--enable_cameras、--device等[21]。选择 Kit 体验文件:根据是否 headless、是否需要相机渲染,在
isaaclab.python.kit、isaaclab.python.headless.kit、isaaclab.python.rendering.kit等之间选择,从而决定加载哪些扩展[21]。创建
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 都是它自己新增的。
延伸阅读#
官方文档:
源码:
isaaclab/sim、isaaclab/scene、isaaclab/app(均为 tag v2.3.2)中文翻译(中文翻译站,译自最新版 Isaac Sim 文档,与主线 5.1.0 可能有差异):Isaac Sim 文档首页
版本说明#
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 改了什么、为什么改。