Skip to content

Commit c85683e

Browse files
committed
update newer cloner feature
1 parent 64a97f2 commit c85683e

File tree

14 files changed

+799
-285
lines changed

14 files changed

+799
-285
lines changed

source/isaaclab/config/extension.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
# Note: Semantic Versioning is used: https://semver.org/
4-
version = "0.47.7"
4+
version = "0.48.0"
55

66
# Description
77
title = "Isaac Lab framework for Robot Learning"

source/isaaclab/docs/CHANGELOG.rst

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,41 @@
11
Changelog
22
---------
33

4+
0.48.0 (2025-11-04)
5+
~~~~~~~~~~~~~~~~~~~
6+
7+
Changed
8+
^^^^^^^
9+
10+
* Removed hard dependency on the Isaac Sim Cloner for scene replication. Replication now uses internal utilities
11+
:func:`~isaaclab.scene.cloner.usd_replicate` and :func:`~isaaclab.scene.cloner.physx_replicate`, reducing coupling
12+
to Isaac Sim. Public APIs in :class:`~isaaclab.scene.interactive_scene.InteractiveScene` remain unchanged; code
13+
directly importing the external Cloner should migrate to these utilities.
14+
15+
16+
Added
17+
^^^^^
18+
19+
* Added optional random prototype selection during environment cloning in
20+
:class:`~isaaclab.scene.interactive_scene.InteractiveScene` via
21+
:attr:`~isaaclab.scene.interactive_scene_cfg.InteractiveSceneCfg.random_heterogenous_cloning`.
22+
Defaults to ``True``; round-robin (modulo) mapping remains available by setting it to ``False``.
23+
24+
* Added flexible per-object cloning path in
25+
:class:`~isaaclab.scene.interactive_scene.InteractiveScene`: when environments are heterogeneous
26+
(different prototypes across envs), replication switches to per-object instead of whole-env cloning.
27+
This reduces PhysX cloning time in heterogeneous scenes.
28+
29+
30+
Deprecated
31+
^^^^^^^^^^
32+
33+
* Deprecated :attr:`~isaaclab.sim.spawners.wrappers.MultiAssetSpawnerCfg.random_choice` and
34+
:attr:`~isaaclab.sim.spawners.wrappers.MultiUsdFileCfg.random_choice`. Use
35+
:attr:`~isaaclab.scene.interactive_scene_cfg.InteractiveSceneCfg.random_heterogenous_cloning` to control whether
36+
assets are selected randomly (``True``) or via round-robin (``False``) across environments.
37+
38+
439
0.47.7 (2025-10-31)
540
~~~~~~~~~~~~~~~~~~~
641

source/isaaclab/isaaclab/assets/asset_base.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,8 @@ def __init__(self, cfg: AssetBaseCfg):
7373
# get stage handle
7474
self.stage = get_current_stage()
7575

76-
# check if base asset path is valid
77-
# note: currently the spawner does not work if there is a regex pattern in the leaf
78-
# For example, if the prim path is "/World/Robot_[1,2]" since the spawner will not
79-
# know which prim to spawn. This is a limitation of the spawner and not the asset.
80-
asset_path = self.cfg.prim_path.split("/")[-1]
81-
asset_path_is_regex = re.match(r"^[a-zA-Z0-9/_]+$", asset_path) is None
8276
# spawn the asset
83-
if self.cfg.spawn is not None and not asset_path_is_regex:
77+
if self.cfg.spawn is not None:
8478
self.cfg.spawn.func(
8579
self.cfg.prim_path,
8680
self.cfg.spawn,

source/isaaclab/isaaclab/assets/rigid_object_collection/rigid_object_collection.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,10 @@ def __init__(self, cfg: RigidObjectCollectionCfg):
6666
self.cfg = cfg.copy()
6767
# flag for whether the asset is initialized
6868
self._is_initialized = False
69-
self._prim_paths = []
7069
# spawn the rigid objects
7170
for rigid_object_cfg in self.cfg.rigid_objects.values():
72-
# check if the rigid object path is valid
73-
# note: currently the spawner does not work if there is a regex pattern in the leaf
74-
# For example, if the prim path is "/World/Object_[1,2]" since the spawner will not
75-
# know which prim to spawn. This is a limitation of the spawner and not the asset.
76-
asset_path = rigid_object_cfg.prim_path.split("/")[-1]
77-
asset_path_is_regex = re.match(r"^[a-zA-Z0-9/_]+$", asset_path) is None
7871
# spawn the asset
79-
if rigid_object_cfg.spawn is not None and not asset_path_is_regex:
72+
if rigid_object_cfg.spawn is not None:
8073
rigid_object_cfg.spawn.func(
8174
rigid_object_cfg.prim_path,
8275
rigid_object_cfg.spawn,
@@ -87,7 +80,7 @@ def __init__(self, cfg: RigidObjectCollectionCfg):
8780
matching_prims = sim_utils.find_matching_prims(rigid_object_cfg.prim_path)
8881
if len(matching_prims) == 0:
8982
raise RuntimeError(f"Could not find prim with path {rigid_object_cfg.prim_path}.")
90-
self._prim_paths.append(rigid_object_cfg.prim_path)
83+
9184
# stores object names
9285
self._object_names_list = []
9386

@@ -746,7 +739,7 @@ def _on_prim_deletion(self, prim_path: str) -> None:
746739
if prim_path == "/":
747740
self._clear_callbacks()
748741
return
749-
for prim_path_expr in self._prim_paths:
742+
for prim_path_expr in [obj.prim_path for obj in self.cfg.rigid_objects.values()]:
750743
result = re.match(
751744
pattern="^" + "/".join(prim_path_expr.split("/")[: prim_path.count("/") + 1]) + "$", string=prim_path
752745
)

0 commit comments

Comments
 (0)