Skip to content

refactor: fuse set_world_poses/set_scales into single _compose_fabric_transform#5

Draft
pv-nvidia wants to merge 171 commits into
developfrom
pv/fabric-fused-compose
Draft

refactor: fuse set_world_poses/set_scales into single _compose_fabric_transform#5
pv-nvidia wants to merge 171 commits into
developfrom
pv/fabric-fused-compose

Conversation

@pv-nvidia
Copy link
Copy Markdown
Owner

Problem

FabricFrameView had duplicated kernel-launch logic in set_world_poses and set_scales, and the initial USD→Fabric sync called both methods sequentially. This meant:

  1. Duplicated code — the same 20-line kernel launch pattern appeared twice with minor variations (positions/orientations vs scales).
  2. Double PrepareForReuse — the initial USD→Fabric sync in _sync_fabric_from_usd_once called set_world_poses then set_scales, each invoking PrepareForReuse. A second non-idempotent PrepareForReuse call could mask a topology-change signal that should have triggered a fabricarray rebuild.

Solution

Extract _compose_fabric_transform(positions=None, orientations=None, scales=None, indices=None) — a single method that composes any subset of transform components into one kernel launch. Components left as None are skipped via empty arrays.

  • set_world_poses → delegates to _compose_fabric_transform(positions=..., orientations=...)
  • set_scales → delegates to _compose_fabric_transform(scales=...)
  • _sync_fabric_from_usd_once → single fused call with all three components

Additional fix

The topology-change invariant guard in _rebuild_fabric_arrays used assert, which is stripped under python -O. Replaced with raise RuntimeError so it's always active.

Tests

All 36 existing Fabric tests pass (+ 2 xfail).

AntoineRichard and others added 30 commits April 22, 2026 17:43
# Description

Replaces the single-buffer WrenchComposer with a dual-buffer
architecture that stores global (world-frame) and local (body-frame)
forces separately.

Follows develop's warp-first paradigm: all internal buffers are warp
arrays, inputs accept both torch.Tensor and wp.array (warp ingests both
natively), outputs are wp.array.

Updates PhysX and Newton asset write_data_to_sim to use
add_raw_buffers_from
+ compose_to_body_frame instead of the old
composed_force/composed_torque merge pattern.

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- 
## 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: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: ClemensSchwarke <clemens.schwarke@gmail.com>
…c-sim#5268)

# Description

- Add message-channel-based start/stop/reset control from the XR
headset, replacing
the legacy carb message bus path with TeleopCore's native
`teleop_control_pipeline`.
- Introduce `ControlEvents` dataclass, `poll_control_events()` helper,
and
`MessageChannelTeleopStateManager` for consuming control commands over
the
  OpenXR opaque data channel (`XR_NV_opaque_data_channel`).
- Bridge pipeline-based control events to legacy `add_callback()`
callbacks so
  existing scripts work without migration.
- Fix `IsaacTeleopDevice.reset()` to propagate reset to retargeters via
`ExecutionEvents`, and fix `record_demos.py` to reset the teleop device
on
  success-triggered environment resets.
- Fix shutdown hang caused by Kit's pre-shutdown callback racing with
the
  simulation loop.


Fixes # (issue)

## 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)

## 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
# Description

For the rendering correctness test, we don't really need the
`env.reset()` call to fill the camera output buffers. Instead, if we
remove `env.reset()`, the camera output buffers will be filled on the
invocation of camera.data:
```python
    @Property
    def data(self) -> CameraData:
        # update sensors if needed
        self._update_outdated_buffers()
        # return the data
        return self._data
```

This means we can remove `env.reset()` calls in the rendering
correctness test to avoid non-deterministic initial pose. Articulation
bodies will be at their default pose for rendering for all combos. With
this removal I can set the max pixel diff threshold to smaller
(stricter) values:
```python
    "cartpole": 1.0,      # decreased from 2.0
    "shadow_hand": 3.0,   # decreased from 8.0
    "dexsuite_kuka": 4.0, # decreased from 10.0
```

The test will become more sensitive to capture rendering changes but
hopefully it can still tolerate minor pixel noise.

Fixes # (issue)

<!-- 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

- Test-only change


## 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
- [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
- [ ] 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
-->
…5360)

# Description

Adds a new column to the environments list with available presets
defined for all example environments.
Fixes recent doc build errors.

## 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

<!--
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 <kelly@nvidia.com>
…and shared contract tests (isaac-sim#5179)

# Description

### Summary

Rewrites the Newton `XformPrimView` from scratch with correct local-pose
semantics, a clean site-based architecture, and a shared test contract
that enforces the same invariants across all backends (USD, Fabric,
Newton).

**Key changes:**

- **Fix local poses**: `get_local_poses` / `set_local_poses` now
correctly compute parent-relative transforms on GPU (`inv(parent_world)
* prim_world`) instead of incorrectly returning world poses
- **Fix set_world_poses**: Updates `site_local` offset instead of
writing `body_q` directly (which would move the parent body)
- **Guard against misuse**: Raises `ValueError` if prim path resolves to
a physics body or collision shape — XformPrimView is for non-physics
child prims only (cameras, sensors, markers)
- **Warp-native API**: All inputs/outputs are `wp.array` — no torch/list
conversion overhead
- **Factory dispatch**: `from isaaclab.sim.views import XformPrimView`
now auto-selects the correct backend (USD, Fabric, Newton) via
`XformPrimViewFactory`
- **Composition over inheritance**: PhysX `FabricXformPrimView` uses
composition (`self._usd_view`) instead of inheriting from
`UsdXformPrimView`
- **Explicit class names**: `UsdXformPrimView`, `FabricXformPrimView`,
`NewtonSiteXformPrimView` — no more ambiguous `XformPrimView` in every
package
- **Shared contract tests**: 16 test functions in
`xform_contract_tests.py` that any backend imports and runs by providing
a `view_factory` fixture
- **Benchmark updates**: Both benchmark scripts support Newton, use
warp-native arrays, and include per-backend round-trip verification

### Type of change

- [x] Bug fix (Newton local poses were fundamentally broken — `local ==
world`)
- [x] New feature (shared contract test infrastructure, factory
dispatch)
- [x] Breaking change (Newton `XformPrimView` renamed to
`NewtonSiteXformPrimView`, PhysX to `FabricXformPrimView`; indices
parameter changed from `Sequence[int]` to `wp.array`)
- [x] Documentation update

### Expected failures

- `test_set_world_updates_local[cuda:0]` in Fabric — pre-existing
limitation: `set_world_poses` writes to `omni:fabric:worldMatrix` but
`get_local_poses` reads from USD, so local poses are stale after a
Fabric world write. This will be fixed by the Fabric backend PR (isaac-sim#4923)
which adds `omni:fabric:localMatrix` support.

### Test results

| Backend | Passed | Failed | Skipped |
|---|---|---|---|
| Newton | 40 | 0 | 0 |
| USD | 45 | 0 | 0 |
| Fabric | 15 | 1 (xfail) | 16 (CPU) |
| Camera | 20 | 0 | 0 |
| TiledCamera | 61 | 0 | 0 |
| RayCaster | 5 | 0 | 0 |

### Benchmark (1024 prims, 50 iterations, RTX 5090)

```
========================================================================================================================
BENCHMARK RESULTS: 1024 prims, 50 iterations
========================================================================================================================
Operation                         Isaaclab Usd (ms)   Isaaclab Fabric (ms) Isaaclab Newton Site (ms)
------------------------------------------------------------------------------------------------------------------------
Initialization                               3.7168                 3.6596                39.0608
Get World Poses                              6.6730                 0.0296                 0.0180
Set World Poses                             15.5574                 0.0640                 0.0186
Get Local Poses                              4.6086                 4.5637                 0.0216
Set Local Poses                              6.4680                 6.6221                 0.0218
Get Both (World+Local)                      12.1240                 4.7361                 0.0374
Interleaved World Set->Get                  23.4141                 0.1050                 0.0344
========================================================================================================================

Total                                       72.5619                19.7800                39.2126

========================================================================================================================
```

### 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
- [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

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Antoine Richard <antoiner@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…aac-sim#5202)

# Description

`Articulation.find_joints` and `find_bodies` delegate to
`resolve_matching_names`, which runs a Python regex double-loop on every
call. Nsight profiling of the pick-place task showed this costs ~881μs
per call (~1.83 ms / 1.5% of step time) for work that always returns the
same result — joint and body names are fixed after construction.

This PR adds a module-level `@functools.cache` on a new private
`_resolve_matching_names_impl` helper. Hashable tuples are used for the
cache key; cached results are immutable tuples that the public wrapper
copies into fresh lists per caller, so callers cannot mutate shared
state. `resolve_matching_names_values` is left uncached because its
current callers only use it during init, never in the step loop.

A `clear_resolve_matching_names_cache()` helper is called from
`SimulationContext.clear_instance()` so cached entries from destroyed
assets do not accumulate across scene rebuilds in long-lived processes.

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- 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. -->

- New feature (non-breaking change which adds functionality)

## 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

- [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

<!--
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: Antoine Richard <antoiner@nvidia.com>
# Description

The origin remote points to the public isaac-sim/IsaacLab repo. Agents
and contributors should push to their own fork remote or to the remote
of the PR they are working on instead.

## Type of change

- Documentation update

## 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
Expose a render: bool = True parameter on the step() method of all
environment base classes (ManagerBasedEnv, ManagerBasedRLEnv,
DirectRLEnv, DirectMARLEnv) and the MARL utility wrappers.

When render=False is passed, all rendering calls are skipped:
- GUI / RTX sensor renders inside the decimation loop
- Post-reset re-renders for RTX sensors

Physics simulation continues normally regardless of the flag. This
allows user workflows that do not need rendering every step (e.g.
headless RL training, fast rollouts) to opt out per-step.

Also adds unit tests for render=False and mixed render flag stepping.

# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- 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)
- 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.

<!--
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 <kelly@nvidia.com>
# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Improve Partial Visualization feature where a subset of envs are shown
in the launched visualizers to speed up performance, making use of new
updates to Newton.

Newton visualizers align on using the set_visible_worlds API to select
envs to show.

Kit visualizer just sets non selected envs invisible.

Updated docs and added tests.

<!-- 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. -->

- New feature (non-breaking change which adds functionality)
- Documentation update

## 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
-->

---------

Signed-off-by: matthewtrepte <mtrepte@nvidia.com>
# Description

- Skips
`source/isaaclab_tasks/test/benchmarking/test_environments_training.py`
until we resolve auto-cancel issue with pipeline where previous jobs
gets cancelled on newer commits.
- Marks `TheiaTiny` environment tests with xfail
- Skips `test_deformable_object.py` due to crash
- Reverts SDP change that removed USD fallback path for Newton model
creation
- Adds flaky test to `test_rendering_correctness.py‎` shadow hand test

## 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)

## 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

<!--
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
-->
# Description

This MR is a continuation of isaac-sim#5375 without `omni.ui` as a dependency,
only minimal dependencies are added and required code was pushed to the
render backend that requires it.

Fixes # (issue)

```
cudaErrorIllegalAddress
```

```
./isaaclab.sh -p -m  pytest source/isaaclab/test/sensors/test_multi_tiled_camera.py -v
```

## Type of change

- 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

- [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
- [ ] 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>
Co-authored-by: Piotr Barejko <piotrbarejko@protonmail.com>
It seems like our minimal mode has been broken. This PR fixes the
problem and regenerates the golden images.

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- 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)
- 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.

<!--
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
-->
)

# Description

Fixes two regressions introduced by recent Isaac Sim `develop` builds
(between 2026-04-13 and 2026-04-22) that broke the standard training
entry point:

```bash
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0
```

### 1. Isaac Sim `SimulationManager` invalidating the shared physics
view

A recent Isaac Sim commit (`8df6beeb0`, 6.0.0-alpha.180) decorated
`SimulationManager._on_stop` / `_on_play` / `_on_stage_*` with
`@staticmethod` so they finally fire from their Carb subscriptions. The
newly-working `_on_stop` calls `SimulationManager.invalidate_physics()`,
which invalidates the shared `omni.physics.tensors` simulation view that
`PhysxManager` and every articulation `_root_view` rely on, raising:

```
[Error] [omni.physx.tensors.plugin] Simulation view object is invalidated and cannot be used again to call getDofVelocities
Exception: Failed to get DOF velocities from backend
```

on the first `scene.update()` after `sim.reset()`.

- `source/isaaclab_physx/isaaclab_physx/__init__.py`:
`_patch_isaacsim_simulation_manager()` now (a) force-imports
`isaacsim.core.simulation_manager` so the patch always runs
deterministically, (b) calls
`original_class.enable_all_default_callbacks(False)` to tear down the
original class's Carb subscriptions, and (c) only then swaps the module
attribute. `PhysxManager` becomes the single owner of the simulation
view's lifecycle.

### 2. PhysX tensors API module relocation

Recent Isaac Sim builds removed `omni.physics.tensors.impl` and now
expose the PhysX Tensor API types directly under
`omni.physics.tensors.api`. The old import raises `ModuleNotFoundError`
at Isaac Lab import time, taking down every entry point that touches
articulations, rigid objects, deformables, contact sensors, or ray
caster sensors.

- Updated all imports of the form `import omni.physics.tensors.impl.api
as physx` → `import omni.physics.tensors.api as physx` across `isaaclab`
(ray-caster sensors) and `isaaclab_physx` (assets and contact sensor),
including `TYPE_CHECKING`-gated imports.
- Updated the `PhysX Tensor API` Sphinx cross-reference URLs in the
articulation data classes and the example console output in the contact
sensor / IMU docs.
- Added a migration note to
`docs/source/migration/migrating_to_isaaclab_3-0.rst`.

Fixes # (issue)

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Screenshots

N/A — runtime fixes with no UI surface.

## 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

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Signed-off-by: Kelly Guo <kellyguo123@hotmail.com>
Co-authored-by: Kelly Guo <kelly@nvidia.com>
# Description

The previous image on the deformable demo does not include USD assets
and surface meshes. This image now corresponds to the updated demo.

## Type of change

- Documentation update

## Screenshots

| Before | After |
| ------ | ----- |
| <img width="1920" height="1080" alt="deformables_before"
src="https://github.com/user-attachments/assets/314f9648-91fa-4273-8db6-042ac09855c8"
/> | <img width="1920" height="1080" alt="deformables_after"
src="https://github.com/user-attachments/assets/bb419796-eea1-4afd-ae57-0bf11269fd62"
/> |


## 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
# Description

Migrated golden images
``source/isaaclab_tasks/test/golden_images/**/*.png`` to Git LFS

Fixes # (issue)

<!-- 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

- Test-only change

## 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
Fixes the docker image publishing workflow; simplifies tagging on
published images; removes hardcoded Isaac Sim base image versions in
favor of `config.yaml`; removes silent failure on variable
non-existence.

```
New tagging scheme:
   - Every build:        $IMAGE:<full-sha>             (immutable, retained for re-testing)
   - Push to develop:    $IMAGE:latest-develop         (moves to newest develop build)
   - Push to release/X:  $IMAGE:latest-release-X       (moves to newest build on that release branch)
   - Push to main:       $IMAGE:latest                 (moves to newest main build)
                         $IMAGE:v<VERSION>             (from the VERSION file, e.g. v3.0.0)
```

## 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`
- [ ] 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…on (isaac-sim#4945)

## Summary

* Cherry-picks [Newton] Migrate more envs and mdps to warp
(isaac-sim#4690) onto develop
* Cherry-picks [Newton] Add capture safety guards and fix WrenchComposer
stale COM pose (isaac-sim#4779) onto
develop

### Changes included
- Warp-first MDP terms (observations, rewards, events, terminations,
actions) for manager-based envs
- Tested warp env configs: Ant, Humanoid, Cartpole, locomotion velocity
(A1, AnymalB/C/D, Cassie, G1, Go1/2, H1), Franka/UR10 reach
- ManagerCallSwitch max_mode cap and scene capture config
- MDP kernels made graph-capturable with consolidated test
infrastructure
- capture_unsafe safety guards on lazy-evaluated derived properties in
articulation/rigid_object data
- WrenchComposer fix: use fresh COM pose buffers instead of stale cached
link poses

### Dropped
- G1-29-DOF warp env (Isaac-Velocity-Flat-G1-Warp-v1): removed because
the stable g1_29_dofs task config does not exist on develop (only on
dev/newton). Warp env PRs should only add warp frontends for envs that
already exist in the stable package.

## Dependencies

Must be merged **after** these PRs (in order):
1. isaac-sim#4905 (merged)
2. isaac-sim#4829

## Validated base

Validated against develop at 7588fa9.

## Test plan

- [x] Run warp env training sweep across all manager-based env configs
(14/14 pass, mode=2, 4096 envs, 300 iters)
- [ ] Run test_mdp_warp_parity.py and test_mdp_warp_parity_new_terms.py
- [ ] Run test_action_warp_parity.py
- [ ] Verify WrenchComposer COM pose is fresh (not stale) during graph
replay

---------

Co-authored-by: Antoine Richard <antoiner@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
)

# Description

This PR updates workflows and documentation for Isaac Lab Mimic to
improve ease of use and code legibility.
The changes include:

1. Add option for full sim buffer reset in HDF5 replay script when using
single envs. Copy and move a large chunk of the main() function into a
separate helper function.
2. Mark optional methods in ManagerBasedRLMimicEnv
3. Refactor Franka IK Rel envs to inherit directly from Stack Env base.
Eliminate illogical inheritance from Franka direct joint pose env.
4. Change idle action in pick place envs from torch tensor to standard
python list so allow for env serialization
5. Refactor Isaac Lab Mimic documentation for better clarity and flow.
6. Let uv override numpy <2 dep requirements to avoid downgrading numpy
for SRL usd-to-urdf-converter

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- New feature (non-breaking change which adds functionality)
- Documentation update

## 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

- [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 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

<!--
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
-->
# Description

Migrates Isaac Lab off deprecated Isaac Sim API surfaces in preparation
for their removal in a future Isaac Sim release. This PR is
intentionally scoped to the API migration only — installation,
prebundle, and extension-exclusion fixes are tracked separately on
`kellyg/fix-installation`.

## What changes

**Kit experience (`apps/*.kit`):**
- Stopped registering deprecated Isaac Sim extension search paths
(`extsDeprecated`) in Isaac Lab Kit experiences (headless, rendering, XR
variants).
- Switched explicit Isaac Sim extension dependencies to their
non-deprecated equivalents:
  - `isaacsim.core.*` → `isaacsim.core.experimental.*`
- `isaacsim.robot.wheeled_robots` →
`isaacsim.robot.experimental.wheeled_robots` (+
`isaacsim.robot.wheeled_robots.nodes` for OmniGraph nodes)
  - `isaacsim.sensors.*` → `isaacsim.sensors.experimental.*`
- Removed unused Isaac Sim extensions that pulled in
`isaacsim.core.api`.
- Migrated `isaacsim.core.cloner` usage to the in-tree Lab cloner.

**Python source migrations (across `isaaclab`, `isaaclab_physx`,
`isaaclab_tasks`, `isaaclab_teleop`, `isaaclab_visualizers`,
`isaaclab_mimic`):**
- Migrated remaining imports off deprecated `isaacsim.core.utils.*` /
prim Python paths to `isaacsim.core.experimental.*` replacements
(controllers, env mdp events, sim utils/converters, terrain importer,
RMP flow, etc.).
- Updated Kit perspective capture helpers to use
`isaacsim.core.rendering_manager`.
- Updated optional-extension enablement (e.g. `enable_extension`) to use
`isaacsim.core.experimental.utils.app`.
- Updated XR anchor utilities to use `isaacsim.core.experimental.prims`
/ `isaacsim.core.experimental.utils`.
- Updated mobility-gen path utilities (`isaaclab_mimic`) to import from
`isaacsim.replicator.experimental.mobility_gen`.
- Migrated `kit_visualizer.py` from
`isaacsim.core.utils.viewports.set_camera_view` to
`omni.kit.viewport.utility.camera_state.ViewportCameraState`.

**`SimulationManager` decoupling:**
- Migrated the PhysX scene data provider, PhysX asset micro-benchmarks,
and cross-backend asset interface tests off
`isaacsim.core.simulation_manager.SimulationManager`. They now import
`isaaclab_physx.physics.PhysxManager` aliased as `SimulationManager`,
mirroring the Newton backend's `NewtonManager as SimulationManager`
convention. No new public alias is exported from
`isaaclab_physx.physics`.

**Test deps cleanup:**
- Retired several `source/isaaclab/test/deps/isaacsim` standalone
reproducers that depended on deprecated Isaac Sim core extensions
(`check_camera.py`, `check_floating_base_made_fixed.py`,
`check_legged_robot_clone.py`, `check_rep_texture_randomizer.py`,
`check_ref_count.py`). Use `isaaclab.sim` and
`isaacsim.core.experimental.*` for similar debugging workflows.

**Docs:**
- Updated tutorials, sensor docs, migration guide, release notes, and
verification snippets to reference the non-deprecated APIs.

## Motivation

Isaac Sim has marked `isaacsim.core.*`, `isaacsim.sensors.*`, and
`isaacsim.robot.wheeled_robots` modules as deprecated, with
`isaacsim.core.experimental.*` as the supported replacement. Without
this migration, Isaac Lab will break when those modules are removed and
currently emits deprecation warnings on every launch. Splitting the
migration off from the installation/prebundle work keeps each PR small
and reviewable.

Fixes # (issue)

## 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)** — only for users that imported deprecated Isaac Sim
symbols re-exported through Isaac Lab Kit experiences; user-facing Isaac
Lab Python APIs are unchanged.
- Documentation update

## Screenshots

N/A — no UI 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
  - `isaaclab` 4.6.10 → 4.6.11
  - `isaaclab_physx` 0.5.20 → 0.5.21
  - `isaaclab_tasks` 1.5.23 → 1.5.24
  - `isaaclab_teleop` 0.3.6 → 0.3.7
  - `isaaclab_mimic` 1.2.4 → 1.2.5
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Signed-off-by: Kelly Guo <kellyguo123@hotmail.com>
Co-authored-by: Kelly Guo <kelly@nvidia.com>
# Description

Refines the list of CI tests that also get triggered in Isaac Sim CI.

Ensures we are including tests covering rendering and physx that can be
impacted by Isaac Sim and OV side changes.

## 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)

## 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

<!--
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
-->
…eam dataclasses (isaac-sim#5365)

# Description

Adds `isaaclab.utils.checked_apply` for forwarding the declared fields
of one dataclass onto another, raising `AttributeError` if the target is
missing a declared field.

The use case is Isaac Lab configclasses that mirror an upstream
library's dataclass (for example, Newton's `ShapeConfig`). Bare
`setattr` loops are fragile: if upstream renames or removes a field,
every write becomes a silent no-op (the failure mode PR isaac-sim#5289 fixed for
`ShapeConfig.contact_margin` → `margin`). With `checked_apply`, the
failure surfaces at startup with a clear message instead of degrading
runtime behavior.

## API

```python
from isaaclab.utils import checked_apply

@configclass
class NewtonShapeCfg:
    margin: float = 0.0
    gap: float = 0.01

# at apply site (one line, no per-field setattr noise)
checked_apply(cfg.default_shape_cfg, builder.default_shape_cfg)
```

Internally:
1. Iterates `dataclasses.fields(src)` — single source of truth for
declared fields.
2. Raises `AttributeError` if `target` lacks a declared field.
3. Rejects non-dataclass `src` with `TypeError`.

## What's included

1. `source/isaaclab/isaaclab/utils/configclass.py` — `checked_apply`
function (lives next to `@configclass` since it operates on
dataclasses).
2. `source/isaaclab/isaaclab/utils/__init__.pyi` — export.
3. `source/isaaclab/test/utils/test_configclass.py` — three tests
(forwards all fields, raises on missing target field, rejects
non-dataclass src).
4. `source/isaaclab/docs/CHANGELOG.rst` — `4.6.13` entry.
5. `source/isaaclab/config/extension.toml` — version bump.

## Dependents

This PR is a dependency for the rough-terrain Newton stack:

1. PR isaac-sim#5248 — quadrupeds rough terrain, uses `checked_apply` to forward
`NewtonShapeCfg` onto Newton's upstream `ShapeConfig`. Without it,
`default_shape_cfg.margin` is left at Newton's upstream default of
`0.0`, breaking all non-Anymal-D robots on triangle-mesh terrain.
2. PR isaac-sim#5298 — bipeds (chains on isaac-sim#5248).
3. PR isaac-sim#5312 — G1 (chains on isaac-sim#5298).

## Type of change

- New feature (non-breaking).

## Checklist

- [x] Tests added (3 new in `test_configclass.py`)
- [x] Pre-commit checks pass
- [x] CHANGELOG + extension.toml bumped
- [x] No new dependencies

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
… on Newton (isaac-sim#5248)

# Description

Enables Newton rough-terrain locomotion training on all locomotion
velocity envs (Go1, Go2, A1, Anymal-B/C/D, H1, Cassie, Digit, G1) on top
of [@ooctipus](https://github.com/ooctipus)'s Anymal-D foundation work,
cherry-picked from PR isaac-sim#5225.

## Why this PR exists

PR isaac-sim#5225 (Octi's draft) added Newton support for Anymal-D rough terrain.
The other 9 locomotion envs were left out of scope. Octi is away and his
PR has CI failures, so per maintainer guidance ([Kelly Guo's
comment](isaac-sim#5225 (comment)))
the required changes from isaac-sim#5225 are cherry-picked here so the
rough-terrain stack can move forward without depending on his still-open
WIP PR.

## Dependencies

- PR isaac-sim#5365 — adds `isaaclab.utils.checked_apply`, used by
`NewtonManager.create_builder` to forward `NewtonShapeCfg` onto Newton's
upstream `ShapeConfig`. Required for stable rough-terrain contact.

## 1. Cherry-pick from isaac-sim#5225 (`614ea2dbb74`)

Commit authored by Octi Zhang with `Co-authored-by` trailer. Subset of
isaac-sim#5225 — what's kept and dropped:

| # | Item | Status | Reason |
|---:|---|---|---|
| 1 | `anymal_d/rough_env_cfg.py` Anymal-D Newton config | **KEPT**
(then hoisted into shared parent in commit 2 below) | Defines the Newton
physics shape used for rough terrain |
| 2 | `velocity_env_cfg.py` — hoist `physics_material`, `add_base_mass`,
`base_com` startup events into shared `EventsCfg` | **KEPT** | All envs
need them |
| 3 | `base_com` guard `preset(default=..., newton=None)` | **KEPT** |
Ablation A4 on isaac-sim#5225 (posted 2026-04-17): without the gate, 99.99% of
episodes terminate from `body_lin_vel` runaway on Newton. Upstream
Newton fix newton-physics/newton#2332 will let us drop the guard once it
ships |
| 4 | `velocity_env_cfg.py` — `collider_offsets` startup event |
**DROPPED** | (a) Greptile P1 on isaac-sim#5225: PhysX-only `root_view` methods,
would `AttributeError` on Newton without a guard. (b) Ablation A3:
clobbers the 1cm shape margin set by `RoughPhysicsCfg` (event resets
`gap = max(0, contact_offset − margin) = 0`). Removing it gives
**+3.71** reward on Anymal-D Newton (+16.38 vs A0 baseline +12.47) |
| 5 | `terminations.py` — `body_lin_vel_out_of_limit` /
`body_ang_vel_out_of_limit` + `__init__.pyi` exports | **DROPPED** |
Were a NaN guard for the Newton `body_lin_vel` runaway when `base_com`
was unguarded. With the `preset(newton=None)` gate (item 3), the runaway
no longer occurs and the guards are unused |
| 6 | `terrain_generator.py` subdivided flat-grid border | **DROPPED** |
Was a workaround for Newton triangle-collision failures on the
box-primitive border. Newton has since improved triangle handling, so
the workaround is no longer needed |

## 2. New work — `2a532d1f745`

### 2.1 `NewtonShapeCfg` + `checked_apply` wiring

The single most important Newton setting for rough terrain is **shape
margin**. Without a nonzero margin, non-Anymal-D robots fail to learn
stable contact on triangle-mesh terrain. The previous
`NewtonManager.create_builder` only set `gap = 0.01` and left `margin`
at Newton's upstream default of `0.0`.

This PR adds `NewtonShapeCfg` (the Isaac Lab wrapper) exposing `margin`
and `gap`, and forwards it onto Newton's upstream `ShapeConfig` via
`checked_apply` from PR isaac-sim#5365:

```python
@configclass
class NewtonShapeCfg:
    margin: float = 0.0
    gap: float = 0.01

# in NewtonCfg
default_shape_cfg: NewtonShapeCfg = NewtonShapeCfg()

# in NewtonManager.create_builder
shape_cfg = cfg.default_shape_cfg if isinstance(cfg, NewtonCfg) else NewtonShapeCfg()
checked_apply(shape_cfg, builder.default_shape_cfg)
```

`RoughPhysicsCfg` opts in to
`default_shape_cfg=NewtonShapeCfg(margin=0.01)`.

### 2.2 Hoist `RoughPhysicsCfg` into shared base

Octi's per-env Anymal-D `RoughPhysicsCfg` (MJWarp solver + collision
pipeline) is hoisted into `LocomotionVelocityRoughEnvCfg.sim` so every
rough-terrain env inherits identical Newton physics. Per-env files
become minimal robot-only deltas.

### 2.3 Per-env Newton-only tweak

- **Go1**: leg armature preset for joint stability on lightweight
quadruped.

### 2.4 Mass randomization rewrite

Replace `EventsCfg.add_base_mass`'s additive `(-5, 5)` kg default with
multiplicative `(1/1.25, 1.25)` log-uniform scale (`operation="scale"`,
`distribution="log_uniform"`). Scale-invariant across robot sizes,
geometric mean 1.0, no per-robot kg overrides needed.

Per-robot ablation, Newton, 1500-iter (small quadrupeds early-aborted at
iter 300):

| # | Robot | new log-uniform | old additive baseline | ratio | verdict
|
|---:|---|---:|---:|---|---|
| 1 | A1 (iter 300) | 10.00 | 3.25 | **3.08×** | pass — driven by bias
removal (old `(-1, 3)` had +10% mean bias on A1's 10 kg base) |
| 2 | Go1 (iter 300) | 22.29 | 16.30 | 1.37× | pass |
| 3 | Anymal-B (iter 300) | 12.47 | 10.92 | 1.14× | pass |
| 4 | Anymal-C (iter 300) | 14.64 | 12.31 | 1.19× | pass |
| 5 | Go2 @ 1499 | 24.71 | 18.58 | 1.33× | pass |
| 6 | Anymal-D @ 1499 | 16.09 | 15.62 | 1.03× | pass |
| 7 | H1 @ 1499 (biped) | 24.02 | 23.58 | 1.02× | pass |
| 8 | Cassie @ 1499 sym25 | 14.15 | 23.93 (mass rand off) | 0.59× |
**regression — fixed in dependent PR isaac-sim#5298 with `(1.0, 1.25)`
heavier-only override** |

Cassie sensitivity is closed-loop Achilles + hip PD response:
lighter-than-nominal pelvis destabilizes; heavier-only `(1.0, 1.25)`
recovers 90% of the reward and pushes ep_len higher (932 vs 910
baseline). Sub-ablation table is in isaac-sim#5298.

Raw logs, checkpoints, and config snapshots preserved at
`~/workspaces/data/2026-04-21_mass-rand-scale/` (per-robot
`<robot>_newton_1500.log`, `key.md`, `status.md`, `run.sh` reproducer).

## Versions

- `isaaclab_newton` 0.5.21 → 0.5.22
- `isaaclab_tasks` 1.5.24 → 1.5.25

## Type of change

- New feature (non-breaking).

## Checklist

- [x] Pre-commit checks pass
- [x] CHANGELOG + extension.toml bumped on both `isaaclab_newton` and
`isaaclab_tasks`
- [x] Co-author credit for [@ooctipus](https://github.com/ooctipus) on
the cherry-pick commit
- [x] Ablation evidence cited in commit messages

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

Post-merge CI on develop has been failing on arm64. The chain is:
isaaclab_teleop pulls isaacteleop[retargeters], which transitively pins
nlopt==2.6.2, and nlopt 2.6.2 has no aarch64 wheel.

Fix: add swig to apt deps and pre-install nlopt 2.6.2 with
--no-build-isolation on arm64 before isaaclab.sh --install runs. The
later install sees nlopt as already satisfied. Same change applied to
Dockerfile.base and Dockerfile.curobo.

Verified locally in a QEMU arm64 python:3.12-slim container running the
same install path.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] 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 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
# Description

Follows the TorchArray concept from MJLab and augment it with some lab
requirements.

## Type of change

- New feature (non-breaking change which adds functionality)

## 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
# Description

Follow-up to isaac-sim#5408. After that merged, the arm64 build still fails on
the nlopt step with BackendUnavailable: Cannot import
'setuptools.build_meta'. With --no-build-isolation, pip uses the host
Python to resolve the PEP 517 build backend, and IsaacSim's bundled
arm64 Python does not expose setuptools.build_meta in that scope.

Fix: pre-install setuptools, wheel, and numpy in IsaacSim's Python
before the nlopt install step. Same change applied to Dockerfile.base
and Dockerfile.curobo.

Verified locally in a QEMU arm64 python:3.12-slim container: reproduced
the BackendUnavailable error after pip uninstall setuptools wheel, then
confirmed the install succeeds when those packages are pre-installed.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] 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 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
# Description

Runtime check to turn on reading transforms from GPU.

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- 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)
- 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.

<!--
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
-->
# Description

Adds per-build immutable tags to the Docker images published by
[.github/workflows/publish-images.yaml](.github/workflows/publish-images.yaml),
and drops the bare commit-SHA tag (now redundant).

New tags published:

- `develop` builds: `$IMAGE:latest-develop-<run#>-<sha-stub>` (in
addition to the existing `$IMAGE:latest-develop`)
- `release/X` builds: `$IMAGE:latest-release-X-<run#>-<sha-stub>` (in
addition to the existing `$IMAGE:latest-release-X`)

Removed: `$IMAGE:<full-sha>`. The new run-number + short-SHA tags
provide the same per-build immutability with a more readable tag name.

`main` tagging (`$IMAGE:latest`, `$IMAGE:v<VERSION>`) is unchanged aside
from the dropped SHA tag.

The tagging-scheme comment in the workflow was updated to match.

Fixes # (issue)

## Type of change

- New feature (non-breaking change which adds functionality)

## 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
# Description

Adds initial support for the Kamino solver.
Cartpole is training.

## Type of change

- New feature (non-breaking change which adds functionality)

## 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: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…y PR (isaac-sim#5430)

# Description

- Run every test job on every PR: Removed the `detect-changes` job and
the per-package `if:` gating in
`.github/workflows/build.yaml`.
- Fix missing `articulation_ids` on Newton mock views: Added
`articulation_ids` as a lazy `wp.array2d(dtype=int)` on both mock views,
matching the contract `(world_count, count_per_world)` consumed by
`_or_reset_masks_from_mask` / `_scatter_reset_masks_from_ids`.

## 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`
- [ ] 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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
…-sim#5377)

This pull request is a continuation of
isaac-sim#5162. This changes references
from TiledCamera to Camera in downstream configs.

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

## 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

<!--
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: Antoine RICHARD <antoiner@nvidia.com>
hujc7 and others added 25 commits May 15, 2026 14:31
…m#5587)

## Summary

Adds typed preset selection via Hydra-style tokens — `physics=NAME` /
`renderer=NAME` / `presets=NAME[,...]` — that fold into the existing
`presets=<csv>` Hydra-decorator flow. Makes `--task=X --help` list the
actual `PresetCfg` variants present in that task's env_cfg, bucketed by
typed target. Adopted in all 16 Hydra-using scripts
(`rl_games/sb3/skrl/rsl_rl` train+play, `environments/*`,
`benchmarks/*`, `sim2sim_transfer`, `leapp/rsl_rl/export`).

## API shape

```python
parser = argparse.ArgumentParser(...)
# ... script-specific args ...
add_launcher_args(parser)
args_cli, hydra_args = setup_preset_cli(parser)
sys.argv = [sys.argv[0]] + hydra_args
```

`setup_preset_cli` returns `(args, hydra_argv)` without mutating
`sys.argv`. It registers no argparse flags for preset selection — the
typed selectors are recognized as Hydra-style tokens in the
`parse_known_args` remainder and folded into `hydra_argv[0]` as a single
`presets=<csv>` token.

## Grammar

```
python train.py --task=X  physics=newton_mjwarp  renderer=newton_renderer  presets=albedo,depth
```

- `physics=NAME` — typed selector for `PhysicsCfg` variants
- `renderer=NAME` — typed selector for `RendererCfg` variants
- `presets=NAME[,NAME,...]` — broadcast: applied to every matching
`PresetCfg`

All three fold into one `presets=<csv>` token:
`presets=newton_mjwarp,newton_renderer,albedo,depth`.

The grammar matches Hydra's, so the same line can carry path-targeted
overrides (`env.sim.dt=0.001`) that flow through untouched.

## Namespace contract

No preset selector is registered with argparse, so the parsed `args`
namespace gains no `physics` / `renderer` / `presets` attribute.
AppLauncher's name-based forwarding (`set(_SIM_APP_CFG_TYPES) &
set(vars(args))`, `app_launcher.py:681`) therefore cannot pick up a
preset value and push it into `SimulationApp.config` — the historical
`--renderer` → `config["renderer"]` → `None.lower()` crash class is
structurally impossible. Two regression tests lock the contract.

## Help text layout

`--task=Isaac-Cartpole-v0 --help` renders each selector with its
available variants inline directly below it (bullets aligned with the
description column):

```
preset selection:
  Select named PresetCfg alternatives via Hydra-style overrides (key=value, no leading dashes):
      physics=NAME              (typed) selects a PhysicsCfg variant. Available:
                                - newton_kamino
                                - newton_mjwarp
                                - physx
      renderer=NAME             (typed) selects a RendererCfg variant. Available:
                                (none)
      presets=NAME[,NAME,...]   broadcast: applied to every matching PresetCfg. Available:
                                (none)

  Hydra also accepts path-targeted overrides like env.sim.physics=NAME.
```

Typed variants appear only under their own typed selector. The
`presets=` listing shows only DOMAIN-bucket variants (cfgs whose type
doesn't subclass any typed target's base class).

Without `--task`, each row shows just the selector + description and the
section adds a `Pass --task=X` hint on its own paragraph.

## Test plan

- [x] `pytest source/isaaclab_tasks/test/test_preset_cli.py` — 24 tests
pass. Coverage: enum wiring, token folding/dedupe/passthrough,
`_ArgvHelper` semantics, type-based bucketing, all four help-text
branches (parametrized), no-`sys.argv`-mutation contract,
namespace-clean contract, AppLauncher intersection contract,
`hydra_args[0]` preserves the `presets=` token for benchmark telemetry.
- [x] `pytest source/isaaclab_tasks/test/test_hydra.py` — 76 tests pass;
legacy-alias `FutureWarning` behavior unchanged.
- [x] `pre-commit` clean.
- [x] Manual: `--task=Isaac-Cartpole-v0 --help` and
`--task=Isaac-Cartpole-RGB-Camera-Direct-v0 --help` render correctly.
- [x] Manual: `physics=newton_mjwarp renderer=newton_renderer
presets=albedo` folds into one `presets=<csv>` token at `hydra_argv[0]`.
- [x] Manual: unknown name → grouped error from resolver; legacy alias
`newton` → `FutureWarning` and resolves to `newton_mjwarp`.

---------

Co-authored-by: ooctipus <zhengyuz@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
## Summary

Bumps the Newton pin from `v1.2.0rc2` (current develop) directly to the
[`v1.2.0` stable
release](https://github.com/newton-physics/newton/releases/tag/v1.2.0)
across all five pin sites, keeping the canonical `newton[sim] @ git+...`
form everywhere.

Per Kelly Guo's suggestion: skip the rc bump and go straight to stable.
Upstream published `v1.2.0` on 2026-05-12.

**Alternative**:
[isaac-sim#5614](isaac-sim#5614)
(rc3 bump) — pick whichever target based on CI signal. This one is the
most forward target.

> Branch is still named `jichuanh/newton-1.2.0rc4-bump` from when this
PR was originally proposing rc4 — the branch name doesn't match the
current target but the diff is correct. Force-pushing the rename would
close/reopen the PR, which adds noise without changing the artifact.

## What's new in Newton v1.2.0 vs v1.2.0rc2

Full release notes: [newton-physics/newton release
v1.2.0](https://github.com/newton-physics/newton/releases/tag/v1.2.0).
Notable IsaacLab-relevant fixes:

-
[newton-physics/newton#2651](newton-physics/newton#2651)
— MPR/GJK no longer assumes convex hulls are centered around the origin.
-
[newton-physics/newton#2703](newton-physics/newton#2703)
— Kamino FK solver performance.
-
[newton-physics/newton#2721](newton-physics/newton#2721)
— HDR color output for tiled camera sensors.
-
[newton-physics/newton#2743](newton-physics/newton#2743)
— Collada textures in URDF import.
-
[newton-physics/newton#2823](newton-physics/newton#2823)
— Gravity-data device allocation in Kamino (multi-GPU).
-
[newton-physics/newton#2632](newton-physics/newton#2632)
— CollisionPipeline small fixes.
-
[newton-physics/newton#2734](newton-physics/newton#2734)
— `DelassusOperator` attribute refactor. Not used in IsaacLab source
today (verified by grep), no adapt needed.
- SolverMuJoCo fixes: planar meshes, contact-anchor computation,
distance conversion.

## Required dep bumps

None on the IsaacLab side. The `mjwarp 3.8.0.1 → 3.8.0.3` bump flows in
transitively through `newton[sim]`, since
[isaac-sim#5566](isaac-sim#5566)
dropped IsaacLab's explicit `mujoco` / `mujoco-warp` pins.

`warp-lang` stays at `1.13.0` (set by
[isaac-sim#5523](isaac-sim#5523)).

## Pins updated

| File | Change |
|---|---|
| `source/isaaclab_newton/setup.py` | `v1.2.0rc2` → `v1.2.0` |
| `source/isaaclab_physx/setup.py` | `v1.2.0rc2` → `v1.2.0` |
| `source/isaaclab_visualizers/setup.py` | 3× `v1.2.0rc2` → `v1.2.0` |
| `tools/wheel_builder/res/python_packages.toml` | `v1.2.0rc2` →
`v1.2.0` |

## Test plan

- [x] Pre-commit clean.
- [ ] CI smoke verifies clean install picks up `newton 1.2.0` and
downstream `mjwarp 3.8.0.3`.
…isaac-sim#5596)

# Make locomanipulation SDG GR00T flow runnable without flash-attn

## Summary

Two small fixes that let users finetune and roll out the
locomanipulation SDG
GR00T policy on hardware where `flash-attn` is unavailable (e.g.
Blackwell, or
any environment where the wheel fails to build).

## Changes

-
**`scripts/imitation_learning/locomanipulation_sdg/gr00t/no_flash_attn.patch`**
(new): patch against the Isaac-GR00T repo that switches the bundled
Eagle 2.5
VL model from `flash_attention_2` to PyTorch SDPA, and guards the RADIO
  vision module's `flash_attn` imports so the package becomes importable
without flash-attn installed. SigLIP path works; RADIO path is
unsupported
  without flash-attn (documented in the patch).

- **`docs/source/overview/imitation-learning/humanoids_imitation.rst`**:
adds
  a note in the GR00T install section explaining when to apply the patch
(build failure, or `RuntimeError: FlashAttention only supports Ampere
GPUs
  or newer`) and how to apply it from the sibling Isaac-GR00T checkout.

-
**`scripts/imitation_learning/locomanipulation_sdg/gr00t/rollout_policy.py`**:
override `env_cfg.recorders` with `ActionStateRecorderManagerCfg()` so
the
rollout doesn't try to record `env._locomanipulation_sdg_output_data`,
which
is only populated by the data-generation state machine in
`generate_data.py`
  and is absent during policy rollout. Without this, the recorder raises
  `AttributeError` on the first pre-step.


<!-- 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>
# Description

Background: The _cubric.py ctypes shim was pinned to IAdapter v0.1
vtable offsets, but newer Kit builds ship v0.2 — compute calls were
silently landing on unbind, disabling cubric's GPU transform hierarchy
propagation. carb accepts the version mismatch with only a stderr
warning.

Originally, this change updated offsets to the v0.2 layout, requested
v0.2 from the framework, and added a runtime InterfaceDesc check that
refused to acquire on any unexpected version.

The kit team is fixing the ABI-breaking semver contract violation
upstream, so it won't actually make it into a release. So the pinned
version in Isaac Lab remains on v0.1 but keeps the validation code as a
safety net.

This problem will go away once we have official python bindings for
cubric in a future kit release.

If usdrt eventually exposes the required `eRigidBody` options via the
`IFabricHierarchy` API then that would massively simplify the
implementation of newton manager. Will pursue a feature request.

## 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`
- [ ] I have made corresponding changes to the documentation *(N/A)*
- [ ] My changes generate no new warnings *(New warnings on ABI mismatch
are intentional)*
- [ ] I have added tests that prove my fix is effective or that my
feature works *(N/A - spoofing kit versions for unit test would be
non-trivial; verified manually)*
- [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>
## Summary

* Fixed an invalid inline `::` comment in the Windows batch code block
on the kit-less installation page. In Windows batch, `::` only works as
a comment at the start of a line — when placed inline after a command,
the tokens are passed as arguments, causing a runtime error. Moved the
shorthand hint (`or: isaaclab.bat -i`) to its own comment line.

## Test plan

- [ ] Verify the rendered docs page shows the corrected batch snippet.
- [ ] Confirm the `isaaclab.bat --install` command runs without
unexpected extra arguments on Windows.

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

This PR adds a deterministic training path and documentation for Isaac
Lab RL workflows.

- Added apps/isaaclab.python.headless.determinism.kit as a deterministic
headless rendering experience.
- Updated scripts/reinforcement_learning/rl_games/train.py to add opt-in
--deterministic and use configure_seed(env_cfg.seed,
args_cli.deterministic).
- Updated docs/source/features/reproducibility.rst to document
--experience isaaclab.python.headless.determinism.kit
and clarify that strict PyTorch determinism is currently exposed only
for RL-Games.

Test command example:

./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task
Isaac-Cartpole-RGB-v0 --enable_cameras --headless --seed 42
--max_iteration 20 **--deterministic --experience
isaaclab.python.headless.determinism.kit**

Fixes # (issue)

<!-- 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. -->

isaac-sim#3505 Non-reproducible
training results in vision-based tasks with identical seeds

## 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

| Before | After |
| ------ | ----- |
| <img width="200" height="250" alt="Before"
src="https://github.com/user-attachments/assets/57b52d82-ed32-4f79-8ac2-db19b32df54a"
/> | <img width="200" height="250" alt="After"
src="https://github.com/user-attachments/assets/5da0b220-7fef-445a-8efb-f0e1c6dab6a3"
/> |

<!--
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

- [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

<!--
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: r-schmitt <139814266+r-schmitt@users.noreply.github.com>
Co-authored-by: nvsekkin <72572910+nvsekkin@users.noreply.github.com>
Co-authored-by: vidurv-nvidia <vidurv@nvidia.com>
Co-authored-by: ooctipus <zhengyuz@nvidia.com>
Co-authored-by: Yuchen Deng <yuchenkit@gmail.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: isaaclab-bot[bot] <282401363+isaaclab-bot[bot]@users.noreply.github.com>
Co-authored-by: hujc <jichuanh@nvidia.com>
Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
## Description

Fixes `OVRTXRenderer` crash on multi-GPU systems when `sim.device` is
not `cuda:0`.

**Root cause:** A hardcoded `DEVICE = "cuda:0"` constant in
`ovrtx_renderer_kernels.py` was imported and used for all Warp kernel
launches and buffer allocations. Additionally, `AttributeBinding.map()`
calls used `device_id=0`, pinning attribute mapping to GPU 0 regardless
of the simulation device.

**Fix:** 
- Remove the `DEVICE` constant and use `self._device` (set from
`CameraRenderSpec.device`) for all Warp operations (11 locations)
- Add `_device_id` property to extract the CUDA device index from the
device string
- Pass `device_id=self._device_id` to `AttributeBinding.map()` calls (2
locations: object binding and camera binding)

**Note on `RenderVarOutput.map()` calls:** These remain unchanged
(`device=Device.CUDA` only) because the OVRTX C API for render output
mapping (`ovrtx_map_output_description_t`) does not accept a `device_id`
parameter — the output is inherently mapped on whichever GPU OVRTX
rendered on.

**Total:** 13 hardcoded GPU-0 references fixed (11 Warp + 2
AttributeBinding).

This is the same bug class fixed for `NewtonRenderer` in isaac-sim#5019 — OVRTX
was not updated at that time.

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## Checklist

- [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 added my name to the
[`CONTRIBUTORS.md`](https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md)
or my organization to the
[`CONTRIBUTORS.md`](https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md)
list

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

* Added :func:`~isaaclab.cloner.cloner_utils.is_homogeneous` to detect
whether a :class:`~isaaclab.cloner.ClonePlan`
assigns every environment from every source (a homogeneous clone mask).

* Fixed cloned environments disappearing from tiled camera output if
:attr:`~isaaclab_ov.renderers.OVRTXRendererCfg.use_ovrtx_cloning` is set
to ``True``,
by correcting scene-partition attribute creation on env roots and
cameras.

* Renamed the ``use_cloning`` field on
:class:`~isaaclab_ov.renderers.OVRTXRendererCfg` to
``use_ovrtx_cloning``.
Changed its default value to ``True``. This will bring notable speedup
for the total startup time (Launch to Train),
esp. for large-scale env setups. On Isaac-Dexsuite-Kuka-Allegro-Lift-v0
with 1024 env clones, the total startup time
dropped from ~78s to ~43s. Note that if ``use_ovrtx_cloning`` is enabled
but the env setup is heterogeneous, the
OVRTX renderer will disable the internal cloning path and logs a
warning, exporting the full multi-environment stage
instead (same effect as setting ``use_ovrtx_cloning`` to ``False`` for
that run).


## Type of change

- 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

- [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

<!--
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>
…_ik (isaac-sim#5644)

## Summary

One-character fix in
`source/isaaclab/test/controllers/test_pink_ik.py:309`:

```diff
- quat_from_matrix(matrix_from_quat(target_rot_tensor) * matrix_from_quat(quat_inv(current_rot)))
+ quat_from_matrix(matrix_from_quat(target_rot_tensor) @ matrix_from_quat(quat_inv(current_rot)))
```

`calculate_rotation_error` was composing two rotation matrices with
PyTorch's element-wise multiplication (`*`) where matrix multiplication
(`@`) was intended. The Hadamard product of two rotation matrices is not
generally a rotation matrix.

## Why this surfaced as test failures now

The bug has been latent since
[isaac-sim#3149](isaac-sim#3149)
(2025-08-26) because the Hadamard product of two near-identity matrices
is also near-identity — `quat_from_matrix` could still recover a
near-unit quaternion and the assertion `rot_error ≈ 0` would pass for
completely wrong mathematical reasons.

It became visible when [isaac-sim#5609
(jmart)](isaac-sim#5609) (2026-05-14)
added the unit-norm guard to `isaaclab/utils/math.py:quat_from_matrix`:

```python
invalid = (quat.norm(p=2, dim=-1, keepdim=True) - 1.0).abs() > 2e-5
return torch.where(invalid, torch.full_like(quat, float("nan")), quat)
```

After that PR, any non-rotation input (the Hadamard mess) returns NaN,
which `axis_angle_from_quat` propagates → `torch.max(NaN) = NaN` →
`AssertionError: Left hand IK rotation error (nan) exceeds tolerance`.
Both hands always went to NaN; left hand is just asserted first.

## Verification

Local repro on the Horde VM against current `develop` (`isaaclab_physx`
backend, `newton[sim]@v1.2.0rc2`):

| Configuration | Result |
|---|---|
| Unfixed, `Isaac-PickPlace-GR1T2-Abs-v0-horizontal_movement` | FAILED —
`Left hand IK rotation error (nan)` |
| Fixed, same parameterization | PASSED — rotation errors `1e-4` to
`1e-7` (well within 0.02 rad tolerance) |
| Fixed, all 12 GR1T2 cases, run 1 | 11 passed, 1 skipped |
| Fixed, all 12 GR1T2 cases, run 2 | 11 passed, 1 skipped
(deterministic) |

## Scope

This addresses the consistent `Left hand IK rotation error (nan)`
failures seen across recent develop PRs (e.g. [isaac-sim#5633
`test-curobo`
log](https://github.com/isaac-sim/IsaacLab/actions/runs/25926139790/job/76211194676),
[isaac-sim#5609 `test-curobo`
log](https://github.com/isaac-sim/IsaacLab/actions/runs/25831490295/job/75897258188),
[isaac-sim#5616 `test-curobo`
log](https://github.com/isaac-sim/IsaacLab/actions/runs/25930392313/job/76222556444)).

Remaining failures on G1 envs (finite ~0.03-0.05 rad rotation errors
against the 0.030 rad tolerance) are a **separate** issue — IK
convergence quality rather than the NaN math bug. Out of scope for this
PR; needs its own ticket.

## Test plan

- [x] Pre-commit clean.
- [x] Unfixed branch reproduces NaN on
`Isaac-PickPlace-GR1T2-Abs-v0-horizontal_movement` locally.
- [x] Fixed branch passes the same parameterization locally with finite
rotation errors.
- [x] Fixed branch passes all 12 GR1T2 parameterizations across two
consecutive runs (deterministic).
…im#5643)

# Description

Expands the **Optimize XR Performance** section of the Isaac Teleop
feature guide
with the most common levers users reach for when XR teleop cannot
sustain the
headset's display rate -- particularly on lower-spec GPUs or in heavy
scenes.
What changed:
- **RTX - Minimal renderer**: new dropdown explaining when to use it,
how to
enable it from the viewport renderer dropdown, the recommended **Render
Settings** (**Minimal Shading Mode = Diffuse/Glossy/Emission**), and the
current `DistantLight`-only lighting limitation, with a snippet showing
how
  to swap a `DomeLight` for a `DistantLight`.
- **XR Resolution Multiplier slider**: new dropdown describing the
**XR -> Advanced Settings -> Render Resolution** slider for trading
image
  sharpness for GPU headroom (`0.8` as a sensible starting point).
- **Physics / render time step**: refreshed to focus on Quest 3 / Pico 4
Ultra
(90 Hz), explain what `sim.render_interval` actually controls, and call
out
  the `sim.dt` stability/performance trade-off.
- Removed the **Try running physics on CPU** dropdown -- this is already
the
  default for these workflows.

Fixes # (issue)

## 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
- [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
# Description

Makes the Isaac Lab base, ROS 2, and cuRobo Docker images run as a
non-root runtime user by creating an `isaaclab` user after root-only
setup and switching the final images to `USER isaaclab`.

The ROS 2 Dockerfile temporarily switches back to `USER root` for
apt-based ROS setup, then restores `USER isaaclab` for runtime. The
`installci` Dockerfile is intentionally unchanged.

This also updates deprecated Isaac Sim Dockerfile comments to point to
the NGC Isaac Sim container page, removes the default root-allowance
compose setting, updates Docker documentation, and adds CI coverage to
verify the built base and cuRobo images do not run as root by default.
ROS 2 is covered by the static Dockerfile regression test because this
workflow does not build a ROS 2 image.

Fixes: N/A

Validation:
- `./isaaclab.sh -f`
- `git diff --check`
- `docker run ... /isaac-sim/python.sh -m pytest
docker/test/test_dockerfile_nonroot.py -q` -> `7 passed, 1 skipped`
- Manual cuRobo runtime check confirmed non-root `uid=1000`

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## 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 (not applicable;
no `source/<pkg>/` package touched)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: sheikh-nv <7774242+sheikh-nv@users.noreply.github.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
# Description

This enables frame stacking for newton+warp by default in the cartpole
camera presets task.

**Newton Frame Stacking:** _Provides explicit temporal data to newton._

RTX uses DLSS anti-aliasing by default, which provides implicit temporal
data. The newton_renderer does not provide temporal data. However,
newton's energy-conserving physics solver requires temporal velocity
data in order to compensate for the lack of damping, which causes
convergence problems when paired with newton_renderer.

This commit provides explicit temporal information via 2-frame stacking
by default for cartpole-camera when using newton+newton_renderer. This
allows newton to provide the damping it needs to converge at the same
rate as physx. This adds 36% GPU memory overhead, but the wall clock
overhead is negligible.

The default for all other physics/renderer backends is still stack size
= 1 (disabled) since physx has implicit damping built-in via its TGS
solver, and RTX provides temporal data implicitly.

**Implementation:**

For manager-based envs, a new `stacked_image` term is added to the MDP
observations - tasks can opt into frame stacking by adding the
`stacked_image` term to their observation cfg and setting `frame_stack`
to a value > 1.

The cartpole camera presets direct env now implements frame stacking
using `CircularBuffer` from `isaaclab.utils.buffers` directly in
`_get_observations`.

Added new unit tests for the MDP term (mocked + `ObservationManager`
E2E) and cartpole integration, and updated the documentation with a note
about newton's dependency on temporal data.

_Note: This is a task-local re-implementation of the closed [PR
isaac-sim#5232](isaac-sim#5232

## 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

Migrates `Camera`, `CameraData`, and all renderer backends to
warp-backed `ProxyArray`,
consistent with the rest of IsaacLab's sensors (ContactSensor,
RayCaster, IMU, etc.).

`CameraData` fields (`pos_w`, `quat_w_world`, `intrinsic_matrices`,
`output`) now return
`ProxyArray` instead of `torch.Tensor`. Use `.torch` for a zero-copy
tensor view or pass
directly to warp kernels. `RenderBufferSpec.dtype` is now a warp dtype
(e.g. `wp.float32`).

The `ProxyArray` deprecation bridge means existing torch usage continues
to work with a
one-time `DeprecationWarning`.

## Type of change

- Possible breaking change (existing functionality will not work without
user modification)

## 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>
Bumped packages:
- isaaclab: 5.2.1 → 5.3.0
- isaaclab_newton: 0.9.1 → 0.10.0
- isaaclab_ov: 0.1.9 → 0.2.0
- isaaclab_physx: 0.7.1 → 0.8.0
- isaaclab_tasks: 1.6.0 → 1.7.0
- isaaclab_teleop: 0.3.11 → 0.4.0
…saac-sim#5459)

# Description

Drastic rewrite of OVPhysX `Articulation` and `ArticulationData` so they
follow the same shape as the post-refactor OVPhysX `RigidObject` from
isaac-sim#5426, with the API surface mirroring `Newton Articulation` and behavior
parity with `PhysX Articulation`. Single-PR atomic rewrite, clean break
(no deprecation aliases for OVPhysX-introduced renames;
framework-inherited deprecated shims kept).

The OVPhysX articulation diverged significantly from the rest of the
framework conventions. This PR brings it back in line: same docstring
template, same section ordering, same naming, same internal patterns,
same lifecycle.

> [!IMPORTANT]
> **Stacked on isaac-sim#5426** (`[OVPHYSX] RigidObject + RigidObjectData
asset`). Review only the 16 articulation-specific commits at the tip of
this branch — every commit before that lands via isaac-sim#5426. Once isaac-sim#5426
merges to `develop`, this PR will rebase cleanly onto `develop`.

Fixes # (none — internal refactor; no associated issue)

## Architectural changes

**OVPhysX RigidObject is the design template.** It has navigated the
hybrid OVPhysX surface — Newton-style mask+index dual API + PhysX-style
CPU-only bindings via pinned-host staging à la isaac-sim#5329 + pull-to-refresh
`binding.read(target)`:

- Eager `TimestampedBufferWarp` allocation in `_create_buffers` (single
source of truth — no `_invalidate_caches` / `_ensure_*_buffers`
machinery).
- Pinned-host CPU staging buffers for every CPU-only binding (mass, COM,
inertia, all DOF properties).
- `_binding_read` / `_binding_write` / `_stage_to_pinned_cpu` helpers
route CPU-only types through pinned-host memory.
- Every public property returns a `ProxyArray` (warp + torch dual view);
raw `wp.array` for one-shot config buffers.
- Counts and names (`num_instances`, `num_bodies`, `num_joints`,
`body_names`, `joint_names`, ...) demoted from `@property` to plain
instance attributes.
- Dual mask+index API on every writer/setter (`*_index` accepts partial
data; `*_mask` accepts full data with a `wp.bool` mask).
- All `write_*` / `set_*` parameters are kwarg-only after `*,`. No
positional. **No `full_data` flag anywhere.**
- The deprecated `_write_body_state` plumbing layer is removed;
deprecated state-writer shims (`write_root_state_to_sim`, etc.) call the
public `write_*_to_sim_index` methods directly, mirroring RigidObject.

**Articulation-specific surface** mirrors Newton 1-to-1: joint-state
writers, joint-property writers (CPU-only), body-property setters
(multi-body shape), joint-command target setters, external-wrench
setters via `WrenchComposer`, fixed/spatial tendon setters, deprecated
state-writer shims, full actuator pipeline (`compute`,
`_apply_actuator_model`, `_process_actuators_cfg`).

## Files changed

-
`source/isaaclab_ovphysx/isaaclab_ovphysx/assets/articulation/articulation.py`
— full rewrite (~3863 lines, matches Newton).
-
`source/isaaclab_ovphysx/isaaclab_ovphysx/assets/articulation/articulation_data.py`
— full rewrite (~2504 lines).
- `source/isaaclab_ovphysx/isaaclab_ovphysx/assets/kernels.py` — gained
6 articulation kernels migrated from the stop-gap `kernels_old.py` (now
deleted): `_compose_root_com_pose`, `_compute_heading`,
`_copy_first_body`, `_projected_gravity`, `_world_vel_to_body_ang`,
`_world_vel_to_body_lin`. Plus 2 new joint-property kernels
(`write_joint_position_limit_to_buffer_index/mask` for trailing-dim-2
limits, `write_joint_friction_to_buffer_index/mask` for the
broadcast-coefficient pattern).
- `source/isaaclab_ovphysx/isaaclab_ovphysx/assets/kernels_old.py` —
deleted.
- `source/isaaclab_ovphysx/test/assets/test_articulation.py` — verbatim
PhysX test mirror (~210 parametrizations) with PhysX-internal
`root_view.X` assertions adapted to the OVPhysX bindings dict and
`omni.physx.scripts`-dependent tests xfailed; mirrors the precedent from
the RigidObject test mirror in isaac-sim#5426.

## Type of change

- Breaking change (existing functionality will not work without user
modification — OVPhysX is at `0.2.x`, clean break is acceptable per
semver-on-0.x; no deprecation aliases for OVPhysX-introduced renames).
- Code modernization / refactor.

## Validation

Three layers, run on **GPU and CPU separately** (the wheel's
process-global device-mode lock makes a single invocation lock to one
device):

1. **Real-backend port** — `test_articulation.py` (verbatim PhysX
mirror). `./scripts/run_ovphysx.sh -m pytest <path> -k 'cuda:0'` and
`... -k 'cpu'`. Expected end state: each pass shows `<X> passed, <Y>
xfailed, 0 failed`. Every xfail carries a `reason` pointing at the
wheel-gaps spec.
2. **Cross-backend interface** —
`source/isaaclab/test/assets/test_articulation_iface.py` will gain an
`ovphysx` backend, mirroring the rigid-object iface treatment from
isaac-sim#5426.
3. **API consistency audit** — per-method side-by-side checklist
comparing Newton, RigidObject (post-refactor), and the rewritten
Articulation; verifies method name, kwarg-only signature, parameter
order, return type, docstring template, section-header placement.

## Status

Active triage — not yet ready for review.

- ✅ Implementation complete (all writers, setters, properties,
lifecycle, actuator pipeline).
- ✅ Initial GPU root-cause bug fixed: `_read_transform_binding` now
routes `BODY_COM_POSE` through `_binding_read` so the wheel's
CPU-only-binding device check is satisfied on a GPU sim.
- ✅ Verbatim PhysX-internals assertions (`root_view.max_dofs ==
shared_metatype.dof_count`, `link_paths[0]` round-trip) adapted to the
OVPhysX bindings dict — they now check `binding.shape[1] == num_joints /
num_bodies` for each per-DOF / per-link binding.
- 🔄 In-flight: tendon-init device-routing bug.
`_read_initial_properties` reads `FIXED_TENDON_*` / `SPATIAL_TENDON_*`
via numpy assuming CPU residency, but the wheel exposes them as
GPU-resident (consistent with PhysX's `set_fixed_tendon_properties` not
cloning to CPU). Plan is to remove tendon types from `_CPU_ONLY_TYPES`
and read them directly into the sim-device buffer.
- ⏳ Pending: cross-backend `test_articulation_iface.py` extension, API
consistency audit, CHANGELOG + version bump (`0.2.x → 0.3.0`).

## 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
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works (the verbatim PhysX test mirror is the contract;
bug-fixing in progress)
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file (deferred to final-pass commit)
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…saac-sim#5647)

# Description

<!--
Thank you for your interest in sending a pull request. Please make sure
to check the contribution guidelines.

Link:
https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html

💡 Please try to keep PRs small and focused. Large PRs are harder to
review and merge.
-->

Please include a summary of the change and which issue is fixed. Please
also include relevant motivation and context.
List any dependencies that are required for this change.

Fixes # (issue)

<!-- 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)
- 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.

<!--
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: ooctipus <zhengyuz@nvidia.com>
Co-authored-by: Mustafa H <34825877+StafaH@users.noreply.github.com>
…#5631)

# Description

Avoid disk I/O when preparing USD stage for OVRTX renderer

## 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
# Description

Refactors `RayCaster` and `RayCasterCamera` into a backend-agnostic base
+ per-backend implementations under `isaaclab_physx.sensors.ray_caster`
and `isaaclab_newton.sensors.ray_caster`, mirroring the iconic split
pattern already used by `Pva`, `FrameTransformer`, and `ContactSensor`.

The PhysX backend tracks the parent rigid body directly via
`RigidObjectView` instead of going through `FabricFrameView`, which
fixes the staleness regression from isaac-sim#5179: sensors parented under an
articulation / rigid body were returning their spawn-time pose forever
during headless training, silently freezing height-scan observations in
rough-terrain locomotion (and any similar IMU / camera path that read
through `FrameView`).

The Newton backend uses the site-based pattern from `Pva` /
`FrameTransformer`: walk USD to the rigid-body ancestor, register a
body-attached site via `NewtonManager.cl_register_site`, and read
per-step transforms off a `SensorFrameTransform` against a shared
world-origin reference. Static parents bypass the site machinery (a
single `body=-1` global site can't represent per-env world origins) and
serve a cached per-env `wp.transformf` array.

`MultiMeshRayCaster` / `MultiMeshRayCasterCamera` re-parent onto the new
base but keep their `FrameView`-backed body tracker, so the staleness
behavior persists there. Tracked as `xfail` in
`test_ray_caster_sensor.py` — extending the backend split to MultiMesh
is a follow-up.

The cfg surface, `class_type` strings, and runtime semantics are
unchanged for callers; existing user code does not need to migrate.

Fixes isaac-sim#5476 (the `FabricFrameView` contract regression-test PR — the bug
it documents is fixed for the single-mesh path here).

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)

## Screenshots

N/A — backend refactor, no UI 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 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

Update ecosystem documentation to reflect the latest multi-backend
setup.

## 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

<!--
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
-->
Bumped packages:
- isaaclab: 5.3.0 → 5.4.0
- isaaclab_newton: 0.10.0 → 0.11.0
- isaaclab_ov: 0.2.0 → 0.2.1
- isaaclab_ovphysx: 1.0.0 → 2.0.0
- isaaclab_physx: 0.8.0 → 0.9.0
- isaaclab_tasks: 1.7.0 → 1.8.0
# Description

Adds missing modules to the API docs.

## 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

<!--
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
-->
…m#5650)

## Description

Refactors the IsaacLab installation model to simplify the user
experience, adds
comprehensive installation CI tests (including conda).

---

## Motivation

The previous installation model required users to name every individual
submodule
(`./isaaclab.sh -i assets,tasks,physx,contrib,newton,rl[rsl-rl]`),
exposing internal
implementation details. Users shouldn't need to know that `tasks`
depends on `physx`
or that `contrib` exists — they just want to train with Newton or run
with Isaac Sim.

---

## Changes

### 1. Installation model refactor

**`source/isaaclab/isaaclab/cli/commands/install.py`**
- Replaced `VALID_ISAACLAB_SUBMODULES` / `VALID_RL_FRAMEWORKS` with
three typed
  constants that make the tier structure explicit:
- `CORE_ISAACLAB_SUBMODULES: list[str]` — always installed (isaaclab,
assets,
contrib, experimental, newton, ov, ovphysx, physx, rl, tasks,
tasks_experimental,
    visualizers)
- `OPTIONAL_ISAACLAB_SUBMODULES: dict[str, str]` — opt-in heavy
submodules
    (`mimic`, `teleop`)
  - `VALID_EXTRA_FEATURES: set[str]` — opt-in heavy dependency groups
    (`contrib`, `newton`, `ov`, `rl`, `visualizer`)
- Rewrote `command_install(install_type)` to always install all core
submodules,
  then layer optional submodules and extra feature dependencies on top.
- Added `_install_extra_feature(feature_name, selector)` replacing
  `_install_extra_frameworks`.
- `./isaaclab.sh -i` (no args) or `-i all` installs everything including
`mimic`
  and `teleop`.
- `./isaaclab.sh -i none` installs all core submodules with no optional
extras.
- Unknown tokens (e.g. old `tasks`, `assets`) emit a `[WARNING]` and are
skipped
  gracefully.

**`source/isaaclab/isaaclab/cli/__init__.py`**
- Rewrote the `-i` help text to document the three-tier model with
examples.

**`source/isaaclab/setup.py`**
- Simplified `EXTRAS_REQUIRE` to `isaacsim` and `all` only.

**`source/isaaclab_mimic/setup.py`**
- Removed the empty `robomimic` extra.

**`pyproject.toml` (root)**
- `[project.dependencies]`: lists all core submodules (bare, no extras).
- `[project.optional-dependencies]`: simplified to `isaacsim` and `all`.

---

### 2. Documentation

**`docs/source/setup/installation/include/src_build_isaaclab.rst`**
- Rewrote the install section: new tables for optional submodules and
extra feature
  sets with their selectors; updated all example commands.

**`docs/source/setup/installation/kitless_installation.rst`**
- Updated the selective-install table and examples to match the new
model.

### 3. Installation CI tests

#### New and updated test files

| File | Status | What it tests |
|---|---|---|
| `test_install_command_parsing.py` | New | Unit tests for
`_split_install_items`, constant consistency, and `command_install`
dispatch logic (all mocked, no pip) |
| `test_isaaclabx_i_none.py` | New | `./isaaclab.sh -i none` installs
all core submodules; optional submodules absent |
| `test_isaaclabx_i_rl.py` | New | `rl[rsl-rl]`, `rl[skrl]`, `rl[sb3]`
each install the right framework; `rl` (no selector) installs all |
| `test_isaaclabx_i_mimic.py` | New | `mimic` is importable after `-i
mimic`; absent after `-i none` |
| `test_isaaclabx_i_visualizer.py` | New | `visualizer[rerun]`,
`visualizer[viser]`, `visualizer` (all) install the right backends |
| `test_install_workflow_training.py` | New | E2E uv × conda training
workflows (see table below) |
| `test_isaaclabx_i_physx.py` | Updated | Reflects physx in core set (no
longer requires `-i physx`) |
| `test_isaaclabx_uv_smoke.py` | Updated | `assets` / `tasks` are
always-installed core; `newton` is an extra |
| `test_isaaclabx_uv_training.py` | Updated | Install command updated
from old token list to `newton,rl[all]` |

#### `test_install_workflow_training.py` — E2E matrix

| Test | Install command | Marker |
|---|---|---|
| `test_uv_none_installs_core_submodules` | `-i none` | `@uv` |
| `test_uv_newton_rsl_rl_trains_cartpole` | `-i newton,rl[rsl-rl]` |
`@uv` |
| `test_uv_newton_ov_rsl_rl_trains_cartpole` | `-i newton,ov,rl[rsl-rl]`
| `@uv` |
| `test_uv_all_trains_cartpole` | `-i all` | `@uv` |
| `test_conda_none_installs_core_submodules` | `-i none` (conda env) |
`@conda` |
| `test_conda_newton_rsl_rl_trains_cartpole` | `-i newton,rl[rsl-rl]`
(conda env) | `@conda` |

#### `source/isaaclab/test/install_ci/utils.py`

- Added `drop_keys(env, keys)` helper for stripping venv/conda
activation markers
  before creating isolated environments.
- Added `Conda_Mixin` with `create_conda_env()`, `destroy_conda_env()`,
and
  `run_in_conda_env()` for conda-based test classes.

#### `source/isaaclab/test/install_ci/conftest.py`

- Registered `conda` and `timeout` as known pytest markers.

---

### 4. Conda CI infrastructure

**`docker/Dockerfile.installci-conda`** (new)

- Layers Miniconda on top of the existing uv-based
`Dockerfile.installci` image.
- Used by the new `install-tests-conda` CI job.

**`tools/run_install_ci.py`**

- Refactored build logic into `_build_image()` helper.
- Added `--conda` flag: builds the uv base image first, then the conda
layer on
  top; routes to the conda image for the Docker run.

**`.github/workflows/install-ci.yml`**

- Renamed existing job to `Installation Tests (uv)`; added `-m uv` so it
only runs
  uv-marked tests.
- Added `Installation Tests (conda)` job with `--conda` and `-m conda`,
  `timeout-minutes: 150` (extra headroom for two-stage Docker build).
- Fixed SIGPIPE in `render_table` / `any_match` shell functions:
replaced
`printf '%s\n' "$files" | grep` with `grep <<< "$files"` to avoid
broken-pipe
  signals when `grep` exits early with `-m` or `-q`.

---

## Testing

- `test_install_command_parsing.py`: 41 unit tests, all pass without GPU
or network.
- Install + training verified end-to-end on this machine:
  - `./isaaclab.sh -i newton,ov,rl[rsl_rl]` → clean install, no warnings
- `./isaaclab.sh train --rl_library rsl_rl --task
Isaac-Cartpole-Direct-v0 --num_envs=16 --max_iterations=10
"presets=newton" --headless` → 10 iterations, exit 0, ~2900 steps/sec

---

## Migration guide

| Old command | New command |
|---|---|
| `./isaaclab.sh -i assets,tasks,physx,contrib` | `./isaaclab.sh -i
none` (all core always installed) |
| `./isaaclab.sh -i assets,tasks,ov,rl[rsl-rl]` | `./isaaclab.sh -i
ov,rl[rsl-rl]` |
| `./isaaclab.sh -i newton,rl[all]` | unchanged |
| `./isaaclab.sh -i mimic,teleop` | unchanged |
| `uv pip install isaaclab[tasks,rl,assets]` | `uv pip install
isaaclab[all]` |
Extract _compose_fabric_transform() to deduplicate the kernel-launch
logic shared by set_world_poses and set_scales. The initial USD->Fabric
sync now composes position, orientation, and scale in one call, so
PrepareForReuse is invoked exactly once per logical update.

Also replace assert with RuntimeError in _rebuild_fabric_arrays so the
topology-change guard survives python -O.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.