优化场景创建#

Isaac Lab 支持两种实验性功能以加速场景创建: fabric cloningstage in memory。这些功能对于包含数千个环境的大规模强化学习设置特别有效。

这些功能有什么作用#

Fabric Cloning

  • 使用 Fabric 库克隆环境 (参见 USD Fabric USDRT 文档)

  • 部分支持,并在某些环境中默认启用(请参阅 限制 部分以获取列表)。

Stage in Memory

  • 在内存中构造场景,而不是使用 USD 文件,避免磁盘 I/O 带来的开销

  • 在场景创建完成后,如果需要渲染,场景将附加到 USD 上下文,返回到默认的场景配置。

  • 默认情况下未启用

用法示例#

Fabric克隆可以通过在 InteractiveSceneCfg 配置中设置 clone_in_fabric 标志来切换。

在 RL 环境中使用 Fabric 克隆

# create environment configuration
env_cfg = CartpoleEnvCfg()
env_cfg.scene.clone_in_fabric = True
# setup RL environment
env = ManagerBasedRLEnv(cfg=env_cfg)

内存中的场景可以通过在 SimulationCfg 配置中设置 create_stage_in_memory 来切换。

在 RL 环境中使用 Stage in Memory

# create config and set flag
cfg = CartpoleEnvCfg()
cfg.scene.num_envs = 1024
cfg.sim.create_stage_in_memory = True
# create env with stage in memory
env = ManagerBasedRLEnv(cfg=cfg)

请注意,如果在内存中启用场景而不使用现有的RL环境类,则需要几个额外步骤。场景创建步骤应该被包裹在一个 with 语句中以设置场景上下文。如果需要附加场景,应在创建场景后调用 attach_stage_to_usd_context 函数。

使用 Stage in Memory 进行手动场景设置

# init simulation context with stage in memory
sim = SimulationContext(cfg=SimulationCfg(create_stage_in_memory=True))

# grab stage in memory and set stage context
stage_in_memory = sim.get_initial_stage()
with stage_utils.use_stage(stage_in_memory):
    # create cartpole scene
    scene_cfg = CartpoleSceneCfg(num_envs=1024)
    scene = InteractiveScene(scene_cfg)
    # attach stage to memory after stage is created
    sim_utils.attach_stage_to_usd_context()

sim.play()

限制#

Fabric Cloning

  • Fabric-cloned 的环境必须使用 USDRT 函数访问,而不是使用 USD 函数。

  • Fabric cloning 在某些环境上部分受支持,并默认启用,列表在这里。

1.  Isaac-Ant-Direct-v0
2.  Isaac-Ant-v0
3.  Isaac-Cartpole-Direct-v0
4.  Isaac-Cartpole-Showcase-Box-Box-Direct-v0
5.  Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0
6.  Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0
7.  Isaac-Cartpole-Showcase-Dict-Box-Direct-v0
8.  Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0
9.  Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0
10. Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0
11. Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0
12. Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0
13. Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0
14. Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0
15. Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0
16. Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0
17. Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0
18. Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0
19. Isaac-Cartpole-v0
20. Isaac-Factory-GearMesh-Direct-v0
21. Isaac-Factory-NutThread-Direct-v0
22. Isaac-Factory-PegInsert-Direct-v0
23. Isaac-Franka-Cabinet-Direct-v0
24. Isaac-Humanoid-Direct-v0
25. Isaac-Humanoid-v0
26. Isaac-Quadcopter-Direct-v0
27. Isaac-Repose-Cube-Allegro-Direct-v0
28. Isaac-Repose-Cube-Allegro-NoVelObs-v0
29. Isaac-Repose-Cube-Allegro-v0
30. Isaac-Repose-Cube-Shadow-Direct-v0
31. Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0
32. Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0

Stage in Memory

  • 不能与 Fabric Cloning 同时启用。

  • 将场景附加到 USD 上下文中可能会慢,抵消一些或全部性能优势。

    • 注意,在启用渲染时才需要附加。例如,在headless模式下,不需要附加。

  • 某些低级 Kit APIs 尚不支持 stage in memory。

    • 在大多数情况下,当这些API被调用时,现有脚本将自动提前附加场景并打印警告消息。

    • 在某些特定情况下,对于一些环境,当启用 stage in memory 时,用于着色地面平面的 API 调用会被跳过。

基准测试结果#

性能比较克隆 4000 个启用渲染的 ShadowHand 机器人

Test #

Stage in Memory

Clone in Fabric

场景连接时间(s)

Fabric连接时间(s)

克隆路径时间(s)

第一步时间 (s)

1

Yes

Yes

3.88

0.15

4.84

1.39

2

No

No

60.17

4.46

3.52

3

No

Yes

0.47

4.72

2.56

4

Yes

No

42.64

21.75

1.87

2.16