Multi-asset spawning duplicates objects per env

Environment

  • Isaac Sim: 5.0.0

  • Isaac Lab: 2.3.0

  • NVIDIA driver: 580

  • OS: Ubuntu 24.04

Summary
I’m following the Spawning Multiple Assets doc to randomize one rigid object per environment using MultiAssetSpawnerCfg. However, I get two objects overlapping in most environments. In env_0 I only see bowl; from env_1 onward I see bowl + another random object at the same pose (overlapping).
If I remove bowl from the list, then clamp becomes the one that always appears everywhere in addition to the random choice, so it looks like one asset is being spawned globally and then another is spawned per-env.

Docs I followed: multi-asset spawning and disabling physics replication for heterogeneous envs. isaac-sim.github.io

What I expect

  • Exactly one object per env, chosen at random from my list.

What I observe

  • env_0: only bowl.

  • env_1+: bowl + another random object overlapping at /World/envs/env_i/object.

Minimal code (trimmed)

# cfg snippet
object_cfg: RigidObjectCfg = RigidObjectCfg(
    prim_path="/World/envs/env_.*/object",
    spawn=sim_utils.MultiAssetSpawnerCfg(
        assets_cfg=[
            sim_utils.UsdFileCfg(usd_path="/home/.../banana.usd"),
            sim_utils.UsdFileCfg(usd_path="/home/.../bowl.usd"),
            sim_utils.UsdFileCfg(usd_path="/home/.../clamp.usd"),
            # ... other USDs ...
        ],
        random_choice=True,
    ),
    init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, -0.39, 0.54), rot=(1.0, 0.0, 0.0, 0.0)),
)

# scene cfg
scene: InteractiveSceneCfg = InteractiveSceneCfg(
    num_envs=2048,
    env_spacing=1.5,
    replicate_physics=False,   # per docs
)

# env setup
def _setup_scene(self):
    self.right_hand = Articulation(self.cfg.right_robot_cfg)
    self.object     = RigidObject(self.cfg.object_cfg)  # single spawn site

    spawn_ground_plane(prim_path="/World/ground", cfg=GroundPlaneCfg())
    self.scene.clone_environments(copy_from_source=False)

    self.scene.articulations["right_hand"] = self.right_hand
    self.scene.rigid_objects["object"]     = self.object

Notes

  • I’m not creating any other RigidObject/collection with the same prim path. Just the single RigidObject above.

  • replicate_physics=False is set, per the doc’s requirement when per-env assets differ. isaac-sim.github.io

  • Prim path is a regex: "/World/envs/env_.*/object", matching the doc’s pattern of using regex prims for multi-env spawning. isaac-sim.github.io

  • If I comment out bowl.usd, the symptom persists but the “always present” object simply becomes a different one (e.g., clamp.usd).

  • I tried spawning before and after clone_environments(copy_from_source=False); behavior persists.

  • I also attempted clearing any existing prims under /World/envs/env_*/object (via omni.usd.get_context().get_stage().RemovePrim(path) in a loop) prior to spawning, but it doesn’t change the duplication. (Doc reference for the general multi-asset flow here. isaac-sim.github.io)

Questions

  1. Is there any known issue in Isaac Lab 2.3.0 + Isaac Sim 5.0.0 where MultiAssetSpawnerCfg could spawn an extra “default” asset (e.g., the first in the list) in addition to the random choice?

  2. Could clone_environments(copy_from_source=False) still be cloning a previously spawned prim in some hidden step? The behavior (env_0 vs env_1+) suggests one spawn might be happening pre-clone while another happens post-clone, but I only call RigidObject(self.cfg.object_cfg) once as shown.

  3. Are there asset-structure constraints that could cause a fallback/duplicate spawn? (I saw the note about “similar asset structuring” for articulations; does anything analogous apply to rigid objects that might trigger unexpected behavior?) isaac-sim.github.io

  4. Is there a recommended way to force a single authoritative spawn per env for a regex prim path (e.g., resolve all env paths first, then spawn exactly once per resolved path), beyond what RigidObjectCfg does internally?

  5. Any debugging tips to log which spawner creates each prim (e.g., an internal flag or verbose mode) so I can tell which call/site produced the “always present” object?

Doc references I used

  • Spawning Multiple Assets (MultiAssetSpawnerCfg / MultiUsdFileCfg and the replicate_physics=False requirement). isaac-sim.github.io

Thanks in advance for any pointers! If there’s a better minimal pattern for “exactly one random rigid object per env under the same prim path,” I’d love to try it.

fig 1. Import both objects.

fig 2. Environment