克隆环境#
克隆通过少量可复用的资产原型,构建多个仿真环境。 ClonePlan 描述每个环境包含哪些资产,物理与渲染使用同一份计划。
克隆生命周期#
场景构建遵循以下顺序:
在配置中声明资产、传感器、物理、渲染器和可视化器。各使用方在规划前注册所需的表示。
构建并发布克隆计划,再在计划指定的原型路径上构建资产。
通过所需后端,使用同一计划复制已声明的原型。
初始化各使用方,并将它们绑定到生成的原生资源。
对于任务和演示, 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 参考 。