克隆环境#

克隆通过少量可复用的资产原型,构建多个仿真环境。 ClonePlan 描述每个环境包含哪些资产,物理与渲染使用同一份计划。

克隆生命周期#

场景构建遵循以下顺序:

  1. 在配置中声明资产、传感器、物理、渲染器和可视化器。各使用方在规划前注册所需的表示。

  2. 构建并发布克隆计划,再在计划指定的原型路径上构建资产。

  3. 通过所需后端,使用同一计划复制已声明的原型。

  4. 初始化各使用方,并将它们绑定到生成的原生资源。

对于任务和演示, InteractiveScene 负责规划、资产构建和复制。假设已有 banana_cfg 、 franka_cfg 资产配置,以及正在运行的仿真上下文 sim :

from isaaclab.scene import InteractiveScene, InteractiveSceneCfg
from isaaclab.utils import configclass, replace

@configclass
class BananaFrankaSceneCfg(InteractiveSceneCfg):
    banana = replace(banana_cfg, prim_path="{ENV_REGEX_NS}/Banana")
    franka = replace(franka_cfg, prim_path="{ENV_REGEX_NS}/Franka")

scene = InteractiveScene(BananaFrankaSceneCfg(num_envs=16, env_spacing=2.0))
sim.reset()

这会创建十六个环境,每个包含一个香蕉和一个 Franka。相机应与资产一同声明,以参与相同的生命周期。不同环境使用不同资产的方式见 生成多个资产 。

理解 ClonePlan#

资产原型 是一份可复用的资产定义; 世界原型 是这些资产的一种组合。例如,两个资产原型可描述四种不同的世界原型:

from isaaclab import cloner

asset_cfgs = (banana_cfg, franka_cfg)  # Asset IDs: banana = 0, Franka = 1.
world_prototypes = (
    (0, 1),     # One banana, one Franka.
    (0, 1, 1),  # One banana, two Frankas.
    (0, 0, 1),  # Two bananas, one Franka.
    (1,),       # One Franka.
)
positions = cloner.grid_transforms(16, spacing=2.0)[0]
plan = cloner.make_clone_plan(asset_cfgs, world_prototypes, 16, positions=positions)

重复一个资产索引会创建另一个实例,而不是新增原型定义。使用默认等权重和顺序分配时,十六个目标世界中,每个世界原型对应四个世界。

ClonePlan 保存四类内容:

  • asset_cfgs :资产定义,只存储一次。

  • topology :以数值表示的资产成员关系和世界原型选择。

  • env_template :目标名称模板,其中一个 {} 占位符用于世界 ID。

  • positions :可选的目标世界原点 [m],与拓扑分开存储。

本例的拓扑以一维数组存储:

num_asset_prototypes   = 2
world_prototypes       = [0,1, 0,1,1, 0,0,1, 1]
world_prototype_starts = [0,0,2,5,8,9]
world_prototype_layout = [0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3]

world_prototype_starts 分隔各资产列表。其第一个切片属于共享世界 -1 ;开头的 [0, 0] 表示没有共享资产。如果需要共享地面,将其配置追加到 asset_cfgs ,并传入 shared_assets=(2,) 。该资产只实例化一次,位于复制出的环境之外。

world_prototype_layout 为每个目标世界选择原型:世界 0–3 使用原型 0,世界 4–7 使用原型 1,依此类推。可选的 weights 改变世界在各原型间的分配比例。

make_clone_plan 只描述场景,不生成或复制资产。 InteractiveScene 在构建场景时准备并执行该计划。只有已声明的资产子树参与,舞台上未声明的同级节点不参与。

测试与工具中的显式克隆#

不使用 InteractiveScene 时,同构场景也可显式执行同一生命周期。将资产路径设为 {ENV_REGEX_NS}/Banana 和 {ENV_REGEX_NS}/Franka ,然后在构建资产前进行规划:

from isaaclab.utils import instantiate

asset_cfgs = (banana_cfg, franka_cfg)
plan = cloner.clone_plan_from_env_0(cloner.CloneCfg(), asset_cfgs, 16, 2.0)
banana, franka = [instantiate(cfg) for cfg in asset_cfgs]
cloner.replicate(plan)
sim.reset()

传入一维的资产与传感器配置集合,其中也包括地面、灯光等共享资产。对于持续维护的任务和演示,优先使用 InteractiveScene ,它还会处理 PhysX 碰撞过滤等后端专用设置。

设置 replicate_physics=False 会跳过当前物理复制上下文。其他已声明的上下文仍会运行,包括已配置的 USD 复制,因此它们可创建各环境的 prim,而不复制物理模型。之后,物理后端可分别解析这些 prim。

各函数、拓扑查询及路径工具见 克隆器 API 参考 。