优化场景创建#
Isaac Lab 支持两种实验性功能以加速场景创建: fabric cloning 和 stage 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 |