From 5b5b1cd48edbaaa6cb5bdbec29584f8035760657 Mon Sep 17 00:00:00 2001 From: HuiDong Chen Date: Sat, 13 Jun 2026 03:02:49 +0800 Subject: [PATCH 01/32] Fixed rendering test failure for heterogeneous dexsuite on Newton + IsaacRTX (#6166) # Description Followup #5979 : on release/3.0.0-beta2, the flag is set in launch_simulation() as a workaround to keep USD cloning enabled when using Isaac RTX renderer. The test has to set the flag manually here to match the behavior of training. # Type of change - Test fix (non-breaking change which fixes an issue) ## Screenshots See golden image changes. ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- .../changelog.d/huidongc-fix-test-failure.skip | 0 .../newton-isaacsim_rtx_renderer-albedo.png | 4 ++-- .../newton-isaacsim_rtx_renderer-depth.png | 4 ++-- .../newton-isaacsim_rtx_renderer-rgb.png | 4 ++-- .../newton-isaacsim_rtx_renderer-rgba.png | 4 ++-- ...ewton-isaacsim_rtx_renderer-semantic_segmentation.png | 4 ++-- ...csim_rtx_renderer-simple_shading_constant_diffuse.png | 4 ++-- ...-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png | 4 ++-- ...ton-isaacsim_rtx_renderer-simple_shading_full_mdl.png | 4 ++-- source/isaaclab_tasks/test/rendering_test_utils.py | 9 ++++++++- 10 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip diff --git a/source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip b/source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-albedo.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-albedo.png index 91ddf533bdb5..595a20df902d 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-albedo.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-albedo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7bfebde993bf98092a3b266bdbd57ff1af2d3d82c810616abb332291d4eb56e -size 3049 +oid sha256:1ca369871e6d34c24d99489985cffd9c453c1c48a777e94b99e03b9b88094b3e +size 3505 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-depth.png index 1d04eb07dd8e..d823d5d96998 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:744496790b110dc97eb26fe8c893161c73c9e96a0f23c04b792b4df1e8463404 -size 515 +oid sha256:8f401da10698c1025957c57b8ca5ee359dab0449a78613941e3d9841df595794 +size 568 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgb.png index 9b403d7e1cc5..4f5134b7324e 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e3b847ffe199b75b0c8796dc78d496239a2c39607a9dec1413865c5a4450d90 -size 17432 +oid sha256:8b8eda157e0e14393bc2e62fa613053e860fcb798180ea7309bf4c7c9b3ebe8f +size 17708 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgba.png index f40b9b9cfa9e..90c0486d00dc 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7adb9a8651057324d69e04462a60e3107128d1e47a8fe445cb3d54a631befa98 -size 19718 +oid sha256:71e877239d99259c5ed04dace9f5eb808fe25163d3d0f99d9a55d7ba9d156482 +size 20075 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-semantic_segmentation.png index fd369a1403d0..273343a01900 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:639b3b6800b5fea38e44135ee9f0c007f31a08d4fabda4653c6e68462d28734f -size 635 +oid sha256:7681c231ab2c75ee863b70f61a252480cb42d2214ef2d4397f0aa418d95aa82a +size 703 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png index 8170dea9175a..8a7e7f1bc6bc 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc5af580f592889835fb667b8b9cae521c67707e20b9cfc01f444bce0144fdbd -size 1477 +oid sha256:2d6b61a08f44d446ac22ccd07a0afbcdabcf09cbc91aa45c3d1756631214d5ee +size 1671 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png index 04e711058abf..969c2cce00c7 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e2d094d62aadbffe9bacd0778376fce4556d467878053791219bbf6e980fafbb -size 3695 +oid sha256:f1b76b696ee4f8d3168d827c6dc4c42ef68f509ac4172eea871978c96d5d3a0f +size 3882 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png index db3d75a0baeb..ba370705e550 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39fcf58c99779401be00c3674631d443cd41ef1134856ced697e45e8cd6ccac3 -size 4249 +oid sha256:eaafeb30c4f84da19e2dac3ebc791bdb43f1a615cf098fdbce2ac6bbccc753fe +size 4451 diff --git a/source/isaaclab_tasks/test/rendering_test_utils.py b/source/isaaclab_tasks/test/rendering_test_utils.py index 1a941e5564f4..9264dde7625c 100644 --- a/source/isaaclab_tasks/test/rendering_test_utils.py +++ b/source/isaaclab_tasks/test/rendering_test_utils.py @@ -905,6 +905,11 @@ def rendering_test_dexsuite_kuka( get_settings_manager().set_bool("/isaaclab/runtime/has_ovrtx_renderer", True) _redirect_ovrtx_renderer_log_to_stdout(env_cfg) + elif renderer == "isaacsim_rtx_renderer": + # PR#5979 followup: on release/3.0.0-beta2, the flag is set in launch_simulation() as a workaround to keep + # USD cloning enabled when using Isaac RTX renderer. The test has to set the flag manually here to match the + # behavior of training. + get_settings_manager().set_bool("/isaaclab/runtime/needs_kit", True) # Disable the observation point-cloud visualisation markers (/Visuals/ObservationPointCloud). # The underlying point sampling uses the global numpy/torch RNG, so marker positions shift @@ -944,6 +949,8 @@ def rendering_test_dexsuite_kuka( # native code could probably complain about leaks and trigger segmentation fault. env = None + # Reset the flags to False to avoid affecting other tests. if renderer == "ovrtx_renderer": - # Reset the flag to False to avoid affecting other tests. get_settings_manager().set_bool("/isaaclab/runtime/has_ovrtx_renderer", False) + elif renderer == "isaacsim_rtx_renderer": + get_settings_manager().set_bool("/isaaclab/runtime/needs_kit", False) From 0916ea3c0f126821ef1783c7119d248834fc8d0b Mon Sep 17 00:00:00 2001 From: ooctipus Date: Fri, 12 Jun 2026 14:08:51 -0700 Subject: [PATCH 02/32] Fix MARL adapter destructor state (#6173) ## Summary - beta2 companion for #6174 - initialize lifecycle state in MARL adapter wrappers that subclass DirectRLEnv/DirectMARLEnv without running the base constructor - make adapter close idempotent so inherited destructors can clean up without AttributeError - add regression coverage for both MARL adapter destructor paths ## Testing - git diff --check - python3 -m py_compile source/isaaclab/isaaclab/envs/utils/marl.py source/isaaclab/test/envs/test_env_destructors.py - python3 tools/changelog/cli.py check release/3.0.0-beta2 Not run locally: focused pytest, because this worktree launcher uses /usr/bin/python3.12 without gymnasium installed. --- .../changelog.d/fix-marl-adapter-del.rst | 4 ++ source/isaaclab/isaaclab/envs/utils/marl.py | 10 ++++- .../test/envs/test_env_destructors.py | 41 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-marl-adapter-del.rst diff --git a/source/isaaclab/changelog.d/fix-marl-adapter-del.rst b/source/isaaclab/changelog.d/fix-marl-adapter-del.rst new file mode 100644 index 000000000000..9fdd2b43eb08 --- /dev/null +++ b/source/isaaclab/changelog.d/fix-marl-adapter-del.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Prevented MARL adapter wrappers from raising destructor tracebacks when destroyed by setting their environment lifecycle state explicitly. diff --git a/source/isaaclab/isaaclab/envs/utils/marl.py b/source/isaaclab/isaaclab/envs/utils/marl.py index 5901bfbc3184..55c25acd0b8c 100644 --- a/source/isaaclab/isaaclab/envs/utils/marl.py +++ b/source/isaaclab/isaaclab/envs/utils/marl.py @@ -48,6 +48,7 @@ def multi_agent_to_single_agent(env: DirectMARLEnv, state_as_observation: bool = class Env(DirectRLEnv): def __init__(self, env: DirectMARLEnv) -> None: self.env: DirectMARLEnv = env.unwrapped + self._is_closed = False # check if it is possible to use the multi-agent environment state as single-agent observation self._state_as_observation = state_as_observation @@ -133,7 +134,9 @@ def render(self, recompute: bool = False) -> np.ndarray | None: return self.env.render(recompute) def close(self) -> None: - self.env.close() + if not self._is_closed: + self.env.close() + self._is_closed = True return Env(env) @@ -168,6 +171,7 @@ def multi_agent_with_one_agent(env: DirectMARLEnv, state_as_observation: bool = class Env(DirectMARLEnv): def __init__(self, env: DirectMARLEnv) -> None: self.env: DirectMARLEnv = env.unwrapped + self._is_closed = False # check if it is possible to use the multi-agent environment state as agent observation self._state_as_observation = state_as_observation @@ -272,6 +276,8 @@ def render(self, recompute: bool = False) -> np.ndarray | None: self.env.render(recompute) def close(self) -> None: - self.env.close() + if not self._is_closed: + self.env.close() + self._is_closed = True return Env(env) diff --git a/source/isaaclab/test/envs/test_env_destructors.py b/source/isaaclab/test/envs/test_env_destructors.py index 92b81a114b3c..60e0bedcd282 100644 --- a/source/isaaclab/test/envs/test_env_destructors.py +++ b/source/isaaclab/test/envs/test_env_destructors.py @@ -5,9 +5,36 @@ from __future__ import annotations +from types import SimpleNamespace + +import gymnasium as gym import pytest from isaaclab.envs import DirectMARLEnv, DirectRLEnv, ManagerBasedEnv +from isaaclab.envs.utils.marl import multi_agent_to_single_agent, multi_agent_with_one_agent + + +class _FakeMultiAgentEnv: + possible_agents = ["agent_0", "agent_1"] + observation_spaces = { + "agent_0": gym.spaces.Box(low=-1.0, high=1.0, shape=(3,)), + "agent_1": gym.spaces.Box(low=-1.0, high=1.0, shape=(4,)), + } + action_spaces = { + "agent_0": gym.spaces.Box(low=-1.0, high=1.0, shape=(1,)), + "agent_1": gym.spaces.Box(low=-1.0, high=1.0, shape=(2,)), + } + render_mode = None + + def __init__(self): + self.unwrapped = self + self.cfg = SimpleNamespace(state_space=1) + self.sim = object() + self.scene = SimpleNamespace(num_envs=2) + self.closed_count = 0 + + def close(self): + self.closed_count += 1 @pytest.mark.parametrize("env_cls", [DirectRLEnv, DirectMARLEnv, ManagerBasedEnv]) @@ -56,3 +83,17 @@ def close(_self): monkeypatch.setattr("sys.meta_path", None) env.__del__() + + +@pytest.mark.parametrize("converter", [multi_agent_to_single_agent, multi_agent_with_one_agent]) +def test_marl_adapter_destructor_closes_wrapped_env_once(converter): + """MARL adapters inherit env destructors without running base env __init__.""" + + env = _FakeMultiAgentEnv() + converted_env = converter(env) + + converted_env.__del__() + converted_env.__del__() + + assert converted_env._is_closed + assert env.closed_count == 1 From 7632d161a68fe25836f0b907603ed46abeec4e1d Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 06:29:56 +0000 Subject: [PATCH 03/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.8 → 6.1.9 - isaaclab_newton: 0.13.4 → 0.13.5 --- .../isaaclab/changelog.d/fix-marl-adapter-del.rst | 4 ---- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 9 +++++++++ ...huidongc-fix-index-error-in-newton-replicate.rst | 6 ------ .../huidongc-newton-replicate-source-env-xform.rst | 5 ----- source/isaaclab_newton/config/extension.toml | 2 +- source/isaaclab_newton/docs/CHANGELOG.rst | 13 +++++++++++++ .../changelog.d/huidongc-fix-test-failure.skip | 0 .../huidongc-heterogeneous-ovrtx-cloning.skip | 0 9 files changed, 24 insertions(+), 17 deletions(-) delete mode 100644 source/isaaclab/changelog.d/fix-marl-adapter-del.rst delete mode 100644 source/isaaclab_newton/changelog.d/huidongc-fix-index-error-in-newton-replicate.rst delete mode 100644 source/isaaclab_newton/changelog.d/huidongc-newton-replicate-source-env-xform.rst delete mode 100644 source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip delete mode 100644 source/isaaclab_tasks/changelog.d/huidongc-heterogeneous-ovrtx-cloning.skip diff --git a/source/isaaclab/changelog.d/fix-marl-adapter-del.rst b/source/isaaclab/changelog.d/fix-marl-adapter-del.rst deleted file mode 100644 index 9fdd2b43eb08..000000000000 --- a/source/isaaclab/changelog.d/fix-marl-adapter-del.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Prevented MARL adapter wrappers from raising destructor tracebacks when destroyed by setting their environment lifecycle state explicitly. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 30b2762f37f5..6fa6f95205e4 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.8" +version = "6.1.9" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index a36380c53b0c..9bce7beb9249 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +6.1.9 (2026-06-13) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Prevented MARL adapter wrappers from raising destructor tracebacks when destroyed by setting their environment lifecycle state explicitly. + + 6.1.8 (2026-06-12) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_newton/changelog.d/huidongc-fix-index-error-in-newton-replicate.rst b/source/isaaclab_newton/changelog.d/huidongc-fix-index-error-in-newton-replicate.rst deleted file mode 100644 index 414f3a81720a..000000000000 --- a/source/isaaclab_newton/changelog.d/huidongc-fix-index-error-in-newton-replicate.rst +++ /dev/null @@ -1,6 +0,0 @@ -Fixed -^^^^^ - -* Fixed ``IndexError`` in Newton heterogeneous replication when resolving - source-world indices for inactive clone-plan rows with no assigned - environment. diff --git a/source/isaaclab_newton/changelog.d/huidongc-newton-replicate-source-env-xform.rst b/source/isaaclab_newton/changelog.d/huidongc-newton-replicate-source-env-xform.rst deleted file mode 100644 index d99454ed8d72..000000000000 --- a/source/isaaclab_newton/changelog.d/huidongc-newton-replicate-source-env-xform.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed -^^^^^ - -* Fixed Newton replication to apply per-source world transforms when adding - prototypes to cloned worlds, instead of always offsetting from ``env_0``. diff --git a/source/isaaclab_newton/config/extension.toml b/source/isaaclab_newton/config/extension.toml index d972ec0d9503..b8dea3e567ad 100644 --- a/source/isaaclab_newton/config/extension.toml +++ b/source/isaaclab_newton/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.13.4" +version = "0.13.5" # Description title = "Newton simulation interfaces for IsaacLab core package" diff --git a/source/isaaclab_newton/docs/CHANGELOG.rst b/source/isaaclab_newton/docs/CHANGELOG.rst index 3979a7e7b63b..50abe94d0394 100644 --- a/source/isaaclab_newton/docs/CHANGELOG.rst +++ b/source/isaaclab_newton/docs/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog --------- +0.13.5 (2026-06-13) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed ``IndexError`` in Newton heterogeneous replication when resolving + source-world indices for inactive clone-plan rows with no assigned + environment. +* Fixed Newton replication to apply per-source world transforms when adding + prototypes to cloned worlds, instead of always offsetting from ``env_0``. + + 0.13.4 (2026-06-12) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip b/source/isaaclab_tasks/changelog.d/huidongc-fix-test-failure.skip deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/source/isaaclab_tasks/changelog.d/huidongc-heterogeneous-ovrtx-cloning.skip b/source/isaaclab_tasks/changelog.d/huidongc-heterogeneous-ovrtx-cloning.skip deleted file mode 100644 index e69de29bb2d1..000000000000 From a78f0ff8a9510fb1e3f264db07376738e21aec7a Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 13 Jun 2026 17:52:01 +0800 Subject: [PATCH 04/32] Cherry-picks pyglet and visualizer fixes from develop (#6180) # Description Cherry pick visualizer fixes from develop: - #6176 - #6179 --------- Co-authored-by: ooctipus --- .../overview/core-concepts/visualization.rst | 12 ++++++++ ...zhengyuz-newton-pyglet-install-message.rst | 5 ++++ ...ngyuz-sim-reset-visualizer-before-play.rst | 4 +++ .../isaaclab/isaaclab/cli/commands/install.py | 4 ++- .../isaaclab/sim/simulation_context.py | 6 ++-- .../test_simulation_context_visualizers.py | 29 +++++++++++++++++++ .../zhengyuz-newton-gl-pyglet-dependency.rst | 5 ++++ source/isaaclab_newton/setup.py | 1 + .../zhengyuz-newton-pyglet-dependency.rst | 5 ++++ source/isaaclab_visualizers/setup.py | 1 + 10 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst create mode 100644 source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst create mode 100644 source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst create mode 100644 source/isaaclab_visualizers/changelog.d/zhengyuz-newton-pyglet-dependency.rst diff --git a/docs/source/overview/core-concepts/visualization.rst b/docs/source/overview/core-concepts/visualization.rst index 4b4c5afa06e1..defc678e26fc 100644 --- a/docs/source/overview/core-concepts/visualization.rst +++ b/docs/source/overview/core-concepts/visualization.rst @@ -646,6 +646,18 @@ The visualizer will still function correctly but may experience reduced performa CPU copy operations instead of direct GPU memory sharing. +**Newton Visualizer OpenGL Context Failures** + +The Newton visualizer is an OpenGL window. If pyglet reports that +``glCreateShader`` is not exported or that OpenGL 2.0 is required, the Python +process did not receive a usable OpenGL 2.0+ context from the active Windows or +Linux display session. This usually means the process is running in a +non-interactive/service session, through a remote desktop path without GPU +OpenGL acceleration, or with a software/basic OpenGL provider instead of the +NVIDIA driver. Run from a GPU-backed interactive display session, or omit +``--visualizer newton`` for headless inference. + + **Newton Visualizer on Spark with Conda** When running the Newton visualizer on Spark inside a conda environment, conda-installed X11 libraries diff --git a/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst b/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst new file mode 100644 index 000000000000..a9bb06a2fa67 --- /dev/null +++ b/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst @@ -0,0 +1,5 @@ +Changed +^^^^^^^ + +* Updated the ``newton`` extra installation message to list the Newton GL + viewer's ``pyglet`` dependency. diff --git a/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst b/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst new file mode 100644 index 000000000000..fd9b7a25138d --- /dev/null +++ b/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed SimulationContext reset ordering so initial visualizers are created before the timeline play event pump can invalidate freshly created PhysX tensor views. diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index da9311992e17..808831681a42 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -652,7 +652,9 @@ def _install_extra_feature(feature_name: str, selector: str = "") -> None: elif feature_name == "newton": if selector: print_warning(f"'newton' does not support selectors (got '{selector}'). Installing all newton extras.") - print_info("Installing newton extras (newton[sim], PyOpenGL-accelerate, imgui-bundle, typing-extensions)...") + print_info( + "Installing newton extras (newton[sim], pyglet, PyOpenGL-accelerate, imgui-bundle, typing-extensions)..." + ) run_command(pip_cmd + ["install", "--editable", f"{source_dir}/isaaclab_newton[all]"]) run_command(pip_cmd + ["install", "--editable", f"{source_dir}/isaaclab_physx[newton]"]) run_command(pip_cmd + ["install", "--editable", f"{source_dir}/isaaclab_visualizers[newton]"]) diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 6267ca0710c0..0f66cad6ea02 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -720,11 +720,11 @@ def reset(self, soft: bool = False) -> None: self.physics_manager.reset(soft) for viz in self._visualizers: viz.reset(soft) - # Start the timeline so the play button is pressed - self.physics_manager.play() if not self._visualizers: - # Initialize visualizers after PhysX sim view is ready. + # Initialize visualizers after PhysX sim views are ready, but before play() pumps timeline events. self.initialize_visualizers() + # Start the timeline so the play button is pressed + self.physics_manager.play() self._is_playing = True self._is_stopped = False diff --git a/source/isaaclab/test/sim/test_simulation_context_visualizers.py b/source/isaaclab/test/sim/test_simulation_context_visualizers.py index 3fe816b86d6d..40ee55884e56 100644 --- a/source/isaaclab/test/sim/test_simulation_context_visualizers.py +++ b/source/isaaclab/test/sim/test_simulation_context_visualizers.py @@ -194,6 +194,35 @@ def test_update_visualizers_handles_training_pause_loop(): assert viz.step_calls == [0.0, 0.2] +def test_reset_initializes_visualizers_before_playing_timeline(): + """Initial visualizers must see the PhysX views created by reset before play() pumps timeline events.""" + events: list[str] = [] + ctx = object.__new__(SimulationContext) + ctx._visualizers = [] + + class _PhysicsManager: + @staticmethod + def reset(soft=False): + events.append(f"reset:{soft}") + + @staticmethod + def play(): + events.append("play") + + def _initialize_visualizers(): + events.append("initialize_visualizers") + ctx._visualizers = [_FakeVisualizer()] + + ctx.physics_manager = _PhysicsManager() + ctx.initialize_visualizers = _initialize_visualizers + + ctx.reset() + + assert events == ["reset:False", "initialize_visualizers", "play"] + assert ctx.is_playing() + assert not ctx.is_stopped() + + class _DummyViserSceneDataProvider: @property def num_envs(self) -> int: diff --git a/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst b/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst new file mode 100644 index 000000000000..f7268e82e9e1 --- /dev/null +++ b/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Added an explicit ``pyglet>=2.1.6,<3`` dependency for Newton GL video + recording support. diff --git a/source/isaaclab_newton/setup.py b/source/isaaclab_newton/setup.py index d6012a653d2c..55f9e29c608c 100644 --- a/source/isaaclab_newton/setup.py +++ b/source/isaaclab_newton/setup.py @@ -39,6 +39,7 @@ def run(self): "all": [ "prettytable==3.3.0", "PyOpenGL-accelerate==3.1.10", + "pyglet>=2.1.6,<3", "newton[sim]==1.2.1", ], } diff --git a/source/isaaclab_visualizers/changelog.d/zhengyuz-newton-pyglet-dependency.rst b/source/isaaclab_visualizers/changelog.d/zhengyuz-newton-pyglet-dependency.rst new file mode 100644 index 000000000000..fca37d799265 --- /dev/null +++ b/source/isaaclab_visualizers/changelog.d/zhengyuz-newton-pyglet-dependency.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Added an explicit ``pyglet>=2.1.6,<3`` dependency for the Newton visualizer + extra so the OpenGL viewer does not rely on ambient transitive installs. diff --git a/source/isaaclab_visualizers/setup.py b/source/isaaclab_visualizers/setup.py index 4ddbad0ddba9..69659195a03a 100644 --- a/source/isaaclab_visualizers/setup.py +++ b/source/isaaclab_visualizers/setup.py @@ -26,6 +26,7 @@ "warp-lang", "newton[sim]==1.2.1", "PyOpenGL-accelerate", + "pyglet>=2.1.6,<3", "imgui-bundle>=1.92.601", "typing-extensions==4.12.2", "pydantic>=2.7,<2.12", From b2e3a3d36fc9b49c6573f102ed850157f84e335a Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 13 Jun 2026 22:59:17 +0800 Subject: [PATCH 05/32] Fix Pink IK USD-to-URDF conversion on aarch64 (#6177) (#6181) # Description - Remove the Pink IK runtime dependency on `nvidia.srl` and use Isaac Sim's built-in `isaacsim.asset.exporter.urdf` converter. - Normalize generated URDF joint limits so Pinocchio accepts Isaac Sim exporter output (`effort`/`velocity` defaults and `inf` cleanup). - Align affected GR1T2 and G1-Inspire Pink IK frame names with the link/frame names produced by the Isaac Sim exporter. - Remove the `nvidia-srl-usd-to-urdf` dependency from `isaaclab_mimic`. - `python -m py_compile docs/conf.py source/isaaclab/isaaclab/controllers/utils.py source/isaaclab/test/controllers/test_controller_utils.py source/isaaclab_tasks/isaaclab_tasks/contrib/pick_place/nutpour_gr1t2_pink_ik_env_cfg.py source/isaaclab_tasks/isaaclab_tasks/contrib/pick_place/exhaustpipe_gr1t2_pink_ik_env_cfg.py source/isaaclab_tasks/isaaclab_tasks/contrib/pick_place/pickplace_gr1t2_env_cfg.py source/isaaclab_tasks/isaaclab_tasks/contrib/pick_place/pickplace_unitree_g1_inspire_hand_env_cfg.py` - `git diff --check` - Direct mocked smoke test of `convert_usd_to_urdf()` using Isaac Sim exporter modules. - Generated GR1T2 and G1-Inspire URDFs with `isaacsim.asset.exporter.urdf`, sanitized them with the new utility, and verified Pinocchio can load them and contains the adjusted target frames: - `GR1T2_fourier_hand_6dof.urdf nq 54 nv 54 missing frames []` - `g1_29dof_inspire_hand.urdf nq 53 nv 53 missing frames []` - Attempted focused pytest through `./isaaclab.sh -p -m pytest source/isaaclab/test/controllers/test_controller_utils.py -k convert_usd_to_urdf_uses_isaacsim_exporter -q`, but this worktree uses system Python and is missing `lazy_loader`. - Attempted Ruff on touched files, but no local Python environment had Ruff installed. ## Type of change - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (existing functionality will not work without user modification) - Documentation update ## Screenshots Please attach before and after screenshots of the change if applicable. ## Checklist - [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there Co-authored-by: ooctipus --- docs/conf.py | 1 - .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ++ source/isaaclab/isaaclab/controllers/utils.py | 54 +++++++------- source/isaaclab/setup.py | 2 +- .../test/controllers/test_controller_utils.py | 71 ++++++++++++++++++- .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ++ source/isaaclab_mimic/setup.py | 4 -- .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ++ .../exhaustpipe_gr1t2_pink_ik_env_cfg.py | 8 +-- .../nutpour_gr1t2_pink_ik_env_cfg.py | 8 +-- .../pick_place/pickplace_gr1t2_env_cfg.py | 8 +-- ...ckplace_unitree_g1_inspire_hand_env_cfg.py | 8 +-- 12 files changed, 121 insertions(+), 55 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst create mode 100644 source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst create mode 100644 source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst diff --git a/docs/conf.py b/docs/conf.py index 028dd4d84b5c..f40345418083 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -233,7 +233,6 @@ "pink", "pinocchio", "qpsolvers", - "nvidia.srl", "flatdict", "filelock", "IPython", diff --git a/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst new file mode 100644 index 000000000000..5ea36fffa9f8 --- /dev/null +++ b/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed Pink IK USD-to-URDF conversion to use Isaac Sim's URDF exporter instead of the unavailable ``nvidia.srl`` package. diff --git a/source/isaaclab/isaaclab/controllers/utils.py b/source/isaaclab/isaaclab/controllers/utils.py index bd772329c427..7905f178d759 100644 --- a/source/isaaclab/isaaclab/controllers/utils.py +++ b/source/isaaclab/isaaclab/controllers/utils.py @@ -14,6 +14,7 @@ import os import re import sys +import xml.etree.ElementTree as ET # import logger logger = logging.getLogger(__name__) @@ -42,48 +43,41 @@ def convert_usd_to_urdf(usd_path: str, output_path: str, force_conversion: bool enable_extension("isaacsim.asset.exporter.urdf") - from nvidia.srl.from_usd.to_urdf import UsdToUrdf - - usd_to_urdf_kwargs = { - "node_names_to_remove": None, - "edge_names_to_remove": None, - "root": None, - "parent_link_is_body_1": None, - "log_level": logging.ERROR, - } - urdf_output_dir = os.path.join(output_path, "urdf") - urdf_file_name = os.path.basename(usd_path).split(".")[0] + ".urdf" - urdf_output_path = urdf_output_dir + "/" + urdf_file_name + urdf_file_name = os.path.splitext(os.path.basename(usd_path))[0] + ".urdf" + urdf_output_path = os.path.join(urdf_output_dir, urdf_file_name) urdf_meshes_output_dir = os.path.join(output_path, "meshes") if not os.path.exists(urdf_output_path) or not os.path.exists(urdf_meshes_output_dir) or force_conversion: - usd_to_urdf = UsdToUrdf.init_from_file(usd_path, **usd_to_urdf_kwargs) os.makedirs(urdf_output_dir, exist_ok=True) os.makedirs(urdf_meshes_output_dir, exist_ok=True) - output_path = usd_to_urdf.save_to_file( - urdf_output_path=urdf_output_path, + from isaacsim.asset.exporter.urdf import UsdToUrdfConverter + + usd_to_urdf = UsdToUrdfConverter( + stage=usd_path, + root_prim_path=None, + mesh_dir_name="../meshes", + mesh_path_prefix="../meshes/", visualize_collision_meshes=False, - mesh_dir=urdf_meshes_output_dir, - mesh_path_prefix="", ) + usd_to_urdf.convert(urdf_output_path) - # The current version of the usd to urdf converter creates "inf" effort, - # This has to be replaced with a max value for the urdf to be valid - # Open the file for reading and writing - with open(urdf_output_path) as file: - # Read the content of the file - content = file.read() + _sanitize_urdf_for_pinocchio(urdf_output_path) + return urdf_output_path, urdf_meshes_output_dir - # Replace all occurrences of 'inf' with '0' - content = content.replace("inf", "0.") - # Open the file again to write the modified content - with open(urdf_output_path, "w") as file: - # Write the modified content back to the file - file.write(content) - return urdf_output_path, urdf_meshes_output_dir +def _sanitize_urdf_for_pinocchio(urdf_path: str) -> None: + """Fill Pinocchio-required non-kinematic joint-limit fields in exported URDFs.""" + tree = ET.parse(urdf_path) + changed = False + for limit in tree.iter("limit"): + for attr in ("effort", "velocity"): + if limit.get(attr) in {None, "inf", "+inf", "-inf"}: + limit.set(attr, "0.") + changed = True + if changed: + tree.write(urdf_path, encoding="unicode") def change_revolute_to_fixed(urdf_path: str, fixed_joints: list[str], verbose: bool = False): diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index a7f6f6c3127e..1fd411971fde 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -73,7 +73,7 @@ ] # Adds OpenUSD dependencies based on architecture for Kit less mode. INSTALL_REQUIRES += [ - f"usd-core==25.11.0 ; ({SUPPORTED_ARCHS})", + f"usd-core>=25.11,<26.0 ; ({SUPPORTED_ARCHS})", f"usd-exchange>=2.2 ; ({SUPPORTED_ARCHS_ARM})", ] diff --git a/source/isaaclab/test/controllers/test_controller_utils.py b/source/isaaclab/test/controllers/test_controller_utils.py index 80a839a847f4..5c33ce7d818e 100644 --- a/source/isaaclab/test/controllers/test_controller_utils.py +++ b/source/isaaclab/test/controllers/test_controller_utils.py @@ -13,14 +13,19 @@ simulation_app = AppLauncher(headless=True).app import os - -# Import the function to test +import sys import tempfile +import xml.etree.ElementTree as ET +from types import ModuleType import pytest import torch -from isaaclab.controllers.utils import change_revolute_to_fixed, change_revolute_to_fixed_regex +from isaaclab.controllers.utils import ( + change_revolute_to_fixed, + change_revolute_to_fixed_regex, + convert_usd_to_urdf, +) from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR, retrieve_file_path from isaaclab.utils.io.torchscript import load_torchscript_model @@ -121,6 +126,66 @@ def test_urdf_file(mock_urdf_content): shutil.rmtree(test_dir) +def _mock_module(monkeypatch, name: str) -> ModuleType: + module = ModuleType(name) + monkeypatch.setitem(sys.modules, name, module) + return module + + +def _mock_isaacsim_app(monkeypatch): + for module_name in ( + "isaacsim", + "isaacsim.core", + "isaacsim.core.experimental", + "isaacsim.core.experimental.utils", + ): + _mock_module(monkeypatch, module_name).__path__ = [] + enabled_extensions = [] + app_module = _mock_module(monkeypatch, "isaacsim.core.experimental.utils.app") + app_module.enable_extension = enabled_extensions.append + return enabled_extensions + + +def test_convert_usd_to_urdf_uses_isaacsim_exporter(monkeypatch, tmp_path): + """Test that USD-to-URDF conversion uses Isaac Sim's URDF exporter.""" + enabled_extensions = _mock_isaacsim_app(monkeypatch) + for module_name in ("isaacsim.asset", "isaacsim.asset.exporter"): + _mock_module(monkeypatch, module_name).__path__ = [] + + converter_args = {} + + class MockUsdToUrdfConverter: + def __init__(self, **kwargs): + converter_args.update(kwargs) + + def convert(self, output_path): + with open(output_path, "w") as file: + file.write( + '' + '' + ) + + urdf_module = _mock_module(monkeypatch, "isaacsim.asset.exporter.urdf") + urdf_module.UsdToUrdfConverter = MockUsdToUrdfConverter + + urdf_path, mesh_path = convert_usd_to_urdf("/assets/gr1.usd", str(tmp_path)) + + assert enabled_extensions == ["isaacsim.asset.exporter.urdf"] + assert converter_args == { + "stage": "/assets/gr1.usd", + "root_prim_path": None, + "mesh_dir_name": "../meshes", + "mesh_path_prefix": "../meshes/", + "visualize_collision_meshes": False, + } + assert (urdf_path, mesh_path) == (str(tmp_path / "urdf" / "gr1.urdf"), str(tmp_path / "meshes")) + limit = ET.parse(urdf_path).find("joint/limit") + assert limit.attrib["lower"] == "-inf" + assert limit.attrib["upper"] == "inf" + assert limit.attrib["effort"] == "0." + assert limit.attrib["velocity"] == "0." + + # ============================================================================= # Test cases for change_revolute_to_fixed function # ============================================================================= diff --git a/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst new file mode 100644 index 000000000000..adcb18444bf2 --- /dev/null +++ b/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst @@ -0,0 +1,4 @@ +Removed +^^^^^^^ + +* Removed the ``nvidia-srl-usd-to-urdf`` dependency now that Pink IK conversion uses Isaac Sim's URDF exporter. diff --git a/source/isaaclab_mimic/setup.py b/source/isaaclab_mimic/setup.py index 7b1aa19f6b79..3f5b27ae3587 100644 --- a/source/isaaclab_mimic/setup.py +++ b/source/isaaclab_mimic/setup.py @@ -25,10 +25,6 @@ "h5py==3.15.1", ] -# nvidia-srl-usd-to-urdf depends on usd-core which has no aarch64 wheels -if platform.machine() != "aarch64": - INSTALL_REQUIRES.append("nvidia-srl-usd-to-urdf") - # robomimic has no Windows/macOS wheels; only add it on Linux if platform.system() == "Linux": INSTALL_REQUIRES.append("robomimic @ git+https://github.com/ARISE-Initiative/robomimic.git@v0.4.0") diff --git a/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst new file mode 100644 index 000000000000..c2e47310a87b --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Updated GR1T2 and G1-Inspire Pink IK task frame names to match URDFs generated by Isaac Sim's exporter. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_pink_ik_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_pink_ik_env_cfg.py index 0ac003f6a8e4..f3cada601dbe 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_pink_ik_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_pink_ik_env_cfg.py @@ -82,14 +82,14 @@ def __post_init__(self): fail_on_joint_limit_violation=False, variable_input_tasks=[ FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_left_hand_pitch_link", + frame="left_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps gain=0.5, ), FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_right_hand_pitch_link", + frame="right_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps @@ -102,8 +102,8 @@ def __post_init__(self): cost=0.2, lm_damping=1, controlled_frames=[ - "GR1T2_fourier_hand_6dof_left_hand_pitch_link", - "GR1T2_fourier_hand_6dof_right_hand_pitch_link", + "left_hand_pitch_link", + "right_hand_pitch_link", ], controlled_joints=[ "left_shoulder_pitch_joint", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_pink_ik_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_pink_ik_env_cfg.py index 5afad1f238fc..880836d03fa1 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_pink_ik_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_pink_ik_env_cfg.py @@ -80,14 +80,14 @@ def __post_init__(self): fail_on_joint_limit_violation=False, variable_input_tasks=[ FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_left_hand_pitch_link", + frame="left_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps gain=0.5, ), FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_right_hand_pitch_link", + frame="right_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps @@ -100,8 +100,8 @@ def __post_init__(self): cost=0.2, lm_damping=1, controlled_frames=[ - "GR1T2_fourier_hand_6dof_left_hand_pitch_link", - "GR1T2_fourier_hand_6dof_right_hand_pitch_link", + "left_hand_pitch_link", + "right_hand_pitch_link", ], controlled_joints=[ "left_shoulder_pitch_joint", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_env_cfg.py index c736375ab96e..a0ab8a89afa6 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_gr1t2_env_cfg.py @@ -402,14 +402,14 @@ class ActionsCfg: fail_on_joint_limit_violation=False, variable_input_tasks=[ FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_left_hand_pitch_link", + frame="left_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=12, # dampening for solver for step jumps gain=0.5, ), FrameTaskCfg( - frame="GR1T2_fourier_hand_6dof_right_hand_pitch_link", + frame="right_hand_pitch_link", position_cost=8.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=12, # dampening for solver for step jumps @@ -422,8 +422,8 @@ class ActionsCfg: cost=0.5, lm_damping=1, controlled_frames=[ - "GR1T2_fourier_hand_6dof_left_hand_pitch_link", - "GR1T2_fourier_hand_6dof_right_hand_pitch_link", + "left_hand_pitch_link", + "right_hand_pitch_link", ], controlled_joints=[ "left_shoulder_pitch_joint", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_unitree_g1_inspire_hand_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_unitree_g1_inspire_hand_env_cfg.py index 8afa97e6a42c..e7412ac41ea7 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_unitree_g1_inspire_hand_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/pickplace_unitree_g1_inspire_hand_env_cfg.py @@ -397,14 +397,14 @@ class ActionsCfg: fail_on_joint_limit_violation=False, variable_input_tasks=[ FrameTaskCfg( - frame="g1_29dof_rev_1_0_left_wrist_yaw_link", + frame="left_wrist_yaw_link", position_cost=8.0, # [cost] / [m] orientation_cost=2.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps gain=0.5, ), FrameTaskCfg( - frame="g1_29dof_rev_1_0_right_wrist_yaw_link", + frame="right_wrist_yaw_link", position_cost=8.0, # [cost] / [m] orientation_cost=2.0, # [cost] / [rad] lm_damping=10, # dampening for solver for step jumps @@ -414,8 +414,8 @@ class ActionsCfg: cost=0.5, lm_damping=1, controlled_frames=[ - "g1_29dof_rev_1_0_left_wrist_yaw_link", - "g1_29dof_rev_1_0_right_wrist_yaw_link", + "left_wrist_yaw_link", + "right_wrist_yaw_link", ], controlled_joints=[ "left_shoulder_pitch_joint", From 22e01a4080e848854e06a9d2d6ccacf22c3e5507 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 13 Jun 2026 22:59:27 +0800 Subject: [PATCH 06/32] Updates Isaac Sim docker version (#6169) # Description Updates Isaac Sim docker version to the latest released 6.0.0 version. ## Type of change - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- docker/.env.base | 5 ++--- docs/source/setup/installation/index.rst | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/.env.base b/docker/.env.base index 0cc9ff09c016..555a91fd5aea 100644 --- a/docker/.env.base +++ b/docker/.env.base @@ -6,9 +6,8 @@ ACCEPT_EULA=Y # NVIDIA Isaac Sim base image ISAACSIM_BASE_IMAGE=nvcr.io/nvidia/isaac-sim -# NVIDIA Isaac Sim version to use (e.g. 6.0.0-dev2) -# TODO(AntoineRichard): Revert to stable 6.0.0 tag once it ships on NGC -ISAACSIM_VERSION=6.0.0-dev2 +# NVIDIA Isaac Sim version to use (e.g. 6.0.0) +ISAACSIM_VERSION=6.0.0 # Derived from the default path in the NVIDIA provided Isaac Sim container DOCKER_ISAACSIM_ROOT_PATH=/isaac-sim # The Isaac Lab path in the container diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index 4cd77653be64..958f780507d2 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -108,6 +108,8 @@ Other notable limitations with respect to Isaac Lab include... ``pytetwild`` wheel is available for ARM (aarch64). ``pytetwild`` is required for automatic tetrahedral mesh generation of volume deformables. +#. RLinf support has not been verified on DGX Spark. + .. note:: **Build prerequisites on aarch64:** Some Python packages (notably ``imgui-bundle`` and ``quadprog``) do not ship From d68a258dce2bbbc378d68cd64a7308eeebbd56c8 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Sun, 14 Jun 2026 06:34:34 +0000 Subject: [PATCH 07/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.9 → 6.1.10 - isaaclab_mimic: 1.3.1 → 1.3.2 - isaaclab_newton: 0.13.5 → 0.13.6 - isaaclab_tasks: 1.10.7 → 1.10.8 --- .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ---- .../zhengyuz-newton-pyglet-install-message.rst | 5 ----- ...zhengyuz-sim-reset-visualizer-before-play.rst | 4 ---- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 16 ++++++++++++++++ .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ---- source/isaaclab_mimic/config/extension.toml | 2 +- source/isaaclab_mimic/docs/CHANGELOG.rst | 9 +++++++++ .../zhengyuz-newton-gl-pyglet-dependency.rst | 5 ----- source/isaaclab_newton/config/extension.toml | 2 +- source/isaaclab_newton/docs/CHANGELOG.rst | 10 ++++++++++ .../changelog.d/fix-pink-ik-urdf-exporter.rst | 4 ---- source/isaaclab_tasks/config/extension.toml | 2 +- source/isaaclab_tasks/docs/CHANGELOG.rst | 9 +++++++++ 14 files changed, 48 insertions(+), 30 deletions(-) delete mode 100644 source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst delete mode 100644 source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst delete mode 100644 source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst delete mode 100644 source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst delete mode 100644 source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst delete mode 100644 source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst diff --git a/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst deleted file mode 100644 index 5ea36fffa9f8..000000000000 --- a/source/isaaclab/changelog.d/fix-pink-ik-urdf-exporter.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Fixed Pink IK USD-to-URDF conversion to use Isaac Sim's URDF exporter instead of the unavailable ``nvidia.srl`` package. diff --git a/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst b/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst deleted file mode 100644 index a9bb06a2fa67..000000000000 --- a/source/isaaclab/changelog.d/zhengyuz-newton-pyglet-install-message.rst +++ /dev/null @@ -1,5 +0,0 @@ -Changed -^^^^^^^ - -* Updated the ``newton`` extra installation message to list the Newton GL - viewer's ``pyglet`` dependency. diff --git a/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst b/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst deleted file mode 100644 index fd9b7a25138d..000000000000 --- a/source/isaaclab/changelog.d/zhengyuz-sim-reset-visualizer-before-play.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Fixed SimulationContext reset ordering so initial visualizers are created before the timeline play event pump can invalidate freshly created PhysX tensor views. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 6fa6f95205e4..32062458944d 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.9" +version = "6.1.10" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 9bce7beb9249..64afab50dc0f 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,22 @@ Changelog --------- +6.1.10 (2026-06-14) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Updated the ``newton`` extra installation message to list the Newton GL + viewer's ``pyglet`` dependency. + +Fixed +^^^^^ + +* Fixed SimulationContext reset ordering so initial visualizers are created before the timeline play event pump can invalidate freshly created PhysX tensor views. +* Fixed Pink IK USD-to-URDF conversion to use Isaac Sim's URDF exporter instead of the unavailable ``nvidia.srl`` package. + + 6.1.9 (2026-06-13) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst deleted file mode 100644 index adcb18444bf2..000000000000 --- a/source/isaaclab_mimic/changelog.d/fix-pink-ik-urdf-exporter.rst +++ /dev/null @@ -1,4 +0,0 @@ -Removed -^^^^^^^ - -* Removed the ``nvidia-srl-usd-to-urdf`` dependency now that Pink IK conversion uses Isaac Sim's URDF exporter. diff --git a/source/isaaclab_mimic/config/extension.toml b/source/isaaclab_mimic/config/extension.toml index 7a5b5368d57e..c418bcf7945d 100644 --- a/source/isaaclab_mimic/config/extension.toml +++ b/source/isaaclab_mimic/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "1.3.1" +version = "1.3.2" # Description category = "isaaclab" diff --git a/source/isaaclab_mimic/docs/CHANGELOG.rst b/source/isaaclab_mimic/docs/CHANGELOG.rst index ceb7a15c9ca8..b9f784799910 100644 --- a/source/isaaclab_mimic/docs/CHANGELOG.rst +++ b/source/isaaclab_mimic/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +1.3.2 (2026-06-14) +~~~~~~~~~~~~~~~~~~ + +Removed +^^^^^^^ + +* Removed the ``nvidia-srl-usd-to-urdf`` dependency now that Pink IK conversion uses Isaac Sim's URDF exporter. + + 1.3.1 (2026-06-02) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst b/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst deleted file mode 100644 index f7268e82e9e1..000000000000 --- a/source/isaaclab_newton/changelog.d/zhengyuz-newton-gl-pyglet-dependency.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fixed -^^^^^ - -* Added an explicit ``pyglet>=2.1.6,<3`` dependency for Newton GL video - recording support. diff --git a/source/isaaclab_newton/config/extension.toml b/source/isaaclab_newton/config/extension.toml index b8dea3e567ad..e67c1ac65c88 100644 --- a/source/isaaclab_newton/config/extension.toml +++ b/source/isaaclab_newton/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.13.5" +version = "0.13.6" # Description title = "Newton simulation interfaces for IsaacLab core package" diff --git a/source/isaaclab_newton/docs/CHANGELOG.rst b/source/isaaclab_newton/docs/CHANGELOG.rst index 50abe94d0394..b64d8bb158f4 100644 --- a/source/isaaclab_newton/docs/CHANGELOG.rst +++ b/source/isaaclab_newton/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +0.13.6 (2026-06-14) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Added an explicit ``pyglet>=2.1.6,<3`` dependency for Newton GL video + recording support. + + 0.13.5 (2026-06-13) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst b/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst deleted file mode 100644 index c2e47310a87b..000000000000 --- a/source/isaaclab_tasks/changelog.d/fix-pink-ik-urdf-exporter.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Updated GR1T2 and G1-Inspire Pink IK task frame names to match URDFs generated by Isaac Sim's exporter. diff --git a/source/isaaclab_tasks/config/extension.toml b/source/isaaclab_tasks/config/extension.toml index 692422d1aad3..ee18975d8eed 100644 --- a/source/isaaclab_tasks/config/extension.toml +++ b/source/isaaclab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "1.10.7" +version = "1.10.8" # Description title = "Isaac Lab Environments" diff --git a/source/isaaclab_tasks/docs/CHANGELOG.rst b/source/isaaclab_tasks/docs/CHANGELOG.rst index 4a514d3343b5..37c96b73f38c 100644 --- a/source/isaaclab_tasks/docs/CHANGELOG.rst +++ b/source/isaaclab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +1.10.8 (2026-06-14) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Updated GR1T2 and G1-Inspire Pink IK task frame names to match URDFs generated by Isaac Sim's exporter. + + 1.10.7 (2026-06-12) ~~~~~~~~~~~~~~~~~~~ From 9b45c9173b36fed8aa126081370ee231815cfae8 Mon Sep 17 00:00:00 2001 From: Sheikh Dawood <7774242+sheikh-nv@users.noreply.github.com> Date: Sun, 14 Jun 2026 23:24:43 -0500 Subject: [PATCH 08/32] ci: pin third-party GitHub Actions to commit SHAs (#6187) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Pins the third-party GitHub Actions referenced in the CI workflows to full-length commit SHAs, keeping the human-readable version as a trailing comment. This follows GitHub's supply-chain hardening guidance, which recommends pinning third-party actions to an immutable commit SHA rather than a mutable tag. Actions pinned (current tag -> SHA): - `lycheeverse/lychee-action` v2 -> `8646ba30535128ac92d33dfc9133794bfdd9b411` (check-links.yml) - `dorny/test-reporter` v2.6.0 -> `3d76b34a4535afbd0600d347b09a6ee5deb3ed7f` (daily-compatibility.yml) - `peaceiris/actions-gh-pages` v4 -> `84c30a85c19949d7eee79c4ff27748b70285e453` (docs.yaml) - `pre-commit/action` v3.0.0 -> `646c83fcd040023954eafda54b4db0192ce70507` (pre-commit.yaml) - `docker/setup-qemu-action` v3 -> `c7c53464625b32c7a7e944ae62b3e17d2b600130` (publish-images.yaml) - `docker/setup-buildx-action` v3 -> `8d2750c68a42422c14e847fe6c8ac0403b4cbd6f` (publish-images.yaml) No functional change; first-party `actions/*` are left as-is. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the contribution guidelines - [ ] I have run the `pre-commit` checks with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added a changelog fragment under `source//changelog.d/` for every touched package (N/A — CI-only change, no package touched) - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- .github/workflows/check-links.yml | 2 +- .github/workflows/daily-compatibility.yml | 2 +- .github/workflows/docs.yaml | 2 +- .github/workflows/pre-commit.yaml | 2 +- .github/workflows/publish-images.yaml | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index b4a66e2d6c84..ef9c4c3cff2c 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -68,7 +68,7 @@ jobs: - name: Run Link Checker if: steps.check_docs.outputs.run_job == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' - uses: lycheeverse/lychee-action@v2 + uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2.8.0 with: # Check all markdown files and documentation # Excluded are known crawl blockers diff --git a/.github/workflows/daily-compatibility.yml b/.github/workflows/daily-compatibility.yml index 4e018cc31ab4..36a92cc06d49 100644 --- a/.github/workflows/daily-compatibility.yml +++ b/.github/workflows/daily-compatibility.yml @@ -229,7 +229,7 @@ jobs: compression-level: 9 - name: Report Test Results - uses: dorny/test-reporter@v2.6.0 + uses: dorny/test-reporter@3d76b34a4535afbd0600d347b09a6ee5deb3ed7f # v2.6.0 if: always() with: name: IsaacLab Compatibility Test Results (${{ github.event_name }}) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 013be3a5b126..3cd82625c724 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -127,7 +127,7 @@ jobs: path: ./docs/_build - name: Deploy to gh-pages - uses: peaceiris/actions-gh-pages@v4 + uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/_build diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index ef7e5a820512..d8aad727c3ea 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -21,4 +21,4 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.12" - - uses: pre-commit/action@v3.0.0 + - uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507 # v3.0.0 diff --git a/.github/workflows/publish-images.yaml b/.github/workflows/publish-images.yaml index d986142ac8b3..b58d56eaed2c 100644 --- a/.github/workflows/publish-images.yaml +++ b/.github/workflows/publish-images.yaml @@ -64,12 +64,12 @@ jobs: lfs: true - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 with: platforms: linux/arm64 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 with: platforms: linux/amd64,linux/arm64 driver-opts: | From 2a351dfd0c953208e939bbb50f1bc96d53a68c1f Mon Sep 17 00:00:00 2001 From: mingxueg Date: Mon, 15 Jun 2026 17:41:36 +0800 Subject: [PATCH 09/32] Cherry-pick: Updates Rlinf docs (#6172) # Description Add a note to the RLinf VLA post-training docs that Windows support is still being optimized and Linux is recommended for RLinf training and evaluation. ## Type of change - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- docs/source/experimental-features/rlinf_vla_posttraining.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/experimental-features/rlinf_vla_posttraining.rst b/docs/source/experimental-features/rlinf_vla_posttraining.rst index c3993e8f57f1..3b0873cffccf 100644 --- a/docs/source/experimental-features/rlinf_vla_posttraining.rst +++ b/docs/source/experimental-features/rlinf_vla_posttraining.rst @@ -168,6 +168,11 @@ architecture from the base model and overlays the RL-finetuned weights The ``--config_path`` flag is optional. When omitted, the scripts automatically search the ``isaaclab_tasks`` package for the matching YAML configuration file. +.. note:: + + **Windows support is still being optimized.** For now, Linux is recommended for + RLinf training and evaluation. + Checkpoints ----------- From 9fb5bf7551585600e0391736c86580af66ca964f Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Mon, 15 Jun 2026 22:38:06 +0800 Subject: [PATCH 10/32] Updates docker version for release (#6189) # Description Updates docker image for release to latest 3.0.0.beta2 tag. ## Type of change - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- docs/source/deployment/docker.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst index c5a540de66a0..556ca4404393 100644 --- a/docs/source/deployment/docker.rst +++ b/docs/source/deployment/docker.rst @@ -322,7 +322,7 @@ To pull the minimal Isaac Lab container, run: .. code:: bash - docker pull nvcr.io/nvidia/isaac-lab:3.0.0-beta1 + docker pull nvcr.io/nvidia/isaac-lab:3.0.0.beta2 .. attention:: @@ -353,7 +353,7 @@ To run the Isaac Lab container with an interactive bash session, run: -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - nvcr.io/nvidia/isaac-lab:3.0.0-beta1 + nvcr.io/nvidia/isaac-lab:3.0.0.beta2 To enable rendering through X11 forwarding, run: @@ -372,7 +372,7 @@ To enable rendering through X11 forwarding, run: -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - nvcr.io/nvidia/isaac-lab:3.0.0-beta1 + nvcr.io/nvidia/isaac-lab:3.0.0.beta2 To run an example within the container, run: From d2f83834c9693a3a1fdd4fd7781ed6458245da41 Mon Sep 17 00:00:00 2001 From: rilei-nvidia Date: Tue, 16 Jun 2026 09:06:35 +1200 Subject: [PATCH 11/32] Fix newton shape color resolution when skipping USD cloning (#6186) # Description Fix newton shape color resolution when skipping USD cloning Commit e9fe73c skipped USD cloning in pure newton path. As a side effect, shape labels for non-clone-source envs point to USD prims that no longer exist, causing replace_newton_shape_colors to silently fallback to Newton's random palette colors. This fix updates _resolve_shape_color to use the iter_clone_plan_matches and resolve the source prim for cloned destination prims. ## Screenshots Please attach before and after screenshots of the change if applicable. | Before | After | | ------ | ----- | | image | image | ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- .../fix-newton-clone-plan-color-resolve.rst | 7 + .../isaaclab/sim/utils/newton_model_utils.py | 159 +++++++++++++++++- .../test/sim/test_newton_model_utils.py | 59 +++++++ .../fix-newton-clone-plan-color-resolve.rst | 7 + .../newton-newton_renderer-rgb.png | 4 +- .../newton-newton_renderer-rgba.png | 4 +- 6 files changed, 231 insertions(+), 9 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst create mode 100644 source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst diff --git a/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst b/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst new file mode 100644 index 000000000000..4edf17637020 --- /dev/null +++ b/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst @@ -0,0 +1,7 @@ +Fixed +^^^^^ + +* Fixed :func:`~isaaclab.sim.utils.newton_model_utils.replace_newton_shape_colors` incorrectly + keeping Newton's random palette colors for environments 1–N when USD cloning is skipped + Shape labels for non-source environments now resolve to the clone-plan source prim so + the correct USD material color is applied to all environments. diff --git a/source/isaaclab/isaaclab/sim/utils/newton_model_utils.py b/source/isaaclab/isaaclab/sim/utils/newton_model_utils.py index d94a309e5b55..caadfd838467 100644 --- a/source/isaaclab/isaaclab/sim/utils/newton_model_utils.py +++ b/source/isaaclab/isaaclab/sim/utils/newton_model_utils.py @@ -15,13 +15,19 @@ import logging import os import warnings -from typing import Any +from typing import TYPE_CHECKING, Any import numpy as np import warp as wp from pxr import Usd, UsdGeom, UsdShade +from isaaclab.sim import SimulationContext + +if TYPE_CHECKING: + from isaaclab.cloner import ClonePlan + + __all__ = ["replace_newton_shape_colors"] logger = logging.getLogger(__name__) @@ -195,6 +201,130 @@ def _get_primvar_display_color(shape_prim: Usd.Prim) -> tuple[float, float, floa return _coerce_color(primvar.Get()) +def _build_clone_source_map(missing_keys: set[str], clone_plan: ClonePlan) -> dict[str, str]: + """Map missing destination prim paths to their clone-plan source prim paths in one pass. + + In the Newton headless path USD cloning is skipped, so only the source env (env_0) has + real USD prims. Shape labels for all other envs point to paths that don't exist in the + stage. This function resolves them back to the source prim that was cloned into each env + so the correct material color can be read from an existing prim. + + Example: + Given a clone plan with source ``/World/envs/env_0/Robot`` cloned into envs 0-3, and + missing keys for envs 1-3:: + + missing_keys = { + "/World/envs/env_1/Robot/Mesh", + "/World/envs/env_2/Robot/Mesh", + "/World/envs/env_3/Robot/Mesh", + } + + The function returns:: + + { + "/World/envs/env_1/Robot/Mesh": "/World/envs/env_0/Robot/Mesh", + "/World/envs/env_2/Robot/Mesh": "/World/envs/env_0/Robot/Mesh", + "/World/envs/env_3/Robot/Mesh": "/World/envs/env_0/Robot/Mesh", + } + + In a heterogeneous scene where ``RobotA`` populates envs 0 and 2, and ``RobotB`` + populates envs 1 and 3, env_2 maps to ``RobotA``'s source and env_3 to ``RobotB``'s:: + + { + "/World/envs/env_2/Robot/Mesh": "/World/envs/env_0/RobotA/Mesh", + "/World/envs/env_3/Robot/Mesh": "/World/envs/env_1/RobotB/Mesh", + } + + Instead of querying the clone plan once per missing key (which scans all rows and applies a + compiled regex per call via :func:`~isaaclab.cloner.cloner_utils.iter_clone_plan_matches`), + this function iterates the clone-plan rows once and matches all missing keys against each source + using simple string prefix and digit checks. The total cost is O(R × K_miss) with a low + constant factor, where R is the number of clone-plan rows and K_miss = ``len(missing_keys)``. + + Rows are processed in decreasing order of instantiated template length so that more-specific + (deeper) templates take priority, matching + :func:`~isaaclab.cloner.cloner_utils.iter_clone_plan_matches` semantics. + + Args: + missing_keys: Destination prim paths absent from the USD stage. + clone_plan: Active clone plan. + + Returns: + Dict mapping each resolvable missing path to its clone-source prim path. + """ + from dataclasses import dataclass + + @dataclass + class _Source: + root: str + template_prefix: str # template prefix before the "{}" env-slot + template_suffix: str # template suffix after the "{}" env-slot + env_ids: frozenset[int] + + def instantiated_length(self) -> int: + """Length of the template when formatted with the smallest env id.""" + return len(self.template_prefix) + len(str(min(self.env_ids))) + len(self.template_suffix) + + result: dict[str, str] = {} + if not missing_keys: + return result + + # Pre-process rows: strip trailing slashes, split the template at the env-slot placeholder, + # and collect the populated env ids as a frozenset for O(1) membership checks. + sources: list[_Source] = [] + for row_idx, (root, dest_template) in enumerate(zip(clone_plan.sources, clone_plan.destinations)): + if "{}" not in dest_template: + continue + env_ids: frozenset[int] = frozenset( + int(j) for j in clone_plan.clone_mask[row_idx].nonzero(as_tuple=False).flatten().tolist() + ) + if not env_ids: + continue + template_prefix, template_suffix = dest_template.rstrip("/").split("{}", 1) + sources.append( + _Source( + root=root.rstrip("/"), template_prefix=template_prefix, template_suffix=template_suffix, env_ids=env_ids + ) + ) + + # Sort by instantiated template length descending, matching iter_clone_plan_matches semantics. + sources.sort(key=lambda r: r.instantiated_length(), reverse=True) + + # Match each destination prim path against one of the sources. + remaining_dest = set(missing_keys) + for source in sources: + if not remaining_dest: + break + resolved: set[str] = set() + for prim_path in remaining_dest: + # Reject paths that don't start with this source's template prefix. + if not prim_path.startswith(source.template_prefix): + continue + + # Extract the env-slot token: the path segment immediately after the prefix. + rest = prim_path[len(source.template_prefix) :] + slash = rest.find("/") + slot_str = rest[:slash] if slash >= 0 else rest + + # Reject if the slot is not a digit or doesn't belong to this source's env ids. + if not slot_str.isdigit() or int(slot_str) not in source.env_ids: + continue + + # Reject if the template_suffix-slot portion of the path doesn't match the template suffix. + after_slot = rest[len(slot_str) :] + if not after_slot.startswith(source.template_suffix): + continue + + # Everything after the instantiated template root is the asset suffix; + # prepend the source root to form the source prim path. + result[prim_path] = source.root + after_slot[len(source.template_suffix) :] + resolved.add(prim_path) + + remaining_dest -= resolved + + return result + + def _resolve_shape_color( stage: Usd.Stage, prim_path: str, @@ -202,6 +332,9 @@ def _resolve_shape_color( ) -> tuple[float, float, float] | None: """Resolve replacement linear RGB for one prim path (sRGB encoding is applied in the scatter kernel). + The caller is responsible for remapping missing destination prim paths to their clone-source + equivalents before calling this function (see :func:`_build_clone_source_map`). + Returns: Linear RGB to pass to :func:`_scatter_shape_color_rows_kernel`, or ``None`` to leave the row unchanged. """ @@ -305,23 +438,39 @@ def replace_newton_shape_colors(model: Any, stage: Usd.Stage | None = None) -> i stage = get_current_stage() - shape_keys: list[str] = [] + sim = SimulationContext.instance() + clone_plan = sim.get_clone_plan() if sim is not None else None + # Collect canonical lookup keys, tracking which labels had no prim in the stage. + # Missing labels are kept verbatim so _build_clone_source_map can map them back to + # their clone-source equivalents (Newton headless path skips USD cloning for env_1-N). + shape_keys: list[str] = [] + missing_key_set: set[str] = set() for label in shape_labels: prim = stage.GetPrimAtPath(label) - shape_keys.append(_canonical_prim_lookup_key(prim) if prim.IsValid() else label) + if prim.IsValid(): + shape_keys.append(_canonical_prim_lookup_key(prim)) + else: + shape_keys.append(label) + missing_key_set.add(label) # shape_keys must stay the same length as shape labels, to guarantee the correctness of # shape indices that will be used in the scatter kernel. assert num_shapes == len(shape_keys) + # Pre-build the dest -> source map for all missing keys in one clone-plan pass instead of + # calling iter_clone_plan_matches once per key (which applies a regex per call). + clone_source_map = ( + _build_clone_source_map(missing_key_set, clone_plan) if missing_key_set and clone_plan else {} + ) + resolved_color_cache: dict[str, tuple[float, float, float] | None] = {} material_color_cache: dict[str, tuple[float, float, float] | None] = {} unique_keys = dict.fromkeys(shape_keys) for key in unique_keys: - color = _resolve_shape_color(stage, key, material_color_cache) - resolved_color_cache[key] = color + lookup = clone_source_map.get(key, key) + resolved_color_cache[key] = _resolve_shape_color(stage, lookup, material_color_cache) # Prepare the indices and colors for the scatter kernel: # - Indices point to the slots in the shape_colors array that should be updated diff --git a/source/isaaclab/test/sim/test_newton_model_utils.py b/source/isaaclab/test/sim/test_newton_model_utils.py index cc157074fd42..ca5224da7472 100644 --- a/source/isaaclab/test/sim/test_newton_model_utils.py +++ b/source/isaaclab/test/sim/test_newton_model_utils.py @@ -19,9 +19,11 @@ from pxr import Gf, Sdf, Usd, UsdGeom, UsdShade +from isaaclab.cloner import ClonePlan from isaaclab.sim.utils.newton_model_utils import ( _OMNIPBR_DEFAULTS, _UNBOUND_DEFAULT_FALLBACK_GRAY, + _build_clone_source_map, _get_omnipbr_albedo, _resolve_shape_color, _scatter_shape_color_rows_kernel, @@ -514,3 +516,60 @@ def test_replace_newton_shape_colors_instanced(device: str): exp = _reference_linear_to_srgb((0.1, 0.2, 0.3)) expected = torch.tensor([exp, exp], dtype=after.dtype, device=after.device) torch.testing.assert_close(after, expected, rtol=1e-5, atol=1e-5) + + +def test_build_clone_source_map_homogeneous(): + """Missing dest paths are mapped to the clone source in a homogeneous scene. + + Simulates the Newton headless path (USD cloning skipped): only the env_0 source + prim exists; envs 1-3 labels are missing and must resolve back to env_0's source. + """ + clone_plan = ClonePlan( + sources=("/World/envs/env_0/Robot",), + destinations=("/World/envs/env_{}/Robot",), + clone_mask=torch.ones((1, 4), dtype=torch.bool), + ) + + missing = {f"/World/envs/env_{i}/Robot/Mesh" for i in range(1, 4)} + result = _build_clone_source_map(missing, clone_plan) + + assert result == {key: "/World/envs/env_0/Robot/Mesh" for key in missing} + + +def test_build_clone_source_map_heterogeneous(): + """Each missing dest path resolves to the correct variant source in a heterogeneous scene. + + Two robot variants share the same destination template but populate disjoint env + subsets: RobotA → envs 0,2; RobotB → envs 1,3. env_2 must map to RobotA's + source and env_3 to RobotB's source, not always to the first row's source. + """ + mask = torch.zeros((2, 4), dtype=torch.bool) + mask[0, [0, 2]] = True # RobotA populates envs 0 and 2 + mask[1, [1, 3]] = True # RobotB populates envs 1 and 3 + clone_plan = ClonePlan( + sources=("/World/envs/env_0/RobotA", "/World/envs/env_1/RobotB"), + destinations=("/World/envs/env_{}/Robot", "/World/envs/env_{}/Robot"), + clone_mask=mask, + ) + + missing = { + "/World/envs/env_2/Robot/Mesh", # env_2 → RobotA (row 0 owns env_ids {0, 2}) + "/World/envs/env_3/Robot/Mesh", # env_3 → RobotB (row 1 owns env_ids {1, 3}) + } + result = _build_clone_source_map(missing, clone_plan) + + assert result["/World/envs/env_2/Robot/Mesh"] == "/World/envs/env_0/RobotA/Mesh" + assert result["/World/envs/env_3/Robot/Mesh"] == "/World/envs/env_1/RobotB/Mesh" + + +def test_build_clone_source_map_no_match(): + """Paths not owned by any clone-plan row are absent from the result.""" + clone_plan = ClonePlan( + sources=("/World/envs/env_0/Robot",), + destinations=("/World/envs/env_{}/Robot",), + clone_mask=torch.ones((1, 4), dtype=torch.bool), + ) + + # "Sensor" sub-tree is not under the "Robot" template, so no match. + result = _build_clone_source_map({"/World/envs/env_2/Sensor/Mesh"}, clone_plan) + assert result == {} diff --git a/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst b/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst new file mode 100644 index 000000000000..cf0ca3e3813f --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst @@ -0,0 +1,7 @@ +Fixed +^^^^^ + +* Updated golden test images for the ``dexsuite_kuka_hetero`` Newton + Warp renderer + tests (``newton-newton_renderer-rgb`` and ``newton-newton_renderer-rgba``) to reflect + correct per-environment colors after fixing shape color resolution when USD cloning is + skipped. diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgb.png index a08ff6fa472d..843191f727b8 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f0f0d8bb9390f45824ab3338ed37eb0787ac70f6550c967bc2905148545fd58 -size 2541 +oid sha256:ffb6f5de5bfb0f28574db7f81a971dac8473f4946ab4c145519115028f1122eb +size 1798 diff --git a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgba.png index b674e80c2aef..d8e9e6bc1144 100644 --- a/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/dexsuite_kuka_hetero/newton-newton_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8825ffcbfe8434a7874f1062d8b58b0be6cacaeebb20e48c5c58d4d68e163056 -size 3480 +oid sha256:58b30f938cbeb857a0c2ba6db9f64f96ae367236aad7f8f52ed54057e1e5a60a +size 2833 From 4a49bc387823c5b877a954bcde1bee572cdff46a Mon Sep 17 00:00:00 2001 From: Sheikh Dawood <7774242+sheikh-nv@users.noreply.github.com> Date: Mon, 15 Jun 2026 17:42:51 -0500 Subject: [PATCH 12/32] docs: fix Isaac Lab container pull tag to 3.0.0-beta2 (#6192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Fixes the Isaac Lab container pull tag in the Docker deployment docs. `docs/source/deployment/docker.rst` referenced `nvcr.io/nvidia/isaac-lab:3.0.0.beta2` (dot), but the published NGC container tag uses a hyphen: `nvcr.io/nvidia/isaac-lab:3.0.0-beta2` (matching the `3.0.0-beta1` convention). The dotted tag does not exist, so the documented `docker pull` / `docker run` commands would fail. The same file already refers to "3.0.0-beta2 and later" (hyphen) in prose, so this also removes an internal inconsistency. Fixes # (issue) ## Type of change - Documentation update ## Checklist - [x] I have read and understood the contribution guidelines - [ ] I have run the `pre-commit` checks with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added a changelog fragment under `source//changelog.d/` for every touched package (N/A — docs-only change) - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- docs/source/deployment/docker.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst index 556ca4404393..c5eadb3c5416 100644 --- a/docs/source/deployment/docker.rst +++ b/docs/source/deployment/docker.rst @@ -322,7 +322,7 @@ To pull the minimal Isaac Lab container, run: .. code:: bash - docker pull nvcr.io/nvidia/isaac-lab:3.0.0.beta2 + docker pull nvcr.io/nvidia/isaac-lab:3.0.0-beta2 .. attention:: @@ -353,7 +353,7 @@ To run the Isaac Lab container with an interactive bash session, run: -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - nvcr.io/nvidia/isaac-lab:3.0.0.beta2 + nvcr.io/nvidia/isaac-lab:3.0.0-beta2 To enable rendering through X11 forwarding, run: @@ -372,7 +372,7 @@ To enable rendering through X11 forwarding, run: -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - nvcr.io/nvidia/isaac-lab:3.0.0.beta2 + nvcr.io/nvidia/isaac-lab:3.0.0-beta2 To run an example within the container, run: From 18d5e8affd32d13084b6b626eee5542f8a1b48ba Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Tue, 16 Jun 2026 08:56:04 +0800 Subject: [PATCH 13/32] Removes rlgames from pypi wheel to prepare for release (#6195) # Description Removes rlgames from pypi as public pypi does not allow using git links directly. Adds back note in docs with command to install rlgames if needed. ## Type of change - Bug fix (non-breaking change which fixes an issue) - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- .../setup/installation/isaaclab_pip_installation.rst | 11 ++++++++++- source/isaaclab/docs/CHANGELOG.rst | 2 -- tools/wheel_builder/res/python_packages.toml | 9 --------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/docs/source/setup/installation/isaaclab_pip_installation.rst b/docs/source/setup/installation/isaaclab_pip_installation.rst index fea39a704839..db017b484f6e 100644 --- a/docs/source/setup/installation/isaaclab_pip_installation.rst +++ b/docs/source/setup/installation/isaaclab_pip_installation.rst @@ -32,7 +32,7 @@ pip extras include: * - ``isaacsim`` - Isaac Sim (``isaacsim[all,extscache]==6.0.0.1``) from `pypi.nvidia.com `_ * - ``all`` - - RL frameworks (SB3, SKRL, RL-Games, RSL-RL). Combine with ``isaacsim`` for a full install. + - RL frameworks (SB3, SKRL, RSL-RL). Combine with ``isaacsim`` for a full install. Install with ``isaaclab[isaacsim,all]`` for the full workflow. @@ -50,6 +50,15 @@ Install with ``isaaclab[isaacsim,all]`` for the full workflow. pip install "isaaclab[isaacsim,all]" --extra-index-url https://pypi.nvidia.com --pre +.. note:: + + ``rl_games`` is not included in the Isaac Lab pip wheel extras. If your workflow requires + ``rl_games``, install it manually from the Isaac Lab-compatible branch: + + .. code-block:: bash + + pip install "rl-games @ git+https://github.com/isaac-sim/rl_games.git@python3.11" gym standard-distutils + Installing dependencies ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 64afab50dc0f..d10b39d28a88 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -202,8 +202,6 @@ Added ``CUDA_VISIBLE_DEVICES`` selects a subset of a node's GPUs, including the ``NCCL_P2P_DISABLE=1`` workaround and an explanation of why it is not needed when all GPUs are visible. -* Added the ``rl-games`` optional dependency to the ``isaaclab`` wheel and - included it in the wheel's ``all`` extra. Changed ^^^^^^^ diff --git a/tools/wheel_builder/res/python_packages.toml b/tools/wheel_builder/res/python_packages.toml index 013bbc4abfb7..1d41bc655962 100644 --- a/tools/wheel_builder/res/python_packages.toml +++ b/tools/wheel_builder/res/python_packages.toml @@ -99,12 +99,6 @@ pyproject.optional-dependencies.all = [ # RL libraries { "sb3" = ["stable-baselines3>=2.6", "tqdm", "rich"] }, { "skrl" = ["skrl>=2.1.0"] }, - # Do not pin aiohttp here: isaacsim-kernel==6.0.0.0 pins aiohttp==3.12.14. - { "rl-games" = [ - "rl-games @ git+https://github.com/isaac-sim/rl_games.git@python3.11", - "gym", - "standard-distutils", - ] }, { "rsl-rl" = ["rsl-rl-lib==5.0.1", "onnxscript>=0.5"] }, { "rsl_rl" = ["rsl-rl-lib==5.0.1", "onnxscript>=0.5"] }, # ================================================================================ @@ -120,9 +114,6 @@ pyproject.optional-dependencies.all = [ "tqdm", "rich", "skrl>=2.1.0", - "rl-games @ git+https://github.com/isaac-sim/rl_games.git@python3.11", - "gym", - "standard-distutils", "rsl-rl-lib==5.0.1", "onnxscript>=0.5", ] }, From 28a37cecdd433c22d9eabd6a5954add9f13a8951 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 06:51:45 +0000 Subject: [PATCH 14/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.10 → 6.1.11 - isaaclab_tasks: 1.10.8 → 1.10.9 --- .../fix-newton-clone-plan-color-resolve.rst | 7 ------- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 12 ++++++++++++ .../fix-newton-clone-plan-color-resolve.rst | 7 ------- source/isaaclab_tasks/config/extension.toml | 2 +- source/isaaclab_tasks/docs/CHANGELOG.rst | 12 ++++++++++++ 6 files changed, 26 insertions(+), 16 deletions(-) delete mode 100644 source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst delete mode 100644 source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst diff --git a/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst b/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst deleted file mode 100644 index 4edf17637020..000000000000 --- a/source/isaaclab/changelog.d/fix-newton-clone-plan-color-resolve.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fixed -^^^^^ - -* Fixed :func:`~isaaclab.sim.utils.newton_model_utils.replace_newton_shape_colors` incorrectly - keeping Newton's random palette colors for environments 1–N when USD cloning is skipped - Shape labels for non-source environments now resolve to the clone-plan source prim so - the correct USD material color is applied to all environments. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 32062458944d..41848f046f3a 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.10" +version = "6.1.11" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index d10b39d28a88..0c5c6406c3f5 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +6.1.11 (2026-06-16) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed :func:`~isaaclab.sim.utils.newton_model_utils.replace_newton_shape_colors` incorrectly + keeping Newton's random palette colors for environments 1–N when USD cloning is skipped + Shape labels for non-source environments now resolve to the clone-plan source prim so + the correct USD material color is applied to all environments. + + 6.1.10 (2026-06-14) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst b/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst deleted file mode 100644 index cf0ca3e3813f..000000000000 --- a/source/isaaclab_tasks/changelog.d/fix-newton-clone-plan-color-resolve.rst +++ /dev/null @@ -1,7 +0,0 @@ -Fixed -^^^^^ - -* Updated golden test images for the ``dexsuite_kuka_hetero`` Newton + Warp renderer - tests (``newton-newton_renderer-rgb`` and ``newton-newton_renderer-rgba``) to reflect - correct per-environment colors after fixing shape color resolution when USD cloning is - skipped. diff --git a/source/isaaclab_tasks/config/extension.toml b/source/isaaclab_tasks/config/extension.toml index ee18975d8eed..96582af86896 100644 --- a/source/isaaclab_tasks/config/extension.toml +++ b/source/isaaclab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "1.10.8" +version = "1.10.9" # Description title = "Isaac Lab Environments" diff --git a/source/isaaclab_tasks/docs/CHANGELOG.rst b/source/isaaclab_tasks/docs/CHANGELOG.rst index 37c96b73f38c..39af2ee75c60 100644 --- a/source/isaaclab_tasks/docs/CHANGELOG.rst +++ b/source/isaaclab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog --------- +1.10.9 (2026-06-16) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Updated golden test images for the ``dexsuite_kuka_hetero`` Newton + Warp renderer + tests (``newton-newton_renderer-rgb`` and ``newton-newton_renderer-rgba``) to reflect + correct per-environment colors after fixing shape color resolution when USD cloning is + skipped. + + 1.10.8 (2026-06-14) ~~~~~~~~~~~~~~~~~~~ From 811cb979efafdfe577c6a4eaeaef2503c1fb7458 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Wed, 17 Jun 2026 23:54:15 +0800 Subject: [PATCH 15/32] Removes some unnecessary dependencies from docker image (#6209) # Description Remove direct installs of libgmp-dev, libgmpxx4ldbl, and swig in container. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- docker/Dockerfile.base | 6 +----- docker/Dockerfile.curobo | 4 +--- .../isaaclab/isaaclab/cli/commands/install.py | 19 ++++++------------- .../test/install_ci/Dockerfile.installci | 8 ++++---- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 5c3d30fc220f..594969b2e318 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -51,15 +51,11 @@ RUN apt-get update && \ # arm64-only build deps: # - imgui-bundle has no prebuilt arm64 wheel; needs GL/X11 dev headers. -# - swig is required for the nlopt source build (see arm64 nlopt step below). -# - libgmp-dev is required by pytetwild's fTetWild source build (no aarch64 wheel for 0.2.3). RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-dev libopengl-dev libglx-dev \ - libx11-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev \ - libgmp-dev \ - swig; \ + libx11-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev; \ fi # copy files necessary for installing Isaac Lab and its dependencies diff --git a/docker/Dockerfile.curobo b/docker/Dockerfile.curobo index ce0862e4c214..0db0b3212730 100644 --- a/docker/Dockerfile.curobo +++ b/docker/Dockerfile.curobo @@ -51,13 +51,11 @@ RUN apt-get update && \ # arm64-only build deps: # - imgui-bundle has no prebuilt arm64 wheel; needs GL/X11 dev headers. -# - swig is required for the nlopt source build (see arm64 nlopt step below). RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-dev libopengl-dev libglx-dev \ - libx11-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev \ - swig; \ + libx11-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev; \ fi # Detect Ubuntu version and install CUDA 12.8 via NVIDIA network repo (cuda-keyring) diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index 808831681a42..582528254141 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -80,20 +80,13 @@ def _install_system_deps() -> None: run_command(["sudo"] + cmd if os.geteuid() != 0 else cmd) # nlopt has no aarch64 manylinux wheel for the version pinned by - # isaacteleop[retargeters], so pip falls back to a CMake source build - # that needs SWIG. Mirrors the apt step in docker/Dockerfile.base. + # isaacteleop[retargeters]. The installer pre-installs nlopt below to + # avoid the CMake source-build fallback that would require SWIG. if not shutil.which("swig"): - if os.geteuid() != 0 and not shutil.which("sudo"): - print_info( - "swig is missing and sudo is unavailable; skipping swig install. " - "Pre-install swig in your image if you need to build nlopt from source." - ) - else: - print_info("Installing swig (required for building nlopt on ARM)...") - cmd = ["apt-get", "update"] - run_command(["sudo"] + cmd if os.geteuid() != 0 else cmd) - cmd = ["apt-get", "install", "-y", "--no-install-recommends", "swig"] - run_command(["sudo"] + cmd if os.geteuid() != 0 else cmd) + print_info( + "swig is missing; continuing because nlopt is pre-installed on ARM before optional " + "dependencies are resolved. Pre-install swig manually only if you need to build nlopt from source." + ) # imgui-bundle has no aarch64 manylinux wheel, so pip falls back to a # CMake source build that needs GL/X11 dev headers (via glfw). diff --git a/source/isaaclab/test/install_ci/Dockerfile.installci b/source/isaaclab/test/install_ci/Dockerfile.installci index 662af204ce33..68b127df7b34 100644 --- a/source/isaaclab/test/install_ci/Dockerfile.installci +++ b/source/isaaclab/test/install_ci/Dockerfile.installci @@ -42,9 +42,9 @@ RUN apt-get update && \ sudo \ && rm -rf /var/lib/apt/lists/* -# ARM-specific build deps (swig, GL/X11 dev headers) are intentionally NOT -# pre-installed here. ``./isaaclab.sh -i`` auto-installs them via apt when -# missing, so install_ci exercises the real user-visible install path on ARM. +# ARM-specific GL/X11 dev headers are intentionally NOT pre-installed here. +# ``./isaaclab.sh -i`` auto-installs them via apt when missing, so install_ci +# exercises the real user-visible install path on ARM. # Make python3 the default python RUN ln -sf /usr/bin/python3 /usr/bin/python @@ -100,7 +100,7 @@ RUN if getent passwd ubuntu >/dev/null; then userdel -r ubuntu; fi \ && chown -R isaaclab:isaaclab ${ISAACLAB_PATH} # Passwordless sudo for the runtime user so ``./isaaclab.sh -i`` can apt-get -# install missing build deps (swig, GL/X11) without prompting at test time. +# install missing GL/X11 build deps without prompting at test time. RUN echo "isaaclab ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/isaaclab \ && chmod 0440 /etc/sudoers.d/isaaclab From 414683c78d85808054d4df18ca56376f020539fc Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Thu, 18 Jun 2026 01:51:34 +0800 Subject: [PATCH 16/32] Fixes nlopt docker build for arm (#6211) # Description Previous PR that attempted to keep swig at the docker layer level to avoid GPL dependencies broke the post-merge docker publish job on arm. This PR keeps swig for the full installation process before pruning it from the image. --- docker/Dockerfile.base | 25 +++++---- docker/Dockerfile.curobo | 25 +++++---- .../changelog.d/fix-arm-docker-install.rst | 6 ++ .../isaaclab/isaaclab/cli/commands/install.py | 56 ++++++++++++------- 4 files changed, 70 insertions(+), 42 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-arm-docker-install.rst diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 594969b2e318..d3544b871890 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -101,23 +101,26 @@ RUN touch /bin/nvidia-smi && \ mkdir -p /var/run/nvidia-persistenced && \ touch /var/run/nvidia-persistenced/socket -# On arm64, pre-install nlopt 2.6.2 (transitively pinned by isaacteleop[retargeters]). -# There is no aarch64 wheel for this version, and pip's isolated build env hides the -# system numpy from nlopt's cmake-based build, so we install it manually with -# --no-build-isolation. setuptools+wheel+numpy must be importable in the host Python -# for that mode (PEP 517 backend lookup). The subsequent isaaclab.sh --install then -# sees nlopt as already satisfied and skips the from-source rebuild that would fail. +# On arm64, temporarily install swig for the nlopt source build, keep it +# through the Isaac Lab dependency install, then purge it before the layer ends. +# This lets ./isaaclab.sh --install see nlopt as already satisfied without +# leaving swig in the final container filesystem. RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ + apt-get update && \ + apt-get install -y --no-install-recommends swig && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel numpy && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation nlopt==2.6.2; \ + fi && \ + ${ISAACLAB_PATH}/isaaclab.sh --install && \ + if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ + ${ISAACLAB_PATH}/isaaclab.sh -p -c "import nlopt" && \ + apt-get purge -y --auto-remove swig && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + if command -v swig >/dev/null 2>&1; then exit 1; fi; \ fi -# installing Isaac Lab dependencies -# use pip caching to avoid reinstalling large packages -RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ - ${ISAACLAB_PATH}/isaaclab.sh --install - # HACK: Remove install of quadprog dependency RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog diff --git a/docker/Dockerfile.curobo b/docker/Dockerfile.curobo index 0db0b3212730..2c8b2c14af71 100644 --- a/docker/Dockerfile.curobo +++ b/docker/Dockerfile.curobo @@ -149,23 +149,26 @@ RUN rm -rf ${ISAACSIM_ROOT_PATH}/kit/python/lib/python3.12/site-packages/pip* && ${ISAACLAB_PATH}/_isaac_sim/kit/python/bin/python3 get-pip.py && \ rm get-pip.py -# On arm64, pre-install nlopt 2.6.2 (transitively pinned by isaacteleop[retargeters]). -# There is no aarch64 wheel for this version, and pip's isolated build env hides the -# system numpy from nlopt's cmake-based build, so we install it manually with -# --no-build-isolation. setuptools+wheel+numpy must be importable in the host Python -# for that mode (PEP 517 backend lookup). The subsequent isaaclab.sh --install then -# sees nlopt as already satisfied and skips the from-source rebuild that would fail. +# On arm64, temporarily install swig for the nlopt source build, keep it +# through the Isaac Lab dependency install, then purge it before the layer ends. +# This lets ./isaaclab.sh --install see nlopt as already satisfied without +# leaving swig in the final container filesystem. RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ + apt-get update && \ + apt-get install -y --no-install-recommends swig && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install setuptools wheel numpy && \ ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation nlopt==2.6.2; \ + fi && \ + ${ISAACLAB_PATH}/isaaclab.sh --install && \ + if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ + ${ISAACLAB_PATH}/isaaclab.sh -p -c "import nlopt" && \ + apt-get purge -y --auto-remove swig && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + if command -v swig >/dev/null 2>&1; then exit 1; fi; \ fi -# installing Isaac Lab dependencies -# use pip caching to avoid reinstalling large packages -RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \ - ${ISAACLAB_PATH}/isaaclab.sh --install - # HACK: Uninstall quadprog as it causes issues with some reinforcement learning frameworks RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog diff --git a/source/isaaclab/changelog.d/fix-arm-docker-install.rst b/source/isaaclab/changelog.d/fix-arm-docker-install.rst new file mode 100644 index 000000000000..b33d98ab088f --- /dev/null +++ b/source/isaaclab/changelog.d/fix-arm-docker-install.rst @@ -0,0 +1,6 @@ +Fixed +^^^^^ + +* Fixed Linux ARM installation by pre-installing ``nlopt==2.6.2`` before + Isaac Lab dependencies are resolved, and by keeping ``swig`` available in + Docker only until dependency installation completes. diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index 582528254141..da844cbe92e1 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -147,25 +147,6 @@ def _torch_first_on_sys_path_is_prebundle(python_exe: str, *, env: dict[str, str return result.returncode == 1 -def _maybe_preinstall_arm_nlopt(pip_cmd: list[str]) -> None: - """Pre-install ``nlopt==2.6.2`` on ARM Linux to skip the source-build fallback. - - There is no aarch64 manylinux wheel for the ``nlopt 2.6.2`` version pinned - by ``isaacteleop[retargeters]``, so pip falls back to a CMake source build - that hides the host-Python ``numpy`` from its isolated build env. Mirror - the docker/Dockerfile.base arm64 step: install ``setuptools wheel numpy`` - in the host Python first, then ``--no-build-isolation`` install nlopt so - later submodule installs see it as already satisfied. - """ - if is_windows() or not is_arm(): - return - print_info("Pre-installing nlopt==2.6.2 on ARM (no-build-isolation)...") - print_info(" step 1/2: ensure setuptools/wheel/numpy are importable for the no-build-isolation backend") - run_command(pip_cmd + ["install", "setuptools", "wheel", "numpy"]) - print_info(" step 2/2: install nlopt==2.6.2 with --no-build-isolation") - run_command(pip_cmd + ["install", "--no-build-isolation", "nlopt==2.6.2"]) - - def _maybe_uninstall_prebundled_torch( python_exe: str, pip_cmd: list[str], @@ -188,6 +169,41 @@ def _maybe_uninstall_prebundled_torch( ) +def _maybe_preinstall_arm_nlopt(python_exe: str, pip_cmd: list[str]) -> None: + """Pre-install ``nlopt==2.6.2`` on ARM Linux to skip the source-build fallback. + + There is no aarch64 manylinux wheel for the ``nlopt 2.6.2`` version pinned + by ``isaacteleop[retargeters]``, so pip falls back to a CMake source build + that hides the host-Python ``numpy`` from its isolated build env. Mirror + the docker/Dockerfile.base arm64 step: install ``setuptools wheel numpy`` + in the host Python first, then ``--no-build-isolation`` install nlopt so + later submodule installs see it as already satisfied. + """ + if is_windows() or not is_arm(): + return + + probe_result = run_command( + [ + python_exe, + "-c", + "import importlib.metadata as metadata; import nlopt; " + "raise SystemExit(0 if metadata.version('nlopt') == '2.6.2' else 1)", + ], + check=False, + capture_output=True, + text=True, + ) + if probe_result.returncode == 0: + print_info("nlopt==2.6.2 is already installed on ARM.") + return + + print_info("Pre-installing nlopt==2.6.2 on ARM (no-build-isolation)...") + print_info(" step 1/2: ensure setuptools/wheel/numpy are importable for the no-build-isolation backend") + run_command(pip_cmd + ["install", "setuptools", "wheel", "numpy"]) + print_info(" step 2/2: install nlopt==2.6.2 with --no-build-isolation") + run_command(pip_cmd + ["install", "--no-build-isolation", "nlopt==2.6.2"]) + + # Dependency stack required by isaaclab.controllers.pink_ik. Pinocchio is installed # via the cmeel ``pin`` wheel, which provides the ``pinocchio`` Python module under # ``cmeel.prefix/lib/python3.12/site-packages/`` and registers it on sys.path via a @@ -946,7 +962,7 @@ def append_submodules_once(package_dirs: tuple[str, ...]) -> None: run_command(pip_cmd + ["install", "setuptools<82.0.0"]) # On ARM Linux pre-install nlopt to dodge its from-source build fallback. - _maybe_preinstall_arm_nlopt(pip_cmd) + _maybe_preinstall_arm_nlopt(python_exe, pip_cmd) # Drop pip-installed torch if Isaac Sim's deprecated ML prebundle would shadow it. _maybe_uninstall_prebundled_torch(python_exe, pip_cmd, using_uv, probe_env=probe_env) From e722b5b2456896d32ced692e76f295d3f11c220a Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 06:38:11 +0000 Subject: [PATCH 17/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.11 → 6.1.12 --- .../isaaclab/changelog.d/fix-arm-docker-install.rst | 6 ------ source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 11 +++++++++++ 3 files changed, 12 insertions(+), 7 deletions(-) delete mode 100644 source/isaaclab/changelog.d/fix-arm-docker-install.rst diff --git a/source/isaaclab/changelog.d/fix-arm-docker-install.rst b/source/isaaclab/changelog.d/fix-arm-docker-install.rst deleted file mode 100644 index b33d98ab088f..000000000000 --- a/source/isaaclab/changelog.d/fix-arm-docker-install.rst +++ /dev/null @@ -1,6 +0,0 @@ -Fixed -^^^^^ - -* Fixed Linux ARM installation by pre-installing ``nlopt==2.6.2`` before - Isaac Lab dependencies are resolved, and by keeping ``swig`` available in - Docker only until dependency installation completes. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 41848f046f3a..9e875f66ccce 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.11" +version = "6.1.12" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 0c5c6406c3f5..6c21ee4fbe5e 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,17 @@ Changelog --------- +6.1.12 (2026-06-18) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed Linux ARM installation by pre-installing ``nlopt==2.6.2`` before + Isaac Lab dependencies are resolved, and by keeping ``swig`` available in + Docker only until dependency installation completes. + + 6.1.11 (2026-06-16) ~~~~~~~~~~~~~~~~~~~ From d663b340df9d715762a6bf806a980c869418190b Mon Sep 17 00:00:00 2001 From: peterd-NV Date: Fri, 26 Jun 2026 03:02:58 +0200 Subject: [PATCH 18/32] Bump h5py version to >=3.16.0 (#6266) # Description Bumps h5py dep version to >=3.16.0 to be in line with Isaac Sim 6.0 GA which requires 3.16.x Fixes #6213 ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst | 4 ++++ source/isaaclab_mimic/setup.py | 2 +- source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst | 4 ++++ source/isaaclab_rl/setup.py | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst create mode 100644 source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst diff --git a/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst b/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst new file mode 100644 index 000000000000..a8559d0057df --- /dev/null +++ b/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst @@ -0,0 +1,4 @@ +Changed +^^^^^^^ + +* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. diff --git a/source/isaaclab_mimic/setup.py b/source/isaaclab_mimic/setup.py index 3f5b27ae3587..9af6c0125362 100644 --- a/source/isaaclab_mimic/setup.py +++ b/source/isaaclab_mimic/setup.py @@ -22,7 +22,7 @@ # jupyter notebook "ipywidgets==8.1.5", # data collection - "h5py==3.15.1", + "h5py>=3.16.0", ] # robomimic has no Windows/macOS wheels; only add it on Linux diff --git a/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst b/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst new file mode 100644 index 000000000000..a8559d0057df --- /dev/null +++ b/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst @@ -0,0 +1,4 @@ +Changed +^^^^^^^ + +* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. diff --git a/source/isaaclab_rl/setup.py b/source/isaaclab_rl/setup.py index 0a14506f2b06..2a42fab4315b 100644 --- a/source/isaaclab_rl/setup.py +++ b/source/isaaclab_rl/setup.py @@ -26,7 +26,7 @@ # configuration management "hydra-core", # data collection - "h5py==3.15.1", + "h5py>=3.16.0", # basic logger "tensorboard", # video recording From ad5b07e33e56f1e4c62e94e753c6b82f95972611 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Fri, 26 Jun 2026 06:27:22 +0000 Subject: [PATCH 19/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab_mimic: 1.3.2 → 1.3.3 - isaaclab_rl: 0.5.4 → 0.5.5 --- source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst | 4 ---- source/isaaclab_mimic/config/extension.toml | 2 +- source/isaaclab_mimic/docs/CHANGELOG.rst | 9 +++++++++ source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst | 4 ---- source/isaaclab_rl/config/extension.toml | 2 +- source/isaaclab_rl/docs/CHANGELOG.rst | 9 +++++++++ 6 files changed, 20 insertions(+), 10 deletions(-) delete mode 100644 source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst delete mode 100644 source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst diff --git a/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst b/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst deleted file mode 100644 index a8559d0057df..000000000000 --- a/source/isaaclab_mimic/changelog.d/peterd-bump-h5py.rst +++ /dev/null @@ -1,4 +0,0 @@ -Changed -^^^^^^^ - -* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. diff --git a/source/isaaclab_mimic/config/extension.toml b/source/isaaclab_mimic/config/extension.toml index c418bcf7945d..c86a69fcefc4 100644 --- a/source/isaaclab_mimic/config/extension.toml +++ b/source/isaaclab_mimic/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "1.3.2" +version = "1.3.3" # Description category = "isaaclab" diff --git a/source/isaaclab_mimic/docs/CHANGELOG.rst b/source/isaaclab_mimic/docs/CHANGELOG.rst index b9f784799910..55d7453dd923 100644 --- a/source/isaaclab_mimic/docs/CHANGELOG.rst +++ b/source/isaaclab_mimic/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +1.3.3 (2026-06-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. + + 1.3.2 (2026-06-14) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst b/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst deleted file mode 100644 index a8559d0057df..000000000000 --- a/source/isaaclab_rl/changelog.d/peterd-bump-h5py.rst +++ /dev/null @@ -1,4 +0,0 @@ -Changed -^^^^^^^ - -* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. diff --git a/source/isaaclab_rl/config/extension.toml b/source/isaaclab_rl/config/extension.toml index 504968069300..5897bc6bb22d 100644 --- a/source/isaaclab_rl/config/extension.toml +++ b/source/isaaclab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.5.4" +version = "0.5.5" # Description title = "Isaac Lab RL" diff --git a/source/isaaclab_rl/docs/CHANGELOG.rst b/source/isaaclab_rl/docs/CHANGELOG.rst index 1df416d93604..7f1f08c897bb 100644 --- a/source/isaaclab_rl/docs/CHANGELOG.rst +++ b/source/isaaclab_rl/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +0.5.5 (2026-06-26) +~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Bumped the ``h5py`` requirement from a pinned ``==3.15.1`` to ``>=3.16.0``. + + 0.5.4 (2026-06-10) ~~~~~~~~~~~~~~~~~~ From fa0fa7a5aa83fc97091f7772851ab9776842b4d1 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 27 Jun 2026 23:42:00 -0700 Subject: [PATCH 20/32] Updates Isaac Sim to version 6.0.1 (#6277) # Description Updates Isaac Sim to version 6.0.1 in docs for wheel and docker. Isaac Sim 6.0.1 is a patch release with some fixes and improvements for the asset toolchains and NuRec workflows - https://docs.isaacsim.omniverse.nvidia.com/6.0.1/overview/release_notes.html ## Type of change - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- .github/actions/ecr-build-push-pull/README.md | 2 +- .../run-package-tests/test_cleanup_docker_storage.py | 2 +- .github/workflows/config.yaml | 4 ++-- .github/workflows/license-check.yaml | 2 +- .github/workflows/license-exceptions.json | 5 +++++ README.md | 8 ++++---- docker/.env.base | 4 ++-- docs/_extensions/isaaclab_docs.py | 4 ++-- docs/conf.py | 4 ++-- .../physical-backends/newton/installation.rst | 2 +- .../overview/imitation-learning/humanoids_imitation.rst | 4 ++-- docs/source/setup/installation/index.rst | 6 +++--- .../setup/installation/isaaclab_pip_installation.rst | 2 +- docs/source/setup/installation/pip_installation.rst | 2 +- source/isaaclab/changelog.d/kellyg-isaacsim-601.rst | 5 +++++ source/isaaclab/setup.py | 6 +++--- tools/wheel_builder/res/python_packages.toml | 4 ++-- 17 files changed, 38 insertions(+), 28 deletions(-) create mode 100644 source/isaaclab/changelog.d/kellyg-isaacsim-601.rst diff --git a/.github/actions/ecr-build-push-pull/README.md b/.github/actions/ecr-build-push-pull/README.md index 2e306c978b8e..15fb373e7000 100644 --- a/.github/actions/ecr-build-push-pull/README.md +++ b/.github/actions/ecr-build-push-pull/README.md @@ -10,7 +10,7 @@ ECR is also used as the BuildKit layer cache. with: image-tag: ${{ env.DOCKER_IMAGE_TAG }} isaacsim-base-image: nvcr.io/nvidia/isaac-sim - isaacsim-version: 6.0.0 + isaacsim-version: 6.0.1 dockerfile-path: docker/Dockerfile.base cache-tag: cache-base ecr-url: (optional, complete url for ECR storage) diff --git a/.github/actions/run-package-tests/test_cleanup_docker_storage.py b/.github/actions/run-package-tests/test_cleanup_docker_storage.py index dd49216c1cd9..2373d99bc808 100644 --- a/.github/actions/run-package-tests/test_cleanup_docker_storage.py +++ b/.github/actions/run-package-tests/test_cleanup_docker_storage.py @@ -104,7 +104,7 @@ def _run_cleanup( [ "bash", str(_SCRIPT_PATH), - "nvcr.io/nvidian/isaac-sim:latest-develop", + "nvcr.io/nvidia/isaac-sim:6.0.1", "isaacsim-pin-test", "test-cleanup", "true", diff --git a/.github/workflows/config.yaml b/.github/workflows/config.yaml index aa3c1888b240..7cbe873118d4 100644 --- a/.github/workflows/config.yaml +++ b/.github/workflows/config.yaml @@ -5,6 +5,6 @@ # Shared image config for CI workflows. Loaded by the `config` job in each # workflow via yq and exposed as job outputs (see e.g. .github/workflows/build.yaml). -isaacsim_image_name: nvcr.io/nvidian/isaac-sim -isaacsim_image_tag: latest-develop +isaacsim_image_name: nvcr.io/nvidia/isaac-sim +isaacsim_image_tag: 6.0.1 isaaclab_image_name: nvcr.io/nvidian/isaac-lab diff --git a/.github/workflows/license-check.yaml b/.github/workflows/license-check.yaml index 0b296f9e74eb..f7416561392d 100644 --- a/.github/workflows/license-check.yaml +++ b/.github/workflows/license-check.yaml @@ -63,7 +63,7 @@ jobs: run: | # first install isaac sim pip install --upgrade pip - pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '6.0.0' }}' --extra-index-url https://pypi.nvidia.com + pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '6.0.1.0' }}' --extra-index-url https://pypi.nvidia.com chmod +x ./isaaclab.sh # Make sure the script is executable # install all lab dependencies ./isaaclab.sh -i diff --git a/.github/workflows/license-exceptions.json b/.github/workflows/license-exceptions.json index b21ae4cdc5b5..ca01a49cfdc2 100644 --- a/.github/workflows/license-exceptions.json +++ b/.github/workflows/license-exceptions.json @@ -488,6 +488,11 @@ "license": "LicenseRef-NVIDIA-SOFTWARE-LICENSE", "comment": "NVIDIA" }, + { + "package": "cuda-toolkit", + "license": "UNKNOWN", + "comment": "NVIDIA" + }, { "package": "omniverseclient", "license": "NVIDIA Proprietary Software, https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement/", diff --git a/README.md b/README.md index 6c50d270fec2..236292958a04 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # Isaac Lab 3.0.0 Beta 2 -[![IsaacSim](https://img.shields.io/badge/IsaacSim-6.0.0-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) +[![IsaacSim](https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg)](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) [![Python](https://img.shields.io/badge/python-3.12-blue.svg)](https://docs.python.org/3/whatsnew/3.12.html) [![Linux platform](https://img.shields.io/badge/platform-linux--64-orange.svg)](https://releases.ubuntu.com/22.04/) [![Windows platform](https://img.shields.io/badge/platform-windows--64-orange.svg)](https://www.microsoft.com/en-us/) @@ -76,10 +76,10 @@ dependency versions for Isaac Sim. | Isaac Lab Version | Isaac Sim Version | | ----------------------------- | ------------------------- | -| `release/3.0.0-beta2` branch | Isaac Sim 6.0 | -| `develop` branch | Isaac Sim 6.0 | +| `release/3.0.0-beta2` branch | Isaac Sim 6.0.0 / 6.0.1 | +| `develop` branch | Isaac Sim 6.0.0 / 6.0.1 | | `main` branch | Isaac Sim 4.5 / 5.0 / 5.1 | -| `v3.0.0*` | Isaac Sim 6.0 | +| `v3.0.0*` | Isaac Sim 6.0.0 / 6.0.1 | | `v2.3.X` | Isaac Sim 4.5 / 5.0 / 5.1 | | `v2.2.X` | Isaac Sim 4.5 / 5.0 | | `v2.1.X` | Isaac Sim 4.5 | diff --git a/docker/.env.base b/docker/.env.base index 555a91fd5aea..b784ef9d2bcc 100644 --- a/docker/.env.base +++ b/docker/.env.base @@ -6,8 +6,8 @@ ACCEPT_EULA=Y # NVIDIA Isaac Sim base image ISAACSIM_BASE_IMAGE=nvcr.io/nvidia/isaac-sim -# NVIDIA Isaac Sim version to use (e.g. 6.0.0) -ISAACSIM_VERSION=6.0.0 +# NVIDIA Isaac Sim version to use (e.g. 6.0.1) +ISAACSIM_VERSION=6.0.1 # Derived from the default path in the NVIDIA provided Isaac Sim container DOCKER_ISAACSIM_ROOT_PATH=/isaac-sim # The Isaac Lab path in the container diff --git a/docs/_extensions/isaaclab_docs.py b/docs/_extensions/isaaclab_docs.py index 61ba220472a5..0f3a0ab6c9d4 100644 --- a/docs/_extensions/isaaclab_docs.py +++ b/docs/_extensions/isaaclab_docs.py @@ -160,7 +160,7 @@ def _quickstart_isaacsim(branch: str, platform: str) -> str: uv venv --python 3.12 --seed env_isaaclab source env_isaaclab/bin/activate uv pip install --upgrade pip - uv pip install "isaacsim[all,extscache]==6.0.0.1" \\ + uv pip install "isaacsim[all,extscache]==6.0.1.0" \\ --extra-index-url https://pypi.nvidia.com \\ --index-strategy unsafe-best-match --prerelease=allow uv pip install -U torch==2.10.0 torchvision==0.25.0 \\ @@ -178,7 +178,7 @@ def _quickstart_isaacsim(branch: str, platform: str) -> str: uv venv --python 3.12 --seed env_isaaclab env_isaaclab\\Scripts\\activate uv pip install --upgrade pip - uv pip install "isaacsim[all,extscache]==6.0.0.1" ^ + uv pip install "isaacsim[all,extscache]==6.0.1.0" ^ --extra-index-url https://pypi.nvidia.com ^ --index-strategy unsafe-best-match --prerelease=allow uv pip install -U torch==2.10.0 torchvision==0.25.0 ^ diff --git a/docs/conf.py b/docs/conf.py index f40345418083..9e8c141e83df 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -156,7 +156,7 @@ "trimesh": ("https://trimesh.org/", None), # NOTE: pinned to /docs/2.11/ because /docs/stable/objects.inv currently 404s "torch": ("https://docs.pytorch.org/docs/2.11/", None), - "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/6.0.0/py/", None), + "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/6.0.1/py/", None), "gymnasium": ("https://gymnasium.farama.org/", None), # NOTE: pinned to /stable/ because /objects.inv at the root currently 404s "warp": ("https://nvidia.github.io/warp/stable/", None), @@ -317,7 +317,7 @@ { "name": "Isaac Sim", "url": "https://developer.nvidia.com/isaac-sim", - "icon": "https://img.shields.io/badge/IsaacSim-6.0.0-silver.svg", + "icon": "https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg", "type": "url", }, { diff --git a/docs/source/overview/core-concepts/physical-backends/newton/installation.rst b/docs/source/overview/core-concepts/physical-backends/newton/installation.rst index 39c55fe713cd..cbc5fd4545c9 100644 --- a/docs/source/overview/core-concepts/physical-backends/newton/installation.rst +++ b/docs/source/overview/core-concepts/physical-backends/newton/installation.rst @@ -53,7 +53,7 @@ Ensure pip is up to date: .. code-block:: bash - uv pip install "isaacsim[all,extscache]==6.0.0.1" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow + uv pip install "isaacsim[all,extscache]==6.0.1.0" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow Install the correct version of torch and torchvision: diff --git a/docs/source/overview/imitation-learning/humanoids_imitation.rst b/docs/source/overview/imitation-learning/humanoids_imitation.rst index 6bfd8f29a1f2..44dc7d19cf44 100644 --- a/docs/source/overview/imitation-learning/humanoids_imitation.rst +++ b/docs/source/overview/imitation-learning/humanoids_imitation.rst @@ -765,7 +765,7 @@ navigation and manipulation dataset as an HDF5 file — but here the robot navig manipulates objects inside a neurally-rendered environment, and an ego-centric camera captures the result, producing more realistic training data than a purely synthetic scene. NVIDIA Isaac Sim renders 3DGS models stored as USD assets; see -`Neural Volume Rendering `__ +`Neural Volume Rendering `__ for details. .. note:: @@ -818,7 +818,7 @@ compatible with the SDG pipeline: - If your scene was reconstructed using the `Stereo Workflow `__, the occupancy map is generated via ``nvblox``. - - If your background includes a mesh, use the `Occupancy Map Generator `__ + - If your background includes a mesh, use the `Occupancy Map Generator `__ to create a map via physical simulation. Generating the dataset diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index 958f780507d2..99ba2e45dbbf 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -3,9 +3,9 @@ Local Installation ================== -.. image:: https://img.shields.io/badge/IsaacSim-6.0.0-silver.svg +.. image:: https://img.shields.io/badge/IsaacSim-6.0.1-silver.svg :target: https://developer.nvidia.com/isaac-sim - :alt: IsaacSim 6.0.0 + :alt: IsaacSim 6.0.1 .. image:: https://img.shields.io/badge/python-3.12-blue.svg :target: https://www.python.org/downloads/release/python-3120/ @@ -39,7 +39,7 @@ Local Installation .. caution:: We have dropped support for Isaac Sim versions 5.1.0 and below. We recommend using the latest - Isaac Sim 6.0.0 release to benefit from the latest features and improvements. + Isaac Sim 6.0.1 release to benefit from the latest features and improvements. For more information, please refer to the `Isaac Sim release notes `__. diff --git a/docs/source/setup/installation/isaaclab_pip_installation.rst b/docs/source/setup/installation/isaaclab_pip_installation.rst index db017b484f6e..fe815b148afa 100644 --- a/docs/source/setup/installation/isaaclab_pip_installation.rst +++ b/docs/source/setup/installation/isaaclab_pip_installation.rst @@ -30,7 +30,7 @@ pip extras include: * - Extra - What it installs * - ``isaacsim`` - - Isaac Sim (``isaacsim[all,extscache]==6.0.0.1``) from `pypi.nvidia.com `_ + - Isaac Sim (``isaacsim[all,extscache]==6.0.1.0``) from `pypi.nvidia.com `_ * - ``all`` - RL frameworks (SB3, SKRL, RSL-RL). Combine with ``isaacsim`` for a full install. diff --git a/docs/source/setup/installation/pip_installation.rst b/docs/source/setup/installation/pip_installation.rst index 6b324b2cabbf..6f0a413cdd76 100644 --- a/docs/source/setup/installation/pip_installation.rst +++ b/docs/source/setup/installation/pip_installation.rst @@ -51,7 +51,7 @@ Installing dependencies .. code-block:: bash - uv pip install "isaacsim[all,extscache]==6.0.0.1" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow + uv pip install "isaacsim[all,extscache]==6.0.1.0" --extra-index-url https://pypi.nvidia.com --index-strategy unsafe-best-match --prerelease=allow - Install a CUDA-enabled PyTorch build that matches your system architecture: diff --git a/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst b/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst new file mode 100644 index 000000000000..fed398dbf81d --- /dev/null +++ b/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst @@ -0,0 +1,5 @@ +Changed +^^^^^^^ + +* Updated the Isaac Sim pip dependency to ``6.0.1.0`` and aligned the + ``pillow`` dependency with Isaac Sim by pinning ``pillow==12.2.0``. diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index 1fd411971fde..a5a416da52c6 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -36,7 +36,7 @@ "warp-lang==1.13.0", "matplotlib>=3.10.3", # minimum version for Python 3.12 support # make sure this is consistent with isaac sim version - "pillow==12.1.1", + "pillow==12.2.0", # required by omni.replicator.core S3 backend "botocore", # livestream @@ -102,9 +102,9 @@ # Use ``pip install isaaclab[isaacsim]`` to add Isaac Sim, or # ``pip install isaaclab[all]`` to pull in all sub-packages and extras. EXTRAS_REQUIRE = { - "isaacsim": ["isaacsim[all,extscache]==5.1.0"], + "isaacsim": ["isaacsim[all,extscache]==6.0.1.0"], "all": [ - "isaacsim[all,extscache]==5.1.0", + "isaacsim[all,extscache]==6.0.1.0", "isaaclab_assets", "isaaclab_contrib", "isaaclab_experimental", diff --git a/tools/wheel_builder/res/python_packages.toml b/tools/wheel_builder/res/python_packages.toml index 1d41bc655962..aac0d0c2e5c4 100644 --- a/tools/wheel_builder/res/python_packages.toml +++ b/tools/wheel_builder/res/python_packages.toml @@ -25,7 +25,7 @@ pyproject.dependencies.all = [ "warp-lang==1.13.0", "matplotlib>=3.10.3", # make sure this is consistent with isaac sim version - "pillow==12.1.1", + "pillow==12.2.0", "botocore", # livestream # range chosen to coexist with isaacsim 6.0 (isaacsim-kernel pulls fastapi==0.117.1 -> starlette<0.49.0) @@ -84,7 +84,7 @@ pyproject.dependencies.all = [ ] pyproject.optional-dependencies.all = [ # Isaac Sim - { "isaacsim" = ["isaacsim[all,extscache]==6.0.0.1"] }, + { "isaacsim" = ["isaacsim[all,extscache]==6.0.1.0"] }, # ================================================================================ # https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_newton/setup.py # ================================================================================ From b8ad677b2b82d5f149c50c4629fd7bd9d99d6702 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 06:36:23 +0000 Subject: [PATCH 21/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.12 → 6.1.13 --- source/isaaclab/changelog.d/kellyg-isaacsim-601.rst | 5 ----- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 10 ++++++++++ 3 files changed, 11 insertions(+), 6 deletions(-) delete mode 100644 source/isaaclab/changelog.d/kellyg-isaacsim-601.rst diff --git a/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst b/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst deleted file mode 100644 index fed398dbf81d..000000000000 --- a/source/isaaclab/changelog.d/kellyg-isaacsim-601.rst +++ /dev/null @@ -1,5 +0,0 @@ -Changed -^^^^^^^ - -* Updated the Isaac Sim pip dependency to ``6.0.1.0`` and aligned the - ``pillow`` dependency with Isaac Sim by pinning ``pillow==12.2.0``. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 9e875f66ccce..f7ebffcca64d 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.12" +version = "6.1.13" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 6c21ee4fbe5e..64bf19efd383 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- +6.1.13 (2026-06-29) +~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Updated the Isaac Sim pip dependency to ``6.0.1.0`` and aligned the + ``pillow`` dependency with Isaac Sim by pinning ``pillow==12.2.0``. + + 6.1.12 (2026-06-18) ~~~~~~~~~~~~~~~~~~~ From 4c6aac2eaa20a31afdcbb24d49658208200e8a94 Mon Sep 17 00:00:00 2001 From: hujc Date: Mon, 29 Jun 2026 14:27:56 -0700 Subject: [PATCH 22/32] [Fix] Cherry-pick Isaac Sim 6.0 streaming crash fix (#6295) ## 1. Summary - Cherry-picks #6288 onto `release/3.0.0-beta2`. - Prevents Isaac Sim 6.0 streaming launches from loading prebundled torch against the older pip-installed NCCL. - Makes prebundle repointing work on overlayfs and fail loudly when a shadowing torch copy remains. ## 2. Validation - [x] `69 passed` in the touched install CLI test modules. - [x] Release Docker image invariant failed before repointing and passed afterward. - [x] Exact NVBug 6343978 streaming command reached the Isaac Sim 6.0.1 full-streaming marker after the fix. - [x] `./isaaclab.sh -f`. ## 3. Related - Cherry-pick of #6288. - Fixes NVBug 6343978. --- ...anh-fix-sim6-prebundle-torch-streaming.rst | 13 +++++ .../isaaclab/isaaclab/cli/commands/install.py | 55 +++++++++++++++---- source/isaaclab/test/cli/test_install.py | 33 +++++++++++ .../test/cli/test_install_commands.py | 23 ++++---- 4 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst diff --git a/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst b/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst new file mode 100644 index 000000000000..c971f5f6fa87 --- /dev/null +++ b/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst @@ -0,0 +1,13 @@ +Fixed +^^^^^ + +* Fixed a crash (``undefined symbol: ncclDevCommCreate``) when launching the Isaac Sim + streaming app (e.g. ``isaac-sim.streaming.sh`` / ``runheadless.sh``) from an Isaac Lab + install against Isaac Sim 6.0. Isaac Sim's deprecated ``omni.isaac.ml_archive`` prebundle + ships its own PyTorch and NCCL while Isaac Lab installs a different pinned PyTorch; on + launch paths that do not import Isaac Lab (which otherwise deprioritizes the prebundle on + ``sys.path``), the two NCCL copies collide and the prebundled torch binds to the wrong + one. The install step that repoints the prebundle to the active environment now uses + overlayfs-safe filesystem operations, so it works inside the Docker image build (where it + previously failed silently with ``EXDEV`` / ``EINVAL``) and fails loudly if a shadowing + copy remains. diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index da844cbe92e1..d3740f0319b3 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -712,6 +712,24 @@ def _install_extra_feature(feature_name: str, selector: str = "") -> None: """ +def _force_remove(path: Path) -> None: + """Recursively remove a file, directory, or symlink. A missing path is a no-op. + + Uses absolute-path :func:`os.unlink` / :func:`os.rmdir` rather than the + ``dir_fd``-relative operations :func:`shutil.rmtree` performs internally. On + an overlayfs *lower* layer (e.g. inside a Docker image build) the ``dir_fd`` + variant raises ``EINVAL``, whereas the plain ``unlink(2)`` / ``rmdir(2)`` + syscalls create the proper whiteout. This makes prebundle neutralization + behave identically on a normal filesystem and on an overlayfs lower layer. + """ + if path.is_symlink() or path.is_file(): + os.unlink(path) + elif path.is_dir(): + for child in path.iterdir(): + _force_remove(child) + os.rmdir(path) + + def _repoint_prebundle_packages() -> None: """Replace prebundled packages in Isaac Sim with symlinks to the active environment. @@ -791,16 +809,15 @@ def _repoint_prebundle_packages() -> None: continue try: - if prebundled.is_symlink(): - if prebundled.resolve() == venv_pkg.resolve(): - continue - prebundled.unlink() - else: - backup = prebundle_dir / f"{pkg_name}.bak" - if backup.exists() or backup.is_symlink(): - shutil.rmtree(backup) if backup.is_dir() else backup.unlink() - prebundled.rename(backup) - + # Already repointed to the right place — nothing to do. + if prebundled.is_symlink() and prebundled.resolve() == venv_pkg.resolve(): + continue + # Replace the prebundled copy (a stale symlink or a real directory) + # with a symlink to the active environment. We remove rather than + # rename-to-``.bak``: the env copy is the symlink target, so the + # prebundle content is redundant, and renaming a directory on an + # overlayfs lower layer (Docker image build) fails with ``EXDEV``. + _force_remove(prebundled) if use_symlinks: prebundled.symlink_to(venv_pkg) else: @@ -817,6 +834,24 @@ def _repoint_prebundle_packages() -> None: else: print_debug("All prebundled packages already up-to-date — nothing to repoint.") + # Fail loud: a real (non-symlink) prebundled ``torch`` left behind shadows the + # pip-installed torch on launch paths that do not import ``isaaclab`` (e.g. + # ``isaac-sim.streaming.sh``), pulling a mismatched NCCL and crashing with + # ``undefined symbol: ncclDevCommCreate``. Never let that state ship silently. + # Only relevant when symlinking (Linux); the Windows branch deliberately copies the + # env package into the prebundle, which is a real directory by design. + if use_symlinks and (site_packages / "torch").exists(): + shadowing = [ + prebundle_dir / "torch" + for prebundle_dir in prebundle_dirs + if (prebundle_dir / "torch").is_dir() and not (prebundle_dir / "torch").is_symlink() + ] + if shadowing: + raise RuntimeError( + "Failed to neutralize prebundled torch under Isaac Sim; the following would shadow the " + "pip-installed torch and crash non-isaaclab launches:\n " + "\n ".join(str(p) for p in shadowing) + ) + def command_install(install_type: str = "all") -> None: """Install Isaac Lab extensions and optional extras. diff --git a/source/isaaclab/test/cli/test_install.py b/source/isaaclab/test/cli/test_install.py index 13494cec696d..9be554c9b11b 100644 --- a/source/isaaclab/test/cli/test_install.py +++ b/source/isaaclab/test/cli/test_install.py @@ -222,3 +222,36 @@ def test_uses_package_metadata_when_no_version_file(self, tmp_path): ): result = determine_python_version() assert result == "3.11" + + +# --------------------------------------------------------------------------- +# Prebundled-torch shadowing invariant (regression: nvbugs 6343978) +# --------------------------------------------------------------------------- + + +def test_no_shadowing_prebundled_torch_in_isaac_sim(): + """A prebundled torch must not shadow the pip-installed torch. + + Regression test for nvbugs 6343978: Isaac Sim 6.0 ships a prebundled PyTorch under + the deprecated ``omni.isaac.ml_archive`` extension whose ``libtorch_cuda.so`` + requires an NCCL symbol the co-bundled NCCL does not export. Launch paths that do + not import :mod:`isaaclab` (e.g. ``isaac-sim.streaming.sh`` / ``runheadless.sh``) + bypass the ``sys.path`` deprioritization and import this broken copy, crashing with + ``undefined symbol: ncclDevCommCreate``. After install/build, every + ``pip_prebundle/torch`` under Isaac Sim must therefore be either removed or a + symlink into the active environment, never a real shadowing directory. + """ + isaacsim_path = extract_isaacsim_path(required=False) + if isaacsim_path is None or not isaacsim_path.exists(): + pytest.skip("Isaac Sim installation not found; skipping prebundle-shadow invariant check") + + shadowing = [ + prebundled_torch + for prebundled_torch in isaacsim_path.rglob("pip_prebundle/torch") + if prebundled_torch.is_dir() and not prebundled_torch.is_symlink() + ] + assert not shadowing, ( + "Found prebundled torch directories that shadow the pip-installed torch (nvbugs 6343978). " + "They must be removed at image build time or repointed to the active environment:\n " + + "\n ".join(str(p) for p in shadowing) + ) diff --git a/source/isaaclab/test/cli/test_install_commands.py b/source/isaaclab/test/cli/test_install_commands.py index f773d9f026cf..af1ba751c2aa 100644 --- a/source/isaaclab/test/cli/test_install_commands.py +++ b/source/isaaclab/test/cli/test_install_commands.py @@ -643,7 +643,7 @@ def test_local_build_symlinks_torch_to_venv_site_packages(self, tmp_path): symlink = prebundle / "torch" assert symlink.is_symlink(), "torch should be a symlink after repoint" assert symlink.resolve() == (site_pkgs / "torch").resolve() - assert (prebundle / "torch.bak").is_dir(), "Original torch should be backed up" + assert not (prebundle / "torch.bak").exists(), "repoint replaces in place — no .bak (env copy is the target)" def test_local_build_skips_nvidia_when_cudnn_absent_kit_python(self, tmp_path): """Local build + kit Python: site-packages/nvidia has only 'srl' (no cudnn) → nvidia NOT repointed. @@ -717,23 +717,20 @@ def test_updates_stale_symlink_pointing_to_old_env(self, tmp_path): assert (prebundle / "torch").resolve() == (site_pkgs / "torch").resolve(), "Stale symlink must be updated" - def test_removes_old_backup_before_renaming(self, tmp_path): - """A pre-existing .bak directory is removed before the current package is backed up.""" + def test_raises_when_prebundled_torch_not_neutralized(self, tmp_path): + """Fail loud: a real prebundled torch surviving repoint would shadow the pip torch + on launch paths that do not import isaaclab (nvbugs 6343978), so repoint raises + instead of silently leaving the broken state in place.""" isaacsim_path, prebundle = self._sim_with_prebundle(tmp_path / "sim", ["torch"]) site_pkgs = _make_site_packages(tmp_path / "env", ["torch"]) py = str(tmp_path / "env" / "bin" / "python") - # Simulate leftover backup from a previous partial install. - old_backup = prebundle / "torch.bak" - old_backup.mkdir() - (old_backup / "stale_file.py").touch() - + # Simulate the removal not taking effect (e.g. an unhandled filesystem quirk): the + # prebundled torch stays a real directory rather than becoming a symlink. with self._patch(isaacsim_path, site_pkgs, py): - _repoint_prebundle_packages() - - assert (prebundle / "torch").is_symlink(), "torch must be repointed" - # The old backup was replaced by the fresh backup. - assert (prebundle / "torch.bak").is_dir() + with mock.patch("isaaclab.cli.commands.install._force_remove"): + with pytest.raises(RuntimeError, match="neutralize"): + _repoint_prebundle_packages() # ---- pip-installed isaacsim (path found via import probe) ---------------- From 0954ba7e2445f5b0902e3f4b948ebcd5d48b8ee3 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 06:30:23 +0000 Subject: [PATCH 23/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.13 → 6.1.14 --- ...uanh-fix-sim6-prebundle-torch-streaming.rst | 13 ------------- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 14 deletions(-) delete mode 100644 source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst diff --git a/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst b/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst deleted file mode 100644 index c971f5f6fa87..000000000000 --- a/source/isaaclab/changelog.d/jichuanh-fix-sim6-prebundle-torch-streaming.rst +++ /dev/null @@ -1,13 +0,0 @@ -Fixed -^^^^^ - -* Fixed a crash (``undefined symbol: ncclDevCommCreate``) when launching the Isaac Sim - streaming app (e.g. ``isaac-sim.streaming.sh`` / ``runheadless.sh``) from an Isaac Lab - install against Isaac Sim 6.0. Isaac Sim's deprecated ``omni.isaac.ml_archive`` prebundle - ships its own PyTorch and NCCL while Isaac Lab installs a different pinned PyTorch; on - launch paths that do not import Isaac Lab (which otherwise deprioritizes the prebundle on - ``sys.path``), the two NCCL copies collide and the prebundled torch binds to the wrong - one. The install step that repoints the prebundle to the active environment now uses - overlayfs-safe filesystem operations, so it works inside the Docker image build (where it - previously failed silently with ``EXDEV`` / ``EINVAL``) and fails loudly if a shadowing - copy remains. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index f7ebffcca64d..7b3b29210dd8 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.13" +version = "6.1.14" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 64bf19efd383..650db0cac5c5 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,24 @@ Changelog --------- +6.1.14 (2026-06-30) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed a crash (``undefined symbol: ncclDevCommCreate``) when launching the Isaac Sim + streaming app (e.g. ``isaac-sim.streaming.sh`` / ``runheadless.sh``) from an Isaac Lab + install against Isaac Sim 6.0. Isaac Sim's deprecated ``omni.isaac.ml_archive`` prebundle + ships its own PyTorch and NCCL while Isaac Lab installs a different pinned PyTorch; on + launch paths that do not import Isaac Lab (which otherwise deprioritizes the prebundle on + ``sys.path``), the two NCCL copies collide and the prebundled torch binds to the wrong + one. The install step that repoints the prebundle to the active environment now uses + overlayfs-safe filesystem operations, so it works inside the Docker image build (where it + previously failed silently with ``EXDEV`` / ``EINVAL``) and fails loudly if a shadowing + copy remains. + + 6.1.13 (2026-06-29) ~~~~~~~~~~~~~~~~~~~ From ffff603eafc6b74264a5261cc0183d6a65390d78 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Tue, 30 Jun 2026 21:36:12 -0700 Subject: [PATCH 24/32] Updates pyarrow version (#6310) # Description Bumps pyarrow version to 23.0.1 due to vulnerability in 22.0.0. Also removes some links that were added by mistake. ## Type of change - Bug fix (non-breaking change which fixes an issue) - Documentation update ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there --- source/isaaclab/setup.py | 3 +-- source/isaaclab_visualizers/setup.py | 2 +- tools/wheel_builder/res/python_packages.toml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index a5a416da52c6..ff52ece20303 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -87,10 +87,9 @@ ] # Pin hf-xet to avoid broken tarball (hf_xet-1.1.8.dev2) cached on NVIDIA Artifactory. -# (https://urm.nvidia.com/artifactory/api/pypi/ct-omniverse-pypi) that gets installed with --pre +# that gets installed with --pre # and --extra-index-url flags. The broken hf-xet-1.1.8.dev2 package is present as of Mar 12 2026. # TODO: Can be removed once the broken hf-xet-1.1.8.dev2 package is removed from NVIDIA Artifactory. -# Issue: https://nvbugs/5974917 includes verification steps. INSTALL_REQUIRES += [ # 1.4.1 is latest as of Mar 12 2026 f"hf-xet>=1.4.1,<2.0.0 ; ({SUPPORTED_ARCHS_ARM})", diff --git a/source/isaaclab_visualizers/setup.py b/source/isaaclab_visualizers/setup.py index 69659195a03a..e1391be7a0b4 100644 --- a/source/isaaclab_visualizers/setup.py +++ b/source/isaaclab_visualizers/setup.py @@ -34,7 +34,7 @@ "rerun": [ "newton[sim]==1.2.1", "rerun-sdk>=0.29.0", - "pyarrow==22.0.0", + "pyarrow==23.0.1", ], "viser": [ "newton[sim]==1.2.1", diff --git a/tools/wheel_builder/res/python_packages.toml b/tools/wheel_builder/res/python_packages.toml index aac0d0c2e5c4..a201224af8de 100644 --- a/tools/wheel_builder/res/python_packages.toml +++ b/tools/wheel_builder/res/python_packages.toml @@ -41,7 +41,7 @@ pyproject.dependencies.all = [ # visualizers "imgui-bundle==1.92.601", "rerun-sdk>=0.29.0", - "pyarrow==22.0.0", + "pyarrow==23.0.1", # viser is intentionally not a base dep: viser>=1.0.16 pulls websockets>=13.1, # but isaacsim-kernel==6.0.0.0 pins websockets==12.0. Users who want the viser # visualizer install isaaclab[viser] explicitly (see the optional-dependencies From c5b042d6579a04306ebe3d72207f94fadcf1748e Mon Sep 17 00:00:00 2001 From: hujc Date: Fri, 10 Jul 2026 14:18:07 -0700 Subject: [PATCH 25/32] [Fix] Cherry-pick docker install extension-startup fix (prebundle deletion, pin-pink) (#6436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Cherry-pick of #6329 onto `release/3.0.0-beta2` — the follow-up to #6295 for NVBug 6410989 (continuation of NVBug 6343978): Docker streaming works but the log floods with 438 `[Error]` lines and 14 Isaac Sim extensions fail to load. uv installs are unaffected. ## 1. Summary - Relaxed the vestigial `packaging<24` bound in `isaaclab_rl` — it forced pip to downgrade `packaging` and delete it from the `omni.isaac.core_archive` prebundle, dangling the per-file symlink farm `omni.services.pip_archive` shares with it (13 extension startup failures). - Bumped `pin-pink` `3.1.0` → `3.3.0` at every pin site — `isaacsim.robot_motion.pink` needs `pink.exceptions.NoSolutionFound` (pink ≥ 3.3.0); pink 3.4+ stays excluded (pink_ik task-API break, #5846). The wheel spec's `pin-pink>=2.3.6` also becomes `==3.3.0` (it currently resolves to 4.x). - Added the fail-loud post-install invariant: the install aborts when pip leaves a prebundled Isaac Sim package with a dangling `__init__.py`; other new dangling links only warn. ## 2. Backport adaptations vs #6329 This branch predates the #6009 dependency centralization, so: - Pin edits land in `source/isaaclab/setup.py`, `source/isaaclab_rl/setup.py`, and `tools/wheel_builder/res/python_packages.toml` instead of the root `pyproject.toml`. - The install CLI keeps its hardcoded `_PINK_IK_STACK` (bumped to 3.3.0); the pyproject-derived stack from #6329 and its tests are not ported — the derivation would `KeyError` here since the root `pyproject.toml` has no pin entries on this branch. - `import pytest` added to `test_install_prebundle.py` (develop had it from an intermediate commit not on this branch). ## 3. Heads-up: the invariant can surface latent arm64 breakage On develop, the first nightly image build containing #6329 failed its arm64 leg because the invariant caught a real prebundle breakage (Pillow deleted from `omni.kit.pip_archive`). If this release branch's arm64 docker build has a similar latent issue, the invariant will turn a silently-broken image into a failed build — that is by design, but worth knowing before merging. ## 4. Test plan - [x] `source/isaaclab/test/cli/` — 141 passed locally (prebundle invariant tests included). - [ ] PR CI green. --------- Co-authored-by: Piotr Barejko --- .../02_gear_assembly/gear_assembly_policy.rst | 4 +- ...chuanh-docker-install-prebundle-safety.rst | 11 ++ .../isaaclab/isaaclab/cli/commands/install.py | 127 +++++++++++++++--- .../isaaclab/controllers/pink_ik/pink_ik.py | 4 +- source/isaaclab/setup.py | 2 +- .../test/cli/test_install_prebundle.py | 83 +++++++++++- ...chuanh-docker-install-prebundle-safety.rst | 8 ++ source/isaaclab_rl/setup.py | 2 +- tools/wheel_builder/res/python_packages.toml | 4 +- 9 files changed, 214 insertions(+), 31 deletions(-) create mode 100644 source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst create mode 100644 source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst diff --git a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst index dfef283d2a77..93bba03ab6ac 100644 --- a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst +++ b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst @@ -36,7 +36,7 @@ This environment has been successfully deployed on real UR10e and Flexiv Rizon 4 **Scope of This Tutorial:** -This tutorial focuses exclusively on the **training part** of the sim-to-real transfer workflow in Isaac Lab. For the complete deployment workflow on the real robot, including the exact steps to set up the vision pipeline, robot interface and the ROS inference node to run your trained policy on real hardware, please refer to the `Isaac ROS Documentation `_. +This tutorial focuses exclusively on the **training part** of the sim-to-real transfer workflow in Isaac Lab. For the complete deployment workflow on the real robot, including the exact steps to set up the vision pipeline, robot interface and the ROS inference node to run your trained policy on real hardware, please refer to the `Isaac ROS Documentation `_. Overview -------- @@ -755,7 +755,7 @@ Replace the log directory path with your actual training log location if differe Step 3: Deploy on Real Robot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Once training is complete, follow the `Isaac ROS inference documentation `_ to deploy your policy. +Once training is complete, follow the `Isaac ROS inference documentation `_ to deploy your policy. The Isaac ROS deployment pipeline directly uses the trained model checkpoint (``.pt`` file) along with the ``agent.yaml`` and ``env.yaml`` configuration files generated during training. No additional export step is required. diff --git a/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst b/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst new file mode 100644 index 000000000000..eda839cbc814 --- /dev/null +++ b/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst @@ -0,0 +1,11 @@ +Fixed +^^^^^ + +* Added a fail-loud post-install check that aborts installation when pip + operations leave a prebundled Isaac Sim package with a dangling + ``__init__.py`` (other new dangling symlinks are reported as warnings). +* Fixed the ``isaacsim.robot_motion.pink`` extension failing to load after + installation by moving the ``pin-pink`` pin from ``3.1.0`` to ``3.3.0``, which + provides ``pink.exceptions.NoSolutionFound`` while staying below the pink 3.4 + task-API break. Environments installed manually should update with + ``pip install pin-pink==3.3.0``. diff --git a/source/isaaclab/isaaclab/cli/commands/install.py b/source/isaaclab/isaaclab/cli/commands/install.py index d3740f0319b3..b43052b79508 100644 --- a/source/isaaclab/isaaclab/cli/commands/install.py +++ b/source/isaaclab/isaaclab/cli/commands/install.py @@ -208,7 +208,8 @@ def _maybe_preinstall_arm_nlopt(python_exe: str, pip_cmd: list[str]) -> None: # via the cmeel ``pin`` wheel, which provides the ``pinocchio`` Python module under # ``cmeel.prefix/lib/python3.12/site-packages/`` and registers it on sys.path via a # ``cmeel.pth`` hook. DAQP provides the QP solver selected by the Pink IK controller. -_PINK_IK_STACK = ("pin", "pin-pink==3.1.0", "daqp==0.8.5") +# pin-pink: Isaac Sim 6.x needs >=3.3, 3.4+ breaks pink_ik; daqp >0.8.5 changes behavior. +_PINK_IK_STACK = ("pin", "pin-pink==3.3.0", "daqp==0.8.5") def _ensure_pink_ik_dependencies_installed(python_exe: str, pip_cmd: list[str], *, probe_env: dict[str, str]) -> None: @@ -263,7 +264,7 @@ def _ensure_pink_ik_dependencies_installed(python_exe: str, pip_cmd: list[str], print_warning( "Force-installing the cmeel pinocchio and DAQP stack failed (returncode " f"{install_result.returncode}). The pink IK controller and its tests will not be" - " usable until ``pin pin-pink==3.1.0 daqp==0.8.5`` is installed manually." + f" usable until ``{' '.join(_PINK_IK_STACK)}`` is installed manually." ) @@ -730,6 +731,98 @@ def _force_remove(path: Path) -> None: os.rmdir(path) +def _discover_prebundle_dirs() -> set[Path]: + """Find every ``pip_prebundle`` directory under the Isaac Sim installation. + + Searches both the Isaac Sim tree and the Omniverse cache roots — some Isaac + Sim directories are symlinked into ``~/.local/share/ov`` and would be missed + by a plain ``rglob()`` on ``_isaac_sim``. Returns an empty set when no Isaac + Sim installation is present. + """ + isaacsim_path = extract_isaacsim_path(required=False) + if isaacsim_path is None or not isaacsim_path.exists(): + return set() + + candidate_roots: set[Path] = set() + for root in ( + isaacsim_path, + isaacsim_path.resolve(), + isaacsim_path / "extscache", + Path.home() / ".local" / "share" / "ov" / "data" / "exts", + Path.home() / ".local" / "share" / "ov" / "data" / "exts" / "v2", + ): + if root.exists(): + candidate_roots.add(root) + candidate_roots.add(root.resolve()) + + prebundle_dirs: set[Path] = set() + for root in candidate_roots: + prebundle_dirs.update(root.rglob("pip_prebundle")) + return prebundle_dirs + + +def _find_dangling_prebundle_symlinks() -> set[Path]: + """Find symlinks under Isaac Sim prebundles whose targets do not resolve. + + Isaac Sim deduplicates packages shared by several extensions as per-file + symlink farms between ``pip_prebundle`` directories. pip operations routinely + replace prebundled distributions with copies in ``site-packages`` — harmless + on its own — but deleting a copy that other prebundles link into leaves + dangling symlinks that break extension startup at runtime. + """ + dangling: set[Path] = set() + for prebundle_dir in _discover_prebundle_dirs(): + for root, _dirs, files in os.walk(prebundle_dir): + for name in files: + path = Path(root) / name + if path.is_symlink() and not path.exists(): + dangling.add(path) + return dangling + + +def _assert_no_new_dangling_prebundle_symlinks(before: set[Path]) -> None: + """Fail when the installation broke a prebundled package's symlinked ``__init__.py``. + + A new dangling symlink means a pip operation deleted a prebundled package + that other extensions reference through Isaac Sim's symlink farms — the + failure mode behind the ``packaging`` removal cascade in nvbugs 6343978 + (14 extensions failing to start). Routine pip replacements do leave a few + dozen dangling links to files Python never imports at startup (test modules, + ``WHEEL``/license files, cmake hooks), so only a dangling ``__init__.py`` — + which makes the whole package unimportable — fails the install; other new + dangling links are reported as warnings. + + Args: + before: Dangling symlinks from :func:`_find_dangling_prebundle_symlinks`, + collected before the pip operations. + + Raises: + RuntimeError: If the installation left a prebundled package with a + dangling ``__init__.py``. + """ + introduced = sorted(_find_dangling_prebundle_symlinks() - before) + if not introduced: + return + broken_packages = [p for p in introduced if p.name == "__init__.py"] + if broken_packages: + shown = "\n ".join(str(p) for p in broken_packages) + raise RuntimeError( + f"Installation broke {len(broken_packages)} prebundled package(s) in Isaac Sim" + f" (dangling __init__.py, {len(introduced)} new dangling symlink(s) total):\n " + + shown + + "\nA pip operation deleted a prebundled package that other Isaac Sim extensions share" + " via symlinks; extensions will fail to start at runtime (see nvbugs 6343978). This" + " usually means a dependency pin forced pip to downgrade/replace the prebundled copy —" + " fix that pin instead of shipping a broken prebundle, and restore the Isaac Sim" + " installation before retrying." + ) + print_warning( + f"Installation left {len(introduced)} new dangling symlink(s) in Isaac Sim prebundles" + " (no package __init__.py affected — extensions should still start). First few: " + + ", ".join(str(p) for p in introduced[:5]) + ) + + def _repoint_prebundle_packages() -> None: """Replace prebundled packages in Isaac Sim with symlinks to the active environment. @@ -763,25 +856,7 @@ def _repoint_prebundle_packages() -> None: print_warning(f"site-packages directory not found: {site_packages} — skipping prebundle repoint.") return - # Discover pip_prebundle directories from both the Isaac Sim tree and - # Omniverse cache roots. Some Isaac Sim directories are symlinked into - # ~/.local/share/ov and may be missed by a plain rglob() on _isaac_sim. - candidate_roots: set[Path] = set() - for root in ( - isaacsim_path, - isaacsim_path.resolve(), - isaacsim_path / "extscache", - Path.home() / ".local" / "share" / "ov" / "data" / "exts", - Path.home() / ".local" / "share" / "ov" / "data" / "exts" / "v2", - ): - if root.exists(): - candidate_roots.add(root) - candidate_roots.add(root.resolve()) - - prebundle_dirs: set[Path] = set() - for root in candidate_roots: - prebundle_dirs.update(root.rglob("pip_prebundle")) - + prebundle_dirs = _discover_prebundle_dirs() if not prebundle_dirs: print_debug("No pip_prebundle directories found under Isaac Sim.") return @@ -987,6 +1062,10 @@ def append_submodules_once(package_dirs: tuple[str, ...]) -> None: if saved_pythonpath is not None: probe_env["PYTHONPATH"] = saved_pythonpath + # Baseline for the post-install integrity check: no pip operation below may + # leave new dangling symlinks in Isaac Sim's prebundles (nvbugs 6343978). + dangling_symlinks_before = _find_dangling_prebundle_symlinks() + try: # Upgrade pip first to avoid compatibility issues (skip when using uv). if not using_uv: @@ -1038,6 +1117,12 @@ def append_submodules_once(package_dirs: tuple[str, ...]) -> None: # ordering (e.g. torch+cu130 in venv vs torch+cu128 in prebundle on aarch64). _repoint_prebundle_packages() + # Fail loud if any pip operation above broke Isaac Sim's cross-extension + # symlink farms. Prebundle deletions on their own are routine (pip + # replaces those packages in site-packages, which shadows the prebundle + # at runtime); only newly dangling symlinks break extension startup. + _assert_no_new_dangling_prebundle_symlinks(dangling_symlinks_before) + finally: # Restore LD_PRELOAD if we cleared it. if saved_ld_preload: diff --git a/source/isaaclab/isaaclab/controllers/pink_ik/pink_ik.py b/source/isaaclab/isaaclab/controllers/pink_ik/pink_ik.py index 1520afdb0177..2bc4958809cb 100644 --- a/source/isaaclab/isaaclab/controllers/pink_ik/pink_ik.py +++ b/source/isaaclab/isaaclab/controllers/pink_ik/pink_ik.py @@ -271,14 +271,14 @@ def _return_current_joint_positions(error: Exception) -> torch.Tensor: except SolverNotFound as e: raise RuntimeError( f"Pink IK requires the '{_QP_SOLVER}' QP solver. Install the Pink IK stack with " - "``./isaaclab.sh -i`` or manually install ``pin pin-pink==3.1.0 daqp==0.8.5``." + "``./isaaclab.sh -i`` or manually install ``pin pin-pink==3.3.0 daqp==0.8.5``." ) from e except TypeError as e: if "primal_start" in str(e): raise RuntimeError( "Pink IK requires a DAQP version compatible with qpsolvers warm-start arguments. " "Install the Pink IK stack with ``./isaaclab.sh -i`` or manually install " - "``pin pin-pink==3.1.0 daqp==0.8.5``." + "``pin pin-pink==3.3.0 daqp==0.8.5``." ) from e return _return_current_joint_positions(e) except (AssertionError, Exception) as e: diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index ff52ece20303..22b15599b835 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -68,7 +68,7 @@ INSTALL_REQUIRES += [ # required by isaaclab.isaaclab.controllers.pink_ik f"pin ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", - f"pin-pink==3.1.0 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", + f"pin-pink==3.3.0 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", f"daqp==0.8.5 ; platform_system == 'Linux' and ({SUPPORTED_ARCHS_ARM})", ] # Adds OpenUSD dependencies based on architecture for Kit less mode. diff --git a/source/isaaclab/test/cli/test_install_prebundle.py b/source/isaaclab/test/cli/test_install_prebundle.py index 021a247a8e2b..c6f0486ad178 100644 --- a/source/isaaclab/test/cli/test_install_prebundle.py +++ b/source/isaaclab/test/cli/test_install_prebundle.py @@ -3,15 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Tests for prebundle probe and _split_install_items. +"""Tests for prebundle probe, _split_install_items, and prebundle dist integrity. Supplements test_install_commands.py with tests that verify the probe -script text and the comma-separated install item parser. +script text, the comma-separated install item parser, and the +snapshot/assert pair guarding Isaac Sim prebundles against pip removals. """ +import shutil from unittest import mock +import pytest + from isaaclab.cli.commands.install import ( + _assert_no_new_dangling_prebundle_symlinks, + _find_dangling_prebundle_symlinks, _torch_first_on_sys_path_is_prebundle, split_install_items, ) @@ -79,3 +85,76 @@ def fake_run(cmd, *, env=None, check=False, capture_output=False, text=False): probe_script = captured_cmd[2] # [python_exe, "-c", probe] assert "pip_prebundle" in probe_script, "Probe must check for 'pip_prebundle'" assert "extsDeprecated" not in probe_script, "Probe must NOT check only for 'extsDeprecated'" + + +# --------------------------------------------------------------------------- +# prebundle dangling-symlink integrity +# --------------------------------------------------------------------------- + + +class TestPrebundleSymlinkIntegrity: + """Tests for :func:`_find_dangling_prebundle_symlinks` and + :func:`_assert_no_new_dangling_prebundle_symlinks`. + + Regression guard for nvbugs 6343978: a pip downgrade deleted ``packaging`` + from the ``omni.isaac.core_archive`` prebundle, dangling the per-file + symlink farm ``omni.services.pip_archive`` shares with it and cascading + into 14 extension startup failures. Prebundle deletions by themselves are + routine (site-packages shadows them); only new dangling symlinks fail. + """ + + def _make_prebundles(self, tmp_path): + core = tmp_path / "exts" / "omni.isaac.core_archive" / "pip_prebundle" + (core / "packaging").mkdir(parents=True) + (core / "packaging" / "__init__.py").write_text("") + services = tmp_path / "extscache" / "omni.services.pip_archive" / "pip_prebundle" + (services / "packaging").mkdir(parents=True) + (services / "packaging" / "__init__.py").symlink_to(core / "packaging" / "__init__.py") + return core, services + + def test_intact_farm_has_no_dangling_links(self, tmp_path): + core, services = self._make_prebundles(tmp_path) + with mock.patch("isaaclab.cli.commands.install._discover_prebundle_dirs", return_value={core, services}): + assert _find_dangling_prebundle_symlinks() == set() + _assert_no_new_dangling_prebundle_symlinks(set()) + + def test_raises_when_symlink_target_deleted(self, tmp_path): + """Deleting the shared copy must fail the install, naming the broken link.""" + core, services = self._make_prebundles(tmp_path) + with mock.patch("isaaclab.cli.commands.install._discover_prebundle_dirs", return_value={core, services}): + before = _find_dangling_prebundle_symlinks() + shutil.rmtree(core / "packaging") + with pytest.raises(RuntimeError, match="dangling symlink") as excinfo: + _assert_no_new_dangling_prebundle_symlinks(before) + assert str(services / "packaging" / "__init__.py") in str(excinfo.value) + + def test_preexisting_dangling_links_are_tolerated(self, tmp_path): + """Links already broken before the install do not fail it.""" + core, services = self._make_prebundles(tmp_path) + (services / "stale.py").symlink_to(core / "does-not-exist.py") + with mock.patch("isaaclab.cli.commands.install._discover_prebundle_dirs", return_value={core, services}): + before = _find_dangling_prebundle_symlinks() + assert before == {services / "stale.py"} + _assert_no_new_dangling_prebundle_symlinks(before) + + def test_routine_dist_replacement_passes(self, tmp_path): + """Deleting a prebundled package nothing links into is not a violation.""" + core, services = self._make_prebundles(tmp_path) + (core / "six.py").write_text("") + with mock.patch("isaaclab.cli.commands.install._discover_prebundle_dirs", return_value={core, services}): + before = _find_dangling_prebundle_symlinks() + (core / "six.py").unlink() + _assert_no_new_dangling_prebundle_symlinks(before) + + def test_non_package_dangles_warn_but_pass(self, tmp_path): + """Routine residue (dangling non-__init__ files) warns without failing. + + Every docker build leaves a few dozen dangling links to files Python + never imports at startup (test modules, WHEEL/license files, cmake + hooks); those must not abort the install. + """ + core, services = self._make_prebundles(tmp_path) + (services / "WHEEL").symlink_to(core / "gone-WHEEL") + (services / "test_module.py").symlink_to(core / "gone-test.py") + with mock.patch("isaaclab.cli.commands.install._discover_prebundle_dirs", return_value={core, services}): + _assert_no_new_dangling_prebundle_symlinks(set()) diff --git a/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst b/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst new file mode 100644 index 000000000000..285bca61a44f --- /dev/null +++ b/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst @@ -0,0 +1,8 @@ +Fixed +^^^^^ + +* Fixed docker installs deleting ``packaging`` from Isaac Sim's + ``omni.isaac.core_archive`` prebundle by removing the ``packaging<24`` bound + (no consumer requires it). The deletion dangled the symlink farm that + ``omni.services.pip_archive`` shares with it and broke 13 extensions at + startup. diff --git a/source/isaaclab_rl/setup.py b/source/isaaclab_rl/setup.py index 2a42fab4315b..fb89bed2136b 100644 --- a/source/isaaclab_rl/setup.py +++ b/source/isaaclab_rl/setup.py @@ -31,7 +31,7 @@ "tensorboard", # video recording "moviepy", - "packaging<24", + "packaging", "tqdm==4.67.1", # previous version was causing sys errors ] diff --git a/tools/wheel_builder/res/python_packages.toml b/tools/wheel_builder/res/python_packages.toml index a201224af8de..715bdfbadde7 100644 --- a/tools/wheel_builder/res/python_packages.toml +++ b/tools/wheel_builder/res/python_packages.toml @@ -51,7 +51,7 @@ pyproject.dependencies.all = [ "pydantic>=2.7,<2.12", "lazy_loader>=0.4", "pin ; platform_system == 'Linux'", - "pin-pink>=2.3.6 ; platform_system == 'Linux'", + "pin-pink==3.3.0 ; platform_system == 'Linux'", # ================================================================================ # https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_rl/setup.py # ================================================================================ @@ -68,7 +68,7 @@ pyproject.dependencies.all = [ "tensorboard", # video recording "moviepy", - "packaging<24", + "packaging", "tqdm==4.67.1", # ================================================================================ # https://github.com/isaac-sim/IsaacLab/blob/main/source/isaaclab_tasks/setup.py From 7d2f5a572fd821f44e05671188d793b73677cf8f Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 05:54:29 +0000 Subject: [PATCH 26/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.14 → 6.1.15 - isaaclab_rl: 0.5.5 → 0.5.6 --- .../jichuanh-docker-install-prebundle-safety.rst | 11 ----------- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 16 ++++++++++++++++ .../jichuanh-docker-install-prebundle-safety.rst | 8 -------- source/isaaclab_rl/config/extension.toml | 2 +- source/isaaclab_rl/docs/CHANGELOG.rst | 13 +++++++++++++ 6 files changed, 31 insertions(+), 21 deletions(-) delete mode 100644 source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst delete mode 100644 source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst diff --git a/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst b/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst deleted file mode 100644 index eda839cbc814..000000000000 --- a/source/isaaclab/changelog.d/jichuanh-docker-install-prebundle-safety.rst +++ /dev/null @@ -1,11 +0,0 @@ -Fixed -^^^^^ - -* Added a fail-loud post-install check that aborts installation when pip - operations leave a prebundled Isaac Sim package with a dangling - ``__init__.py`` (other new dangling symlinks are reported as warnings). -* Fixed the ``isaacsim.robot_motion.pink`` extension failing to load after - installation by moving the ``pin-pink`` pin from ``3.1.0`` to ``3.3.0``, which - provides ``pink.exceptions.NoSolutionFound`` while staying below the pink 3.4 - task-API break. Environments installed manually should update with - ``pip install pin-pink==3.3.0``. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 7b3b29210dd8..592c23d9c89d 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.14" +version = "6.1.15" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 650db0cac5c5..9e09bda79a73 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,22 @@ Changelog --------- +6.1.15 (2026-07-11) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Added a fail-loud post-install check that aborts installation when pip + operations leave a prebundled Isaac Sim package with a dangling + ``__init__.py`` (other new dangling symlinks are reported as warnings). +* Fixed the ``isaacsim.robot_motion.pink`` extension failing to load after + installation by moving the ``pin-pink`` pin from ``3.1.0`` to ``3.3.0``, which + provides ``pink.exceptions.NoSolutionFound`` while staying below the pink 3.4 + task-API break. Environments installed manually should update with + ``pip install pin-pink==3.3.0``. + + 6.1.14 (2026-06-30) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst b/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst deleted file mode 100644 index 285bca61a44f..000000000000 --- a/source/isaaclab_rl/changelog.d/jichuanh-docker-install-prebundle-safety.rst +++ /dev/null @@ -1,8 +0,0 @@ -Fixed -^^^^^ - -* Fixed docker installs deleting ``packaging`` from Isaac Sim's - ``omni.isaac.core_archive`` prebundle by removing the ``packaging<24`` bound - (no consumer requires it). The deletion dangled the symlink farm that - ``omni.services.pip_archive`` shares with it and broke 13 extensions at - startup. diff --git a/source/isaaclab_rl/config/extension.toml b/source/isaaclab_rl/config/extension.toml index 5897bc6bb22d..b97db3d2ad1e 100644 --- a/source/isaaclab_rl/config/extension.toml +++ b/source/isaaclab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.5.5" +version = "0.5.6" # Description title = "Isaac Lab RL" diff --git a/source/isaaclab_rl/docs/CHANGELOG.rst b/source/isaaclab_rl/docs/CHANGELOG.rst index 7f1f08c897bb..8564dd927db1 100644 --- a/source/isaaclab_rl/docs/CHANGELOG.rst +++ b/source/isaaclab_rl/docs/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog --------- +0.5.6 (2026-07-11) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed docker installs deleting ``packaging`` from Isaac Sim's + ``omni.isaac.core_archive`` prebundle by removing the ``packaging<24`` bound + (no consumer requires it). The deletion dangled the symlink farm that + ``omni.services.pip_archive`` shares with it and broke 13 extensions at + startup. + + 0.5.5 (2026-06-26) ~~~~~~~~~~~~~~~~~~ From 763cb1c10602a9710c5c03f5bd976fde1e36e594 Mon Sep 17 00:00:00 2001 From: hujc Date: Mon, 13 Jul 2026 20:50:40 -0700 Subject: [PATCH 27/32] [Fix] Cherry-pick pillow floor to stop arm64 prebundle deletion in docker installs (#6467) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Cherry-pick of #6437 onto `release/3.0.0-beta2`, plus the `isaaclab_rl` pillow floor that this branch's per-package install path additionally needs. Unblocks the `Publish Docker Images` arm64 leg, which fails since the #6436 post-install invariant landed (run [29124274839](https://github.com/isaac-sim/IsaacLab/actions/runs/29124274839)). ## 1. Summary - Root cause on this branch: `moviepy` (unpinned in `isaaclab_rl`) resolves to 2.2.1, which caps `pillow<12.0`. The standalone `isaaclab_rl` install batches do not have `isaaclab`'s pillow pin in their resolution set, so pip downgrades pillow to 11.3.0 and uninstalls the prebundled pillow 12.2.0 from `omni.kit.pip_archive` — on aarch64 that dangles the per-file symlink farm (228 links incl. `PIL/__init__.py`) and breaks extension startup at runtime (nvbugs 6410989). Green builds before the invariant were already doing this silently (run [28493820266](https://github.com/isaac-sim/IsaacLab/actions/runs/28493820266) shows the same `Uninstalling pillow-12.2.0`). - `source/isaaclab_rl/setup.py`: added a `pillow>=12.1.1` floor — pip then backs moviepy off to 1.0.3 instead of touching pillow. - `source/isaaclab/setup.py`: relaxed the exact `pillow==12.2.0` pin to `>=12.1.1` (the #6437 change), so a future Isaac Sim base-image bump past the pinned version cannot force the same downgrade. - `tools/wheel_builder/res/python_packages.toml`: mirrored both changes. - `moviepy` bounded to `>=1.0.3,<2.0.0.dev0` (the #6454 change adapted to this branch): with the floor excluding stable moviepy 2.x, prerelease-allowing resolvers (uv with `prerelease = "allow"`) otherwise fall through to the broken `2.0.0.dev2` build; the bound makes pip and uv both resolve stable 1.0.3. ## 2. Backport adaptations vs #6437 - This branch predates the #6009 dependency centralization, so the floor lands in the two `setup.py` files + the wheel spec instead of the root `pyproject.toml`. - The extra `isaaclab_rl` floor is beta2-specific: develop resolves `isaaclab` + RL dependencies in one pip batch where the central floor is in scope; this branch installs per package, so `isaaclab_rl`'s own resolution needs the floor. An exact `pillow==12.2.0` in `isaaclab` demonstrably did not protect it — the failing run shows `Uninstalling pillow-12.2.0` during the `isaaclab_rl` batch with only a resolver warning for the isaaclab pin. ## 3. Test plan - [x] Resolver regression proof (py3.12 venv with pillow 12.2.0 preinstalled — the prebundle state — then `pip install --dry-run --report` of `source/isaaclab_rl`): - without fix: plans `pillow 11.3.0` + `moviepy 2.2.1` (the prebundle-deleting downgrade) - with fix: plans `moviepy 1.0.3` + `decorator 4.4.2`; pillow untouched - [x] `source/isaaclab/test/cli` — 140 passed, 1 skipped locally. - [x] pre-commit clean on all files. - [ ] Local amd64 `docker build -f docker/Dockerfile.base` with the fix (in progress). - [ ] PR CI green (incl. Build Base Docker Image + ARM installation tests). - [x] arm64 proof: diagnostic PR #6469 ran the exact publish arm64 leg (build-only) with this fix — green (run [29134632249](https://github.com/isaac-sim/IsaacLab/actions/runs/29134632249)): moviepy backtracks to 1.0.3, no pillow uninstall, post-install invariant passes. - [ ] After merge: the next `Publish Docker Images` run on `release/3.0.0-beta2` validates the arm64 leg — run [29124274839](https://github.com/isaac-sim/IsaacLab/actions/runs/29124274839) is the FAIL baseline. --- .../jichuanh-pillow-prebundle-floor.rst | 9 +++++++++ source/isaaclab/setup.py | 5 +++-- .../jichuanh-pillow-prebundle-floor.rst | 14 ++++++++++++++ source/isaaclab_rl/setup.py | 8 +++++++- tools/wheel_builder/res/python_packages.toml | 11 ++++++++--- 5 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst create mode 100644 source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst diff --git a/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst b/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst new file mode 100644 index 000000000000..288c07377bbd --- /dev/null +++ b/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst @@ -0,0 +1,9 @@ +Fixed +^^^^^ + +* Fixed docker installs deleting ``pillow`` from Isaac Sim's + ``omni.kit.pip_archive`` prebundle by relaxing the exact ``pillow==12.2.0`` + pin to a ``>=12.1.1`` floor. An exact pin below the version prebundled by a + future Isaac Sim base image forces a downgrade that deletes the prebundled + copy, dangling the per-file symlink farm on aarch64 and breaking extension + startup. diff --git a/source/isaaclab/setup.py b/source/isaaclab/setup.py index 22b15599b835..2bbf207b4cc1 100644 --- a/source/isaaclab/setup.py +++ b/source/isaaclab/setup.py @@ -35,8 +35,9 @@ "einops", # needed for transformers, doesn't always auto-install "warp-lang==1.13.0", "matplotlib>=3.10.3", # minimum version for Python 3.12 support - # make sure this is consistent with isaac sim version - "pillow==12.2.0", + # pillow: floor, not exact — an exact pin below Isaac Sim's prebundled version forces a + # downgrade that deletes the prebundled copy other extensions symlink into (nvbugs 6410989). + "pillow>=12.1.1", # required by omni.replicator.core S3 backend "botocore", # livestream diff --git a/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst b/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst new file mode 100644 index 000000000000..10823c5a1165 --- /dev/null +++ b/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst @@ -0,0 +1,14 @@ +Fixed +^^^^^ + +* Fixed standalone ``isaaclab_rl`` installs downgrading ``pillow`` below the + version prebundled by Isaac Sim: ``moviepy`` 2.x caps ``pillow<12.0``, and + on aarch64 the forced downgrade deleted the prebundled copy that + ``omni.kit.pip_archive`` shares via per-file symlinks, breaking extension + startup. Added a ``pillow>=12.1.1`` floor so pip resolves ``moviepy`` 1.0.3 + instead of touching pillow. +* Fixed ``--video`` recording crashing on prerelease-allowing installs by + bounding ``moviepy`` to ``>=1.0.3,<2.0.0.dev0``: once the pillow floor + excludes stable ``moviepy`` 2.x, such resolvers otherwise fall through to + the broken ``2.0.0.dev2`` build whose ``write_videofile`` drops the clip + fps. diff --git a/source/isaaclab_rl/setup.py b/source/isaaclab_rl/setup.py index fb89bed2136b..633be582a5ed 100644 --- a/source/isaaclab_rl/setup.py +++ b/source/isaaclab_rl/setup.py @@ -30,7 +30,13 @@ # basic logger "tensorboard", # video recording - "moviepy", + # moviepy bounded to the 1.x line: stable 2.x caps pillow<12 (conflicts with the floor + # below), and prerelease-allowing resolvers otherwise fall through to the broken + # 2.0.0.dev2 build whose write_videofile crashes video recording. + "moviepy>=1.0.3,<2.0.0.dev0", + # pillow floor: without it, standalone isaaclab_rl installs let moviepy 2.x (pillow<12 cap) + # downgrade pillow and delete Isaac Sim's prebundled copy (nvbugs 6410989). + "pillow>=12.1.1", "packaging", "tqdm==4.67.1", # previous version was causing sys errors ] diff --git a/tools/wheel_builder/res/python_packages.toml b/tools/wheel_builder/res/python_packages.toml index 715bdfbadde7..58235e1e64ba 100644 --- a/tools/wheel_builder/res/python_packages.toml +++ b/tools/wheel_builder/res/python_packages.toml @@ -24,8 +24,9 @@ pyproject.dependencies.all = [ "einops", # needed for transformers, doesn't always auto-install "warp-lang==1.13.0", "matplotlib>=3.10.3", - # make sure this is consistent with isaac sim version - "pillow==12.2.0", + # pillow: floor, not exact — an exact pin below Isaac Sim's prebundled version forces a + # downgrade that deletes the prebundled copy other extensions symlink into (nvbugs 6410989). + "pillow>=12.1.1", "botocore", # livestream # range chosen to coexist with isaacsim 6.0 (isaacsim-kernel pulls fastapi==0.117.1 -> starlette<0.49.0) @@ -67,7 +68,11 @@ pyproject.dependencies.all = [ # basic logger "tensorboard", # video recording - "moviepy", + # moviepy bound and pillow floor mirror isaaclab_rl/setup.py: keep moviepy 2.x + # (pillow<12 cap) from downgrading pillow below Isaac Sim's prebundled version + # (nvbugs 6410989), and keep prerelease-allowing resolvers off the broken 2.0.0.dev2. + "moviepy>=1.0.3,<2.0.0.dev0", + "pillow>=12.1.1", "packaging", "tqdm==4.67.1", # ================================================================================ From 51b4fb54184fa7c0a406643129953a8b26136230 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 05:49:48 +0000 Subject: [PATCH 28/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.15 → 6.1.16 - isaaclab_rl: 0.5.6 → 0.5.7 --- .../jichuanh-pillow-prebundle-floor.rst | 9 --------- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 14 ++++++++++++++ .../jichuanh-pillow-prebundle-floor.rst | 14 -------------- source/isaaclab_rl/config/extension.toml | 2 +- source/isaaclab_rl/docs/CHANGELOG.rst | 19 +++++++++++++++++++ 6 files changed, 35 insertions(+), 25 deletions(-) delete mode 100644 source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst delete mode 100644 source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst diff --git a/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst b/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst deleted file mode 100644 index 288c07377bbd..000000000000 --- a/source/isaaclab/changelog.d/jichuanh-pillow-prebundle-floor.rst +++ /dev/null @@ -1,9 +0,0 @@ -Fixed -^^^^^ - -* Fixed docker installs deleting ``pillow`` from Isaac Sim's - ``omni.kit.pip_archive`` prebundle by relaxing the exact ``pillow==12.2.0`` - pin to a ``>=12.1.1`` floor. An exact pin below the version prebundled by a - future Isaac Sim base image forces a downgrade that deletes the prebundled - copy, dangling the per-file symlink farm on aarch64 and breaking extension - startup. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index 592c23d9c89d..c674610d294a 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.15" +version = "6.1.16" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 9e09bda79a73..17b2d9b1bab9 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,20 @@ Changelog --------- +6.1.16 (2026-07-14) +~~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed docker installs deleting ``pillow`` from Isaac Sim's + ``omni.kit.pip_archive`` prebundle by relaxing the exact ``pillow==12.2.0`` + pin to a ``>=12.1.1`` floor. An exact pin below the version prebundled by a + future Isaac Sim base image forces a downgrade that deletes the prebundled + copy, dangling the per-file symlink farm on aarch64 and breaking extension + startup. + + 6.1.15 (2026-07-11) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst b/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst deleted file mode 100644 index 10823c5a1165..000000000000 --- a/source/isaaclab_rl/changelog.d/jichuanh-pillow-prebundle-floor.rst +++ /dev/null @@ -1,14 +0,0 @@ -Fixed -^^^^^ - -* Fixed standalone ``isaaclab_rl`` installs downgrading ``pillow`` below the - version prebundled by Isaac Sim: ``moviepy`` 2.x caps ``pillow<12.0``, and - on aarch64 the forced downgrade deleted the prebundled copy that - ``omni.kit.pip_archive`` shares via per-file symlinks, breaking extension - startup. Added a ``pillow>=12.1.1`` floor so pip resolves ``moviepy`` 1.0.3 - instead of touching pillow. -* Fixed ``--video`` recording crashing on prerelease-allowing installs by - bounding ``moviepy`` to ``>=1.0.3,<2.0.0.dev0``: once the pillow floor - excludes stable ``moviepy`` 2.x, such resolvers otherwise fall through to - the broken ``2.0.0.dev2`` build whose ``write_videofile`` drops the clip - fps. diff --git a/source/isaaclab_rl/config/extension.toml b/source/isaaclab_rl/config/extension.toml index b97db3d2ad1e..f7984db2a69b 100644 --- a/source/isaaclab_rl/config/extension.toml +++ b/source/isaaclab_rl/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.5.6" +version = "0.5.7" # Description title = "Isaac Lab RL" diff --git a/source/isaaclab_rl/docs/CHANGELOG.rst b/source/isaaclab_rl/docs/CHANGELOG.rst index 8564dd927db1..dc893dcaaaf0 100644 --- a/source/isaaclab_rl/docs/CHANGELOG.rst +++ b/source/isaaclab_rl/docs/CHANGELOG.rst @@ -1,6 +1,25 @@ Changelog --------- +0.5.7 (2026-07-14) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed standalone ``isaaclab_rl`` installs downgrading ``pillow`` below the + version prebundled by Isaac Sim: ``moviepy`` 2.x caps ``pillow<12.0``, and + on aarch64 the forced downgrade deleted the prebundled copy that + ``omni.kit.pip_archive`` shares via per-file symlinks, breaking extension + startup. Added a ``pillow>=12.1.1`` floor so pip resolves ``moviepy`` 1.0.3 + instead of touching pillow. +* Fixed ``--video`` recording crashing on prerelease-allowing installs by + bounding ``moviepy`` to ``>=1.0.3,<2.0.0.dev0``: once the pillow floor + excludes stable ``moviepy`` 2.x, such resolvers otherwise fall through to + the broken ``2.0.0.dev2`` build whose ``write_videofile`` drops the clip + fps. + + 0.5.6 (2026-07-11) ~~~~~~~~~~~~~~~~~~ From 418ca31b47a8eb27db8aefcfc134e4c4f1d2b6f3 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Thu, 23 Jul 2026 17:35:54 -0700 Subject: [PATCH 29/32] Fix Franka paths and pin CI OVRTX to 0.3 (#6695) # Description Update all 14 Isaac Lab 6.0 references to the Franka Panda instanceable USD so they resolve under `FrankaEmika/Legacy/`. The asset is no longer available at the previous URL: the focused asset-path test reports the old path as missing, while the new S3 object returns HTTP 200. This change covers the spawner examples, simulator and asset tests, `FRANKA_PANDA_CFG`, and the direct Franka cabinet task. Also backport the OVRTX CI pinning behavior from upstream develop commit [`ea8f511280`](https://github.com/isaac-sim/IsaacLab/commit/ea8f511280c5d8cbf93c98e88e383ec66bd0f38d). The release branch stores its OVRTX requirement in `source/isaaclab_ov/setup.py`, so both release CI jobs now install the matching `ovrtx>=0.3.0,<0.4.0` range. A regression test rejects future bare OVRTX installs. No dependencies are added. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## Screenshots Not applicable. ## Validation - Confirmed the focused asset-path test fails with the old URL (`0 != 2`). - Confirmed the OVRTX regression test fails with the original bare CI inputs. - `uv run python -m pytest source/isaaclab/test/utils/test_assets.py::test_check_file_path_nucleus -q` - `uv run python -m pytest source/isaaclab/test/cli/test_uv_run_pyproject.py -q` - `uv run python tools/changelog/cli.py check release/3.0.0-beta2` - `uv run isaaclab -f` - `uv run isaaclab -d` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks with `uv run isaaclab -f` - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fixes are effective - [x] I have added a changelog fragment under `source//changelog.d/` for every touched package - [x] My name already exists in `CONTRIBUTORS.md` --- .github/workflows/build.yaml | 2 +- .github/workflows/daily-compatibility.yml | 2 +- .../fix-franka-legacy-path-beta2.rst | 4 +++ .../isaaclab/sim/spawners/__init__.py | 8 +++-- .../test/cli/test_uv_run_pyproject.py | 35 +++++++++++++++++++ .../test/sim/test_spawn_from_files.py | 2 +- source/isaaclab/test/sim/test_utils_prims.py | 6 ++-- .../isaaclab/test/sim/test_utils_queries.py | 20 ++++++++--- source/isaaclab/test/utils/test_assets.py | 2 +- .../fix-franka-legacy-path-beta2.rst | 4 +++ .../isaaclab_assets/robots/franka.py | 2 +- .../fix-franka-legacy-path-beta2.skip | 0 .../franka_cabinet/franka_cabinet_env_cfg.py | 2 +- 13 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst create mode 100644 source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst create mode 100644 source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fcc1b37d363b..3d7c061fe15c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -706,7 +706,7 @@ jobs: isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} filter-pattern: "isaaclab_tasks" - extra-pip-packages: "ovrtx ovphysx==0.4.13" + extra-pip-packages: "ovrtx>=0.3.0,<0.4.0 ovphysx==0.4.13" include-files: >- test_rendering_cartpole_kitless.py, test_rendering_dexsuite_kuka_homo_kitless.py, diff --git a/.github/workflows/daily-compatibility.yml b/.github/workflows/daily-compatibility.yml index 36a92cc06d49..957973c6deb0 100644 --- a/.github/workflows/daily-compatibility.yml +++ b/.github/workflows/daily-compatibility.yml @@ -111,7 +111,7 @@ jobs: image-tag: ${{ env.DOCKER_IMAGE_TAG }} pytest-options: "" filter-pattern: "isaaclab_tasks" - extra-pip-packages: "ovrtx ovphysx==0.4.13" + extra-pip-packages: "ovrtx>=0.3.0,<0.4.0 ovphysx==0.4.13" - name: Copy All Test Results from IsaacLab Tasks Container run: | diff --git a/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst b/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst new file mode 100644 index 000000000000..d32aefcb2356 --- /dev/null +++ b/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed simulator tests and examples to use the available legacy Franka Panda USD asset. diff --git a/source/isaaclab/isaaclab/sim/spawners/__init__.py b/source/isaaclab/isaaclab/sim/spawners/__init__.py index 8e2541507d5d..a4039270aa42 100644 --- a/source/isaaclab/isaaclab/sim/spawners/__init__.py +++ b/source/isaaclab/isaaclab/sim/spawners/__init__.py @@ -19,7 +19,9 @@ from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR # spawn from USD file - cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd") + cfg = sim_utils.UsdFileCfg( + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" + ) prim_path = "/World/myAsset" # spawn using the function from the module @@ -33,7 +35,9 @@ from isaaclab.utils.assets import ISAACLAB_NUCLEUS_DIR # spawn from USD file - cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd") + cfg = sim_utils.UsdFileCfg( + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" + ) prim_path = "/World/myAsset" # use the `func` reference in the config class diff --git a/source/isaaclab/test/cli/test_uv_run_pyproject.py b/source/isaaclab/test/cli/test_uv_run_pyproject.py index 61461c6473da..076dc63a8959 100644 --- a/source/isaaclab/test/cli/test_uv_run_pyproject.py +++ b/source/isaaclab/test/cli/test_uv_run_pyproject.py @@ -7,6 +7,7 @@ from __future__ import annotations +import ast import re from pathlib import Path @@ -27,6 +28,24 @@ def _root_pyproject() -> dict: return tomllib.load(f) +def _ovrtx_requirement_from_setup() -> str: + """Return the OVRTX requirement declared by ``source/isaaclab_ov/setup.py``.""" + setup_path = _repo_root() / "source/isaaclab_ov/setup.py" + module = ast.parse(setup_path.read_text(encoding="utf-8")) + + for node in module.body: + if not isinstance(node, ast.Assign): + continue + if not any(isinstance(target, ast.Name) and target.id == "EXTRAS_REQUIRE" for target in node.targets): + continue + extras_require = ast.literal_eval(node.value) + for dependency in extras_require["ovrtx"]: + if dependency.startswith("ovrtx"): + return dependency + + raise AssertionError("Could not find the OVRTX requirement in source/isaaclab_ov/setup.py") + + def test_uv_run_extra_names_match_documented_workflow(): """Docs must only reference ``uv run --extra`` names that pyproject defines.""" repo_root = _repo_root() @@ -86,3 +105,19 @@ def test_uv_run_uses_managed_python(): tool_uv = _root_pyproject()["tool"]["uv"] assert tool_uv["python-preference"] == "only-managed" + + +def test_ci_ovrtx_installs_match_source_package_requirement(): + """CI must not bypass the OVRTX version range declared by the source package.""" + expected_requirement = _ovrtx_requirement_from_setup() + + for workflow_path in ( + ".github/workflows/build.yaml", + ".github/workflows/daily-compatibility.yml", + ): + workflow = (_repo_root() / workflow_path).read_text(encoding="utf-8") + ovrtx_install_lines = [ + line.strip() for line in workflow.splitlines() if "extra-pip-packages:" in line and "ovrtx" in line + ] + assert ovrtx_install_lines + assert all(expected_requirement in line for line in ovrtx_install_lines) diff --git a/source/isaaclab/test/sim/test_spawn_from_files.py b/source/isaaclab/test/sim/test_spawn_from_files.py index 009949de4c9c..b66888146a30 100644 --- a/source/isaaclab/test/sim/test_spawn_from_files.py +++ b/source/isaaclab/test/sim/test_spawn_from_files.py @@ -44,7 +44,7 @@ def sim(): def test_spawn_usd(sim): """Test loading prim from Usd file.""" # Spawn cone - cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd") + cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd") prim = cfg.func("/World/Franka", cfg) # Check validity assert prim.IsValid() diff --git a/source/isaaclab/test/sim/test_utils_prims.py b/source/isaaclab/test/sim/test_utils_prims.py index 0d11afe22f45..12c958b332b7 100644 --- a/source/isaaclab/test/sim/test_utils_prims.py +++ b/source/isaaclab/test/sim/test_utils_prims.py @@ -84,7 +84,7 @@ def test_create_prim(): assert prim.GetAttribute("size").Get() == 100 # check adding USD reference - franka_usd = f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + franka_usd = f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" prim = sim_utils.create_prim("/World/Test/USDReference", usd_path=franka_usd, stage=stage) # check USD reference set assert prim.IsValid() @@ -328,7 +328,7 @@ def test_delete_prim(): # check for usd reference prim = sim_utils.create_prim( "/World/Test/USDReference", - usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", stage=stage, ) # delete prim @@ -362,7 +362,7 @@ def test_get_usd_references(): assert len(refs) == 0 # Create a prim with a USD reference - franka_usd = f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + franka_usd = f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" sim_utils.create_prim("/World/WithReference", usd_path=franka_usd, stage=stage) # Check that it has the expected reference (remote URLs are resolved to local paths) refs = sim_utils.get_usd_references("/World/WithReference", stage=stage) diff --git a/source/isaaclab/test/sim/test_utils_queries.py b/source/isaaclab/test/sim/test_utils_queries.py index 4f5a0758342c..8f1f30e89c36 100644 --- a/source/isaaclab/test/sim/test_utils_queries.py +++ b/source/isaaclab/test/sim/test_utils_queries.py @@ -98,7 +98,9 @@ def test_get_all_matching_child_prims(): # note: isaac sim function does not support instanced prims so we add it here # after the above test for the above test to still pass. sim_utils.create_prim( - "/World/Franka", "Xform", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + "/World/Franka", + "Xform", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", ) # test with predicate @@ -123,13 +125,19 @@ def test_get_first_matching_child_prim(): # create scene sim_utils.create_prim("/World/Floor") sim_utils.create_prim( - "/World/env_1/Franka", "Xform", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + "/World/env_1/Franka", + "Xform", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", ) sim_utils.create_prim( - "/World/env_2/Franka", "Xform", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + "/World/env_2/Franka", + "Xform", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", ) sim_utils.create_prim( - "/World/env_0/Franka", "Xform", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + "/World/env_0/Franka", + "Xform", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", ) # test @@ -152,7 +160,9 @@ def test_find_global_fixed_joint_prim(): # create scene sim_utils.create_prim("/World") sim_utils.create_prim("/World/ANYmal", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/ANYbotics/ANYmal-C/anymal_c.usd") - sim_utils.create_prim("/World/Franka", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd") + sim_utils.create_prim( + "/World/Franka", usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" + ) if "4.5" in ISAAC_NUCLEUS_DIR: franka_usd = f"{ISAAC_NUCLEUS_DIR}/Robots/Franka/franka.usd" else: diff --git a/source/isaaclab/test/utils/test_assets.py b/source/isaaclab/test/utils/test_assets.py index ab13a9a7c772..918f48e93191 100644 --- a/source/isaaclab/test/utils/test_assets.py +++ b/source/isaaclab/test/utils/test_assets.py @@ -18,7 +18,7 @@ def test_nucleus_connection(): def test_check_file_path_nucleus(): """Test checking a file path on the Nucleus server.""" # robot file path - usd_path = f"{assets_utils.ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd" + usd_path = f"{assets_utils.ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd" # check file path assert assets_utils.check_file_path(usd_path) == 2 diff --git a/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst b/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst new file mode 100644 index 000000000000..56842ac1ea3c --- /dev/null +++ b/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed :obj:`~isaaclab_assets.FRANKA_PANDA_CFG` to use the available legacy Franka Panda USD asset. diff --git a/source/isaaclab_assets/isaaclab_assets/robots/franka.py b/source/isaaclab_assets/isaaclab_assets/robots/franka.py index f03d21760f90..bae058073561 100644 --- a/source/isaaclab_assets/isaaclab_assets/robots/franka.py +++ b/source/isaaclab_assets/isaaclab_assets/robots/franka.py @@ -25,7 +25,7 @@ FRANKA_PANDA_CFG = ArticulationCfg( spawn=sim_utils.UsdFileCfg( - usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", activate_contact_sensors=False, rigid_props=sim_utils.RigidBodyPropertiesCfg( disable_gravity=False, diff --git a/source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip b/source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env_cfg.py index 107d9443695e..18acb1854e0a 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/franka_cabinet/franka_cabinet_env_cfg.py @@ -47,7 +47,7 @@ class FrankaCabinetEnvCfg(DirectRLEnvCfg): robot = ArticulationCfg( prim_path="/World/envs/env_.*/Robot", spawn=sim_utils.UsdFileCfg( - usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/panda_instanceable.usd", + usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/Legacy/panda_instanceable.usd", activate_contact_sensors=False, rigid_props=sim_utils.RigidBodyPropertiesCfg( disable_gravity=False, From 640cfe75f2dc219e62db0d0d607ef3eff9159980 Mon Sep 17 00:00:00 2001 From: peterd-NV Date: Thu, 23 Jul 2026 20:33:23 -0700 Subject: [PATCH 30/32] Add Isaac Lab Arena interop for imitation learning scripts (#6650) (#6690) Cherry-pick of [f67ae28ad66f2401d5651637a5523308d1192c9f](https://github.com/isaac-sim/IsaacLab/commit/f67ae28ad66f2401d5651637a5523308d1192c9f) from Isaac Lab develop branch to release/3.0.0-beta2 to enable Isaac Lab Arena interop. # Description Isaac Lab Arena currently keeps it's own copy of Isaac Lab imitation learning scripts (record_demos.py, generate_dataset.py, etc.). This PR updates the imitation learning scripts in Isaac Lab to enable direct interop with Arena environments, allowing Arena to remove it's own copy of the scripts and directly invoke the Isaac Lab ones. Changes are: 1. Add CLI arg to toggle sim buffer reset in recording script 2. Add configurable recorder cfg to recording script 3. Add configurable recorder cfg to data generation script All additions are optional parameters and default to old behaviour so existing Isaac Lab workflows are not impacted. ## Type of change - New feature (non-breaking change which adds functionality) ## Screenshots Please attach before and after screenshots of the change if applicable. ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there Signed-off-by: Peter Du Co-authored-by: Kelly Guo --- scripts/tools/record_demos.py | 29 ++++++++++++++++--- .../changelog.d/peterd-arena-il-interop.rst | 4 +++ .../changelog.d/peterd-arena-il-interop.rst | 4 +++ .../isaaclab_mimic/datagen/generation.py | 7 ++--- 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 source/isaaclab/changelog.d/peterd-arena-il-interop.rst create mode 100644 source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst diff --git a/scripts/tools/record_demos.py b/scripts/tools/record_demos.py index dbfdec95c305..c15330b52c37 100644 --- a/scripts/tools/record_demos.py +++ b/scripts/tools/record_demos.py @@ -65,6 +65,15 @@ default=10, help="Number of continuous steps with task success for concluding a demo as successful. Default is 10.", ) +parser.add_argument( + "--reset_sim_buffer_each_episode", + action=argparse.BooleanOptionalAction, + default=True, + help=( + "Call env.sim.reset() before the initial episode and between recording attempts." + " Use --no-reset_sim_buffer_each_episode to preserve simulation buffers." + ), +) parser.add_argument( "--cloudxr_env", type=str, @@ -146,7 +155,7 @@ from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions import isaaclab_tasks # noqa: F401 -from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from isaaclab_tasks.utils.parse_cfg import load_cfg_from_registry, parse_env_cfg logger = logging.getLogger(__name__) @@ -283,7 +292,11 @@ def create_environment_config( env_cfg.terminations.time_out = None env_cfg.observations.policy.concatenate_terms = False - env_cfg.recorders: ActionStateRecorderManagerCfg = ActionStateRecorderManagerCfg() + demo_recorder_cfg_entry_point = gym.spec(args_cli.task.split(":")[-1]).kwargs.get("demo_recorder_cfg_entry_point") + if demo_recorder_cfg_entry_point is None: + env_cfg.recorders = ActionStateRecorderManagerCfg() + else: + env_cfg.recorders = load_cfg_from_registry(args_cli.task, "demo_recorder_cfg_entry_point") env_cfg.recorders.dataset_export_dir_path = output_dir env_cfg.recorders.dataset_filename = output_file_name env_cfg.recorders.dataset_export_mode = DatasetExportMode.EXPORT_SUCCEEDED_ONLY @@ -472,7 +485,8 @@ def handle_reset( Reset success step count (0). """ print("Resetting environment...") - env.sim.reset() + if args_cli.reset_sim_buffer_each_episode: + env.sim.reset() env.recorder_manager.reset() env.reset() if teleop_interface is not None and hasattr(teleop_interface, "reset"): @@ -514,6 +528,12 @@ def run_simulation_loop( # Callback closures for the teleop device def reset_recording_instance(): nonlocal should_reset_recording_instance + if success_step_count > 0: + print( + "Manual reset ignored. Success has fired and post-success steps are still recording. Please wait for" + " the automatic reset." + ) + return should_reset_recording_instance = True print("Recording instance reset requested") @@ -548,7 +568,8 @@ def inner_loop(): nonlocal running_recording_instance, label_text # Reset before starting - env.sim.reset() + if args_cli.reset_sim_buffer_each_episode: + env.sim.reset() env.reset() teleop_interface.reset() diff --git a/source/isaaclab/changelog.d/peterd-arena-il-interop.rst b/source/isaaclab/changelog.d/peterd-arena-il-interop.rst new file mode 100644 index 000000000000..74394e4e9b87 --- /dev/null +++ b/source/isaaclab/changelog.d/peterd-arena-il-interop.rst @@ -0,0 +1,4 @@ +Added +^^^^^ + +* Added support for an optional ``demo_recorder_cfg_entry_point`` Gym registry entry in demonstration collection. diff --git a/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst b/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst new file mode 100644 index 000000000000..960ade8801eb --- /dev/null +++ b/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst @@ -0,0 +1,4 @@ +Added +^^^^^ + +* Added support for environment-provided demonstration recorder configurations during Mimic generation. diff --git a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py index 72dc9c8d4c13..5001726e50c3 100644 --- a/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py +++ b/source/isaaclab_mimic/isaaclab_mimic/datagen/generation.py @@ -167,7 +167,7 @@ def setup_env_config( num_envs: Number of environments to run device: Device to run on generation_num_trials: Optional override for number of trials - recorder_cfg: Recorder manager configuration + recorder_cfg: Recorder manager configuration. Overrides recorder configurations supplied by the environment. dataset_compression: Whether to enable dataset compression Returns: @@ -201,9 +201,8 @@ def setup_env_config( # Setup recorders if recorder_cfg is None: - env_cfg.recorders = ActionStateRecorderManagerCfg() - else: - env_cfg.recorders = recorder_cfg + recorder_cfg = env_cfg.mimic_recorder_config + env_cfg.recorders = recorder_cfg if recorder_cfg is not None else ActionStateRecorderManagerCfg() env_cfg.recorders.dataset_export_dir_path = output_dir env_cfg.recorders.dataset_filename = output_file_name From e0d9f94116a8b0357ed1ddd3c52df6cf8b36fe51 Mon Sep 17 00:00:00 2001 From: "isaaclab-bot[bot]" <282401363+isaaclab-bot[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2026 06:01:15 +0000 Subject: [PATCH 31/32] [CI][Auto Version Bump] Compile changelog fragments (schedule) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumped packages: - isaaclab: 6.1.16 → 6.1.17 - isaaclab_assets: 0.3.4 → 0.3.5 - isaaclab_mimic: 1.3.3 → 1.3.4 --- .../changelog.d/fix-franka-legacy-path-beta2.rst | 4 ---- .../changelog.d/peterd-arena-il-interop.rst | 4 ---- source/isaaclab/config/extension.toml | 2 +- source/isaaclab/docs/CHANGELOG.rst | 14 ++++++++++++++ .../changelog.d/fix-franka-legacy-path-beta2.rst | 4 ---- source/isaaclab_assets/config/extension.toml | 2 +- source/isaaclab_assets/docs/CHANGELOG.rst | 9 +++++++++ .../changelog.d/peterd-arena-il-interop.rst | 4 ---- source/isaaclab_mimic/config/extension.toml | 2 +- source/isaaclab_mimic/docs/CHANGELOG.rst | 9 +++++++++ .../changelog.d/fix-franka-legacy-path-beta2.skip | 0 11 files changed, 35 insertions(+), 19 deletions(-) delete mode 100644 source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst delete mode 100644 source/isaaclab/changelog.d/peterd-arena-il-interop.rst delete mode 100644 source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst delete mode 100644 source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst delete mode 100644 source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip diff --git a/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst b/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst deleted file mode 100644 index d32aefcb2356..000000000000 --- a/source/isaaclab/changelog.d/fix-franka-legacy-path-beta2.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Fixed simulator tests and examples to use the available legacy Franka Panda USD asset. diff --git a/source/isaaclab/changelog.d/peterd-arena-il-interop.rst b/source/isaaclab/changelog.d/peterd-arena-il-interop.rst deleted file mode 100644 index 74394e4e9b87..000000000000 --- a/source/isaaclab/changelog.d/peterd-arena-il-interop.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added -^^^^^ - -* Added support for an optional ``demo_recorder_cfg_entry_point`` Gym registry entry in demonstration collection. diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index c674610d294a..f21e69af563f 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "6.1.16" +version = "6.1.17" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 17b2d9b1bab9..c0f341247e6d 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,20 @@ Changelog --------- +6.1.17 (2026-07-24) +~~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added support for an optional ``demo_recorder_cfg_entry_point`` Gym registry entry in demonstration collection. + +Fixed +^^^^^ + +* Fixed simulator tests and examples to use the available legacy Franka Panda USD asset. + + 6.1.16 (2026-07-14) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst b/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst deleted file mode 100644 index 56842ac1ea3c..000000000000 --- a/source/isaaclab_assets/changelog.d/fix-franka-legacy-path-beta2.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fixed -^^^^^ - -* Fixed :obj:`~isaaclab_assets.FRANKA_PANDA_CFG` to use the available legacy Franka Panda USD asset. diff --git a/source/isaaclab_assets/config/extension.toml b/source/isaaclab_assets/config/extension.toml index 055e3a5ff2f2..a178825d1965 100644 --- a/source/isaaclab_assets/config/extension.toml +++ b/source/isaaclab_assets/config/extension.toml @@ -1,6 +1,6 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "0.3.4" +version = "0.3.5" # Description title = "Isaac Lab Assets" diff --git a/source/isaaclab_assets/docs/CHANGELOG.rst b/source/isaaclab_assets/docs/CHANGELOG.rst index e9eda5822210..54abedf3749a 100644 --- a/source/isaaclab_assets/docs/CHANGELOG.rst +++ b/source/isaaclab_assets/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +0.3.5 (2026-07-24) +~~~~~~~~~~~~~~~~~~ + +Fixed +^^^^^ + +* Fixed :obj:`~isaaclab_assets.FRANKA_PANDA_CFG` to use the available legacy Franka Panda USD asset. + + 0.3.4 (2026-05-12) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst b/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst deleted file mode 100644 index 960ade8801eb..000000000000 --- a/source/isaaclab_mimic/changelog.d/peterd-arena-il-interop.rst +++ /dev/null @@ -1,4 +0,0 @@ -Added -^^^^^ - -* Added support for environment-provided demonstration recorder configurations during Mimic generation. diff --git a/source/isaaclab_mimic/config/extension.toml b/source/isaaclab_mimic/config/extension.toml index c86a69fcefc4..3e04557ca396 100644 --- a/source/isaaclab_mimic/config/extension.toml +++ b/source/isaaclab_mimic/config/extension.toml @@ -1,7 +1,7 @@ [package] # Semantic Versioning is used: https://semver.org/ -version = "1.3.3" +version = "1.3.4" # Description category = "isaaclab" diff --git a/source/isaaclab_mimic/docs/CHANGELOG.rst b/source/isaaclab_mimic/docs/CHANGELOG.rst index 55d7453dd923..8e31ff9d2752 100644 --- a/source/isaaclab_mimic/docs/CHANGELOG.rst +++ b/source/isaaclab_mimic/docs/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog --------- +1.3.4 (2026-07-24) +~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added support for environment-provided demonstration recorder configurations during Mimic generation. + + 1.3.3 (2026-06-26) ~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip b/source/isaaclab_tasks/changelog.d/fix-franka-legacy-path-beta2.skip deleted file mode 100644 index e69de29bb2d1..000000000000 From 88d39772f095ae6f4b87f7543d7ec75b84e4347f Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Fri, 24 Jul 2026 23:15:16 -0700 Subject: [PATCH 32/32] Prepare stable release as default branch (#6678) # Description Prepare `release/3.0.0-beta2` to serve temporarily as the repository default and stable landing branch while keeping the released code frozen. This change: - restores default-branch-owned schedules on the release branch without using release code as an active development source; - keeps scheduled link checking on `main` and disables the obsolete daily compatibility workflow; - keeps scheduled and manually dispatched documentation assembly on `develop`, while making the published site root follow the repository default branch (`release/3.0.0-beta2` after cutover); - keeps scheduled changelog compilation and image publishing on `develop` only, while manual release-image dispatches load the selected release branch's compatible image configuration; - identifies this branch as the stable Isaac Lab 3.0.0 Beta 2 landing page and points reproducible users to `v3.0.0-beta2.patch1`; and - directs all ongoing contributions to `develop`. Push-triggered workflows that explicitly target `main` remain unchanged. ## Type of change - Documentation update - CI/CD maintenance ## Testing - `.\isaaclab.bat -f` - Parsed all GitHub Actions YAML with PyYAML. - Verified the daily compatibility workflow is absent from the release landing branch. - Verified scheduled branch-routing invariants for link checks, docs, changelog compilation, and image publishing. - Verified multi-version docs always check out `develop`, including manual dispatches from the release landing branch, while the site root still follows the repository default branch. - Verified branch-specific image configuration resolves `develop` to `nvcr.io/nvidian/isaac-sim:latest-develop` and `release/3.0.0-beta2` to `nvcr.io/nvidia/isaac-sim:6.0.1`. - Ran the Windows `make.bat multi-docs` path with a fake Sphinx builder and verified both the release redirect and the `main` fallback contain no placeholder. - Ported the branch-layout staging and commit-message handling from upstream `main` commit `b0542fe2d45`, while retaining develop-only scheduled changelog routing. - Changelog tests: 89 passed; one existing Windows path-separator assertion failed in `test_display_path_strips_repo_root_for_internal_paths` (`tools\changelog\cli.py` versus `tools/changelog/cli.py`). - `Build Latest Docs` passed on the previous PR revision in Linux CI; the current revision is rebuilding. - A local Windows `.\isaaclab.bat -d` render remains blocked by the existing `sphinxcontrib.icon` absolute CSS path error (`OSError: [Errno 22] Invalid argument`). ## Repository settings after merge - Protect `release/3.0.0-beta2` with the same required reviews and strict status checks as `main` (`pre-commit` and `Build Latest Docs`). - Allow `release/3.0.0-beta2` to deploy to the `github-pages` environment. - Change the repository default branch to `release/3.0.0-beta2`. - Manually dispatch the docs workflow and verify the site root redirects to the release branch docs. - Verify the scheduled docs, image, link-check, and changelog workflows appear under the new default. --- .github/PULL_REQUEST_TEMPLATE.md | 5 + .github/workflows/README.md | 11 +- .github/workflows/check-links.yml | 3 + .github/workflows/daily-compatibility.yml | 282 ---------------------- .github/workflows/docs.yaml | 67 +++-- .github/workflows/nightly-changelog.yml | 79 +++--- .github/workflows/publish-images.yaml | 174 ++++++++----- README.md | 16 +- docs/Makefile | 5 +- docs/_redirect/index.html | 2 +- docs/make.bat | 16 +- 11 files changed, 237 insertions(+), 423 deletions(-) delete mode 100644 .github/workflows/daily-compatibility.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c19d35fb7e79..5d2ae1743b2e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,10 @@ # Description +> [!IMPORTANT] +> Confirm the pull request base before submitting. Target `develop` for all +> contributions. The `release/3.0.0-beta2` branch is a frozen stable landing +> snapshot and is not used for ongoing maintenance. +