Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions apps/isaaclab.python.kit
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ keywords = ["experience", "app", "usd"]
"isaacsim.core.deprecation_manager" = { order = -100 }
"isaacsim.core.experimental.materials" = {}
"isaacsim.core.experimental.objects" = {}
"isaacsim.core.experimental.primdata" = {}
# Optional: not yet present in publicly-released isaacsim 6.0.x; Kit's resolver
# otherwise stalls on remote registry sync. Hard-load once it ships publicly.
"isaacsim.core.experimental.primdata" = { optional = true }
"isaacsim.core.experimental.prims" = {}
"isaacsim.core.experimental.utils" = {}
"isaacsim.core.nodes" = {}
Expand All @@ -31,9 +33,12 @@ keywords = ["experience", "app", "usd"]
"isaacsim.robot.policy.examples" = {}
"isaacsim.robot.schema" = {}
"isaacsim.robot.experimental.wheeled_robots" = {}
"isaacsim.robot.wheeled_robots.nodes" = {}
# Optional: not yet present in publicly-released isaacsim 6.0.x; Kit's resolver
# otherwise stalls on remote registry sync. Hard-load once it ships publicly.
"isaacsim.robot.wheeled_robots.nodes" = { optional = true }
"isaacsim.sensors.experimental.physics" = {}
"isaacsim.sensors.experimental.rtx" = {}
# Optional: see comment above.
"isaacsim.sensors.experimental.rtx" = { optional = true }
"isaacsim.simulation_app" = {}
"isaacsim.storage.native" = {}
"isaacsim.util.debug_draw" = {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Fixed
^^^^^

* Fixed ``apps/isaaclab.python.kit`` referencing three Isaac Sim extensions
that don't exist in publicly-released ``isaacsim 6.0.x``:
``isaacsim.core.experimental.primdata``,
``isaacsim.robot.wheeled_robots.nodes``, and
``isaacsim.sensors.experimental.rtx``. The references were added in #5293
as part of the deprecated-extension migration, but the renamed targets
only exist in unreleased Isaac Sim builds. Kit's resolver falls back to
remote registry sync for every missing dependency, which silently burns
~55s locally and 1000s+ in CI (the registry endpoints are slow /
unreachable from runners), triggering recent "isaaclab (core)" per-test
timeouts on ``test_non_headless_launch.py``, ``test_outdated_sensor.py``,
and ``test_color_randomization.py``. Marking the three as
``{ optional = true }`` makes Kit's resolver tolerate their absence while
still picking them up automatically once they ship in a future Isaac Sim
release.
* Fixed :func:`~isaaclab.envs.mdp.events.randomize_visual_color` and three
sibling event terms crashing with
``AttributeError: 'NoneType' object has no attribute 'split'`` when
``omni.replicator.core`` is loaded as a namespace package by Kit's
extension manager (which leaves ``rep.__file__ = None``). Replaced the
fragile ``rep.__file__.split("/")[-5][21:]`` version extraction with a
dedicated helper ``_get_replicator_version`` that falls back to
``rep.__path__[0]`` -- always populated -- and uses ``re.search`` rather
than positional slicing, so it survives both packaging modes.
27 changes: 23 additions & 4 deletions source/isaaclab/isaaclab/envs/mdp/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,25 @@
from isaaclab.managers import EventTermCfg, ManagerTermBase, SceneEntityCfg
from isaaclab.utils.version import compare_versions


def _get_replicator_version(rep) -> str:
"""Return the X.Y.Z version of ``omni.replicator.core``.

``rep.__file__`` can be ``None`` when ``omni.replicator.core`` is loaded as a
namespace package by Kit's extension manager (e.g. on the Kit 110.x stack),
so we fall back to ``rep.__path__[0]``, which always points to the extscache
directory whose name embeds the version (e.g.
``"omni.replicator.core-1.13.4+110.0.0.lx64.r.cp312"``).
"""
rep_path = rep.__file__ or (rep.__path__[0] if getattr(rep, "__path__", None) else None)
if rep_path is None:
raise RuntimeError("omni.replicator.core has no resolvable __file__ or __path__")
match = re.search(r"omni\.replicator\.core-(\d+\.\d+\.\d+)", rep_path)
if match is None:
raise RuntimeError(f"Could not parse omni-replicator-core version from {rep_path!r}")
return match.group(1)


if TYPE_CHECKING:
from isaaclab_physx.assets import DeformableObject

Expand Down Expand Up @@ -2087,7 +2106,7 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv):
)

# extract the replicator version
version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1)
version = _get_replicator_version(rep)

# use different path for different version of replicator
if compare_versions(version, "1.12.4") < 0:
Expand Down Expand Up @@ -2157,7 +2176,7 @@ def __call__(
import omni.replicator.core as rep

# extract the replicator version
version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1)
version = _get_replicator_version(rep)

# use different path for different version of replicator
if compare_versions(version, "1.12.4") < 0:
Expand Down Expand Up @@ -2246,7 +2265,7 @@ def __init__(self, cfg: EventTermCfg, env: ManagerBasedEnv):
# TODO: Need to make it work for multiple meshes.

# extract the replicator version
version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1)
version = _get_replicator_version(rep)

# use different path for different version of replicator
if compare_versions(version, "1.12.4") < 0:
Expand Down Expand Up @@ -2315,7 +2334,7 @@ def __call__(
# we import the module here since we may not always need the replicator
import omni.replicator.core as rep

version = re.match(r"^(\d+\.\d+\.\d+)", rep.__file__.split("/")[-5][21:]).group(1)
version = _get_replicator_version(rep)

# use different path for different version of replicator
if compare_versions(version, "1.12.4") < 0:
Expand Down
Loading