Cherry-picks fixes for docs, ovphysx, ARM installation, stale sensor, locomanip quaternion, deformable demo, IK, benchmark scripts#5816
Conversation
…isaac-sim#5754) # Description `scripts/imitation_learning/locomanipulation_sdg/gr00t/convert_dataset.py` still passed `scalar_first=True` to `Rotation.from_quat` / `as_quat`, but since isaac-sim#4437 (Jan 2026) Isaac Lab returns body poses in XYZW. The script therefore mis-interpreted recorded poses as WXYZ, corrupting every relative-pose computation (hands, object, fixture, goal) in the GR00T training data and causing trained policies to produce twisted-arm rollouts. <!-- As a practice, it is recommended to open an issue to have discussions on the proposed pull request. This makes it easier for the community to keep track of what is being developed or added, and if a given feature is demanded by more than one party. --> ## Type of change <!-- As you go through the list, delete the ones that are not applicable. --> - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## 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 <!-- As you go through the checklist above, you can mark something as done by putting an x character in it For example, - [x] I have done this task - [ ] I have not done this task --> Co-authored-by: Kelly Guo <kellyg@nvidia.com>
… tst layout to prepare for more systematic coverage (isaac-sim#5779) - Fixes pytetwild compilation error on ARM64. - Normalizes the install CI test suite so future coverage is easier to add. - Bug fix - New feature (non-breaking change which adds functionality) - [ ] 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 - [x] I have added tests that prove my fix is effective or that my feature works - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
# Description `ContactSensor` (and other lazy-eval sensors — `IMU`, `PVA`, `JointWrenchSensor`) surfaced **pre-reset** values when `scene.reset(env_ids)` ran inside `ManagerBasedRLEnv._reset_idx`. The reset call zeroed each sensor's `_data` buffers correctly, but the shared `reset_envs_kernel` then marked the env as outdated — so the next `sensor.data` access (during `observation_manager.compute()`) triggered a lazy refetch from a physics buffer that had not been stepped since the reset, overwriting the zeros with stale data (contact forces, joint wrenches, velocities → spurious finite-diff accelerations). The fix clears the outdated flag in `reset_envs_kernel` instead of setting it. The next `InteractiveScene.update(dt)` re-arms the flag at the sensor's configured update period, so: - The first `data` read after `scene.reset(env_ids)` returns the freshly-zeroed buffers. - The next step's read pulls fresh post-reset physics data as before. This is a single-point fix in the shared sensor layer — it covers **both Newton and PhysX backends** for every sensor that follows the "reset() zeros _data + data is lazy" pattern. Fixes isaac-sim#4970 ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots N/A — behavior change is observable in the sensor data values, covered by the regression tests below. ## 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 added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there ## Tests added Per-backend, per-sensor regression tests that mirror the manager-based env path (write new asset state, then `scene.reset(env_ids)`, then read `sensor.data`). Each was verified RED with the kernel change temporarily reverted and GREEN with it restored: | Backend | Sensor | Test | |---|---|---| | PhysX | ContactSensor | `test_contact_sensor.py::test_contact_sensor_no_stale_data_after_reset` (cuda + cpu) | | PhysX | JointWrenchSensor | `test_joint_wrench_sensor.py::test_no_stale_data_after_scene_reset` | | PhysX | PVA | `test_pva.py::test_no_stale_data_after_scene_reset` | | PhysX | IMU | `test_imu.py::test_no_stale_data_after_scene_reset` | | Newton | ContactSensor | `test_contact_sensor.py::test_no_stale_data_after_scene_reset` (cuda + cpu) | | Newton | JointWrenchSensor | `test_joint_wrench_sensor.py::test_no_stale_data_after_scene_reset` | | Newton | PVA | `test_pva.py::test_no_stale_data_after_scene_reset` | | Newton | IMU | `test_imu.py::test_no_stale_data_after_scene_reset` | Existing `ContactSensor` (PhysX, 20 tests) and `IMU` (PhysX, 8 tests) suites continue to pass. > [!note] > The Newton IMU's native `SensorIMU` (`accelerometer` / `gyroscope`) does not carry data between physics steps the way PhysX's `get_velocities()` does, so its test passes both before and after the fix. The test stays in as a guard against future regressions in Newton IMU's design. ## Notes for reviewers - Behavior change is intentional: sensors that override `reset()` to zero their `_data` (contact, IMU, PVA, joint wrench, both backends) now keep those zeros until the next physics step. Sensors that don't zero data (e.g. ray-caster, frame transformer) still see refetches at the next update-period boundary, which preserves current behavior for them. - No public API change. No deprecation needed.
# Description Fixes `--viz none` / `--visualizer None` handling so the CLI parser maps the disable-all sentinel to internal `None` instead of preserving `"none"` as a requested visualizer backend. This keeps the documented behavior where `--viz none` disables config-defined visualizers without later failing visualizer backend resolution. The PR also restores the prior documentation that describes `--viz none` as intentional behavior. Fixes: N/A ## Type of change - Bug fix (non-breaking change which fixes an issue) - Documentation update ## Screenshots N/A ## 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 added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there ## Test Plan - `./isaaclab.sh -f` - `PYTHONPATH=/home/antoiner/Documents/IsaacLab_Newton/.worktrees/fix-viz-none/source/isaaclab_tasks:$PYTHONPATH ./isaaclab.sh -p -m pytest source/isaaclab/test/app/test_argparser_launch.py source/isaaclab/test/app/test_kwarg_launch.py source/isaaclab_tasks/test/test_sim_launcher_visualizer_intent.py`
# Description Fixes the Kit-backed Python logging path so Isaac Lab `INFO` records remain visible after `SimulationApp` installs Kit's logging bridge. This restores the PhysX joint wrench sensor initialization log for `Isaac-Ant-v0` with `presets=physx` while keeping the sensor implementations on standard Python logging. Fixes the reported joint wrench sensor logging issue. ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots N/A ## Test Plan - `./isaaclab.sh -f` - `git diff --check` - `timeout 120s ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Ant-v0 --num_envs 1 --viz newton presets=physx` - Verified output includes `[INFO]: Joint wrench sensor initialized: 1 envs, 9 bodies` - `./isaaclab.sh -p -m pytest source/isaaclab_physx/test/sensors/test_joint_wrench_sensor.py::test_initialization_and_shapes` ## 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 (not applicable; no documentation page change required) - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works (not added per request; verified with existing test and repro command) - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
# Description Clarifies the Multi-Backend Architecture documentation so the factory overview renders distinct backend implementation names instead of repeated `Articulation` links. The page now mentions OvPhysX alongside PhysX and Newton where the backend is supported, and the Cartpole examples use root-runnable `./isaaclab.sh train --rl_library rsl_rl ...` commands. No new dependencies are required. No linked issue. ## Type of change - Documentation update ## Screenshots Not applicable. This is an RST documentation text 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 - [ ] My changes generate no new warnings (not verified with a full docs build) - [ ] I have added tests that prove my fix is effective or that my feature works (not added; docs-only change) - [ ] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (not added; top-level docs-only change) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there ## Validation - `./isaaclab.sh -f` - `./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct-v0 --help` - `./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct-v0 --help physics=newton_mjwarp` - `./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct-v0 --help physics=ovphysx` - `./isaaclab.sh -p -c "from isaaclab_ovphysx.physics import OvPhysxManager, OvPhysxCfg; from isaaclab_ovphysx.assets import Articulation, RigidObject; from isaaclab_ovphysx.sensors import ContactSensor; from isaaclab_ovphysx.cloner import ovphysx_replicate"`
# Description Clarifies the PhysX backend documentation around timestep/frequency wording, stabilization guidance, and the Isaac Lab 3.0 `PhysxCfg` import path. This PR also updates the example configuration to keep `enable_stabilization=False` at `dt=1 / 120`, softens the contact-sensor caveat wording, and clarifies the Isaac Sim version note for `solve_articulation_contact_last`. No new dependencies are required. Fixes # (issue) No linked issue. ## Type of change - Documentation update ## Screenshots Not 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` - [x] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings (not run: full Sphinx docs build) - [ ] I have added tests that prove my fix is effective or that my feature works (not applicable: docs-only wording change) - [ ] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (not applicable: docs-only change under top-level docs) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
# Description Refreshes the OvPhysX physical backend documentation so it no longer presents merged work as open and gives users a minimal path to install and verify the backend. - Updates the OvPhysX status list for merged asset, sensor, SceneDataProvider, and FrameView work. - Adds minimal source-install notes for `ov[ovphysx]` / `ov[all]` and smoke-test commands. - Aligns the physical backend feature matrix with current OvPhysX coverage while keeping remaining work marked as in flight. Addresses isaac-sim#5634 ## Type of change - Documentation update ## Screenshots Not applicable; this is a documentation text 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 from the RST/pre-commit checks - [x] Documentation-only change; no new tests were added - [x] No changelog fragment is needed because this only touches top-level docs, not a package under `source/<pkg>` - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there ## Test Plan - `./isaaclab.sh -f` - `./isaaclab.sh -p -c "import ovphysx.types; from isaaclab_ovphysx.physics import OvPhysxCfg; print('OvPhysX runtime OK')"` - `./isaaclab.sh -p -m pytest source/isaaclab_ovphysx/test/assets/test_rigid_object.py::test_initialization -k cpu` Full Sphinx build was not run locally because the Isaac Sim Python environment in this checkout does not have the `sphinx` module installed.
Fixes NVBug 5984996. - Documentation update - [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 - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` since CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there
Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Greptile SummaryThis cherry-pick bundles 11 bug-fix PRs from
Confidence Score: 4/5The changes are well-scoped fixes; the stale-sensor timestamp guards are applied consistently across all sensor types and both backends, and the visualizer/logging paths are backed by updated tests. The core stale-sensor fix is straightforward and symmetric across eight kernels. The visualizer and logging changes involve somewhat intricate flag-threading logic, and the WARNING-mode root logger is overridden back to INFO immediately after being set — which is intentional but worth a second look. No data-loss or correctness regression was found. source/isaaclab/isaaclab/app/app_launcher.py — the two-step root-logger level adjustment (WARNING then INFO) in the post-Kit startup path is subtle and worth verifying against real Kit startup behavior. Important Files Changed
Sequence DiagramsequenceDiagram
participant Env as RL Environment
participant Sensor as SensorBase (reset)
participant Kernel as Warp Kernel
Env->>Sensor: reset(env_ids)
Sensor->>Sensor: _resolve_indices_and_mask(env_ids)
Sensor->>Kernel: reset_envs_kernel(env_mask, _timestamp → 0.0)
Note over Kernel: timestamp[env] = 0.0 for reset envs
Env->>Sensor: update(dt) — first step after reset
Sensor->>Kernel: update_timestamp_kernel(dt)
Note over Kernel: timestamp[env] += dt → > 0.0
Env->>Sensor: _update_outdated_buffers()
Sensor->>Kernel: contact/imu/pva/wrench kernel(timestamp, ...)
alt "timestamp[env] == 0.0 (not yet stepped)"
Kernel-->>Sensor: return early — skip stale buffer
else "timestamp[env] > 0.0"
Kernel-->>Sensor: copy sensor data to output buffers
end
Reviews (1): Last reviewed commit: "Merge branch 'release/3.0.0-beta2' into ..." | Re-trigger Greptile |
| AppLauncher._apply_python_logging_level(self._python_logging_level) | ||
| if self._python_logging_level <= logging.INFO: | ||
| AppLauncher._ensure_isaaclab_info_stream_handler() | ||
| elif self._python_logging_level == logging.WARNING: | ||
| AppLauncher._ensure_isaaclab_info_stream_handler() | ||
| # Let Isaac Lab INFO records reach the scoped handler while the other root | ||
| # handlers remain at WARNING. | ||
| logging.getLogger().setLevel(logging.INFO) |
There was a problem hiding this comment.
Root logger ends up at INFO even in WARNING mode.
_apply_python_logging_level(WARNING) correctly sets the root logger to WARNING, but the very next call to logging.getLogger().setLevel(logging.INFO) overrides it back to INFO. Any handler added after this point that lacks its own level filter will receive INFO records from all loggers — not just isaaclab ones — defeating the WARNING intent. Consider documenting the two-step rationale inline so the intentional override is clear to future maintainers.
| AppLauncher._apply_python_logging_level(self._python_logging_level) | |
| if self._python_logging_level <= logging.INFO: | |
| AppLauncher._ensure_isaaclab_info_stream_handler() | |
| elif self._python_logging_level == logging.WARNING: | |
| AppLauncher._ensure_isaaclab_info_stream_handler() | |
| # Let Isaac Lab INFO records reach the scoped handler while the other root | |
| # handlers remain at WARNING. | |
| logging.getLogger().setLevel(logging.INFO) | |
| AppLauncher._apply_python_logging_level(self._python_logging_level) | |
| if self._python_logging_level <= logging.INFO: | |
| AppLauncher._ensure_isaaclab_info_stream_handler() | |
| elif self._python_logging_level == logging.WARNING: | |
| # _apply_python_logging_level just set all existing handlers to WARNING. | |
| # Raise the root to INFO so the scoped isaaclab_info_stream handler (added | |
| # next) can receive INFO records; all other handlers remain at WARNING and | |
| # will therefore suppress non-WARNING noise from third-party loggers. | |
| AppLauncher._ensure_isaaclab_info_stream_handler() | |
| logging.getLogger().setLevel(logging.INFO) |
| # resolve mask via the shared helper (uses self._reset_mask, persistent across calls). | ||
| env_mask = self._resolve_indices_and_mask(env_ids, env_mask) | ||
| # reset the timers and counters |
There was a problem hiding this comment.
Double resolution of
env_mask. _resolve_indices_and_mask(env_ids, env_mask) is called here, and then super().reset(None, env_mask) triggers a second call inside SensorBase.reset. The second call is a harmless no-op (it returns the already-resolved mask since env_mask is not None), but the shared _reset_mask buffer was already mutated in the first call if env_ids was non-None. Logic is correct; this is a minor efficiency/clarity note.
There was a problem hiding this comment.
🤖 Isaac Lab Review Bot
Summary
This cherry-pick PR brings 13 PRs from develop to release/3.0.0-beta2, primarily fixing a critical stale sensor data bug (#4970), ARM64 installation issues, a quaternion convention bug in locomanipulation data conversion, and --viz none CLI parsing. The changes are well-structured with comprehensive regression tests for each sensor fix.
Design Assessment
Design is sound. The stale sensor data fix uses an elegant approach: each sensor kernel now checks timestamp[env] == 0.0 to skip envs that haven't been stepped since reset, preventing lazy refetch from returning pre-reset physics buffer values. This single-point fix in the shared sensor layer covers all lazy-eval sensors (Contact, IMU, PVA, JointWrench) across both PhysX and Newton backends.
The ARM64 install improvements appropriately gate pytetwild to x86_64-only (since its sdist build fails on ARM) and auto-install build dependencies (swig, GL/X11 headers) when sudo is available.
Findings
🔵 Suggestion: _StaleResetSceneCfg duplicated across test files — source/isaaclab_physx/test/sensors/test_imu.py and source/isaaclab_physx/test/sensors/test_pva.py
The _StaleResetSceneCfg class is defined identically in both test files. Consider extracting to a shared test utilities module to reduce duplication and make future changes easier.
🔵 Suggestion: Consistent error message for missing sudo — source/isaaclab/isaaclab/cli/commands/install.py:86-89
The swig skip message says "Pre-install swig in your image if you need to build nlopt from source" while the GL/X11 skip message lists the packages. Consider making both messages consistent by listing the specific package(s) needed.
Test Coverage
Coverage is excellent. Each sensor fix includes comprehensive regression tests:
test_contact_sensor_no_stale_data_after_reset(PhysX cuda+cpu, Newton cuda+cpu)test_no_stale_data_after_scene_resetfor IMU, PVA, JointWrench (both backends)
All tests mirror the ManagerBasedRLEnv._reset_idx flow where reset runs inside a step without a subsequent physics step.
- Bug fix: Has regression tests ✓
- Test quality: Good — deterministic, isolated, properly verifies both pre-reset (non-zero) and post-reset (zero) states
CI Status
Several checks are still pending (Build Base Docker Image, Installation Tests). Pre-commit and changelog checks have passed.
Verdict
No issues found
This is a well-executed cherry-pick PR with solid fixes for critical bugs (stale sensor data, ARM64 installation, quaternion convention). Each fix is accompanied by appropriate regression tests. The code changes are minimal and targeted, reducing the risk of unintended side effects. The documentation updates accurately reflect the current state of OvPhysX support.
# Description Enable particle self-contact in the Newton VBD solver config used by the deformables demo, and tune the contact radius/margin so particles don't inter-penetrate. ## 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 - [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 --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description Fixes a spurious PhysX tensor warning when the Newton visualizer requests scene-data transforms for assets whose joint prims share names with rigid-body prims, such as Ant and Humanoid. The PhysX scene-data backend already discovers exact rigid-body prims from USD, so this change creates the rigid-body view from those exact paths instead of broad `/World/envs/env_*` wildcard patterns that can also match same-named joint prims. Fixes # (issue) ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Not 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` - [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 - [x] I have added a changelog fragment under `source/<pkg>/changelog.d/` for every touched package (do **not** edit `CHANGELOG.rst` or bump `extension.toml` — CI handles that) - [x] I have added my name to the `CONTRIBUTORS.md` or my name already exists there Manual verification: - `./isaaclab.sh -f` - `timeout 60s ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Ant-v0 --num_envs 128 --viz newton presets=physx` - `timeout 60s ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Humanoid-v0 --num_envs 128 --viz newton presets=physx` The Ant and Humanoid repro commands start without the previous `[omni.physx.tensors.plugin] Failed to find rigid body at .../Robot/joints/...` warnings.
isaac-sim#5784) ## 1. Summary - Benchmark scripts and standalone environment helpers failed with ``gymnasium.error.NameNotFound: Environment 'Isaac-Cartpole-Direct-Warp' doesn't exist`` when invoked with any ``-Warp-v0`` task. Docs at ``source/overview/core-concepts/physical-backends/newton/warp-environments.rst`` advertise the very command that fails. - Root cause: the affected scripts import ``isaaclab_tasks`` only; the ``-Warp-v0`` variants are registered in the optional ``isaaclab_tasks_experimental`` extension. The RL training/play scripts already conditionally import it; these did not. - Fix: add the same ``with contextlib.suppress(ImportError): import isaaclab_tasks_experimental`` block after the existing ``import isaaclab_tasks``. Seven scripts, 39 insertions total. ## 2. Scripts changed | File | Before | After | |---|---|---| | ``scripts/benchmarks/benchmark_rsl_rl.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/benchmarks/benchmark_non_rl.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/benchmarks/benchmark_rlgames.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/environments/list_envs.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/environments/random_agent.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/environments/zero_agent.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | | ``scripts/environments/export_IODescriptors.py`` | imports ``isaaclab_tasks`` only | + conditional ``isaaclab_tasks_experimental`` | All eight ``scripts/reinforcement_learning/{rl_games,rsl_rl,sb3,skrl}/{train,play}.py`` scripts already follow this pattern; the affected scripts are the remaining gap. ## 3. Verification - Pre-commit clean on all 8 changed files (ruff, ruff-format, codespell, RST hooks). - Pattern mirrors ``scripts/reinforcement_learning/rsl_rl/train.py:56-58``, which is the canonical placement. - ``contextlib.suppress(ImportError)`` keeps the scripts working when the experimental extension isn't installed (e.g. minimal IsaacLab installs). ## 4. Cherry-pick target The customer-visible bug is on ``release/3.0.0-beta2`` per the NVBug. After this lands on ``develop``, cherry-pick onto that release branch so QA can verify on the same build. Refs NVBug 6224916
…lic into cherry-pick-0527
Description
Cherry pick following PRs from develop: