Skip to content

Enable mgpu in FrameView classes#1

Draft
pv-nvidia wants to merge 95 commits into
fix/fabric-prepare-for-reusefrom
feat/frame-view-enable-mgpu
Draft

Enable mgpu in FrameView classes#1
pv-nvidia wants to merge 95 commits into
fix/fabric-prepare-for-reusefrom
feat/frame-view-enable-mgpu

Conversation

@pv-nvidia
Copy link
Copy Markdown
Owner

@pv-nvidia pv-nvidia commented May 4, 2026

Description

Removes the cuda:0-only restriction in FabricFrameView. USDRT SelectPrims now accepts any CUDA device index, so Fabric acceleration runs on the simulation device (e.g., cuda:1) instead of silently falling back to the slower USD path. This unblocks distributed training where each process is pinned to a specific GPU.

The change itself is small (drops the device guard in __init__, the assertion in _initialize_fabric, and the _fabric_supported_devices allowlist). The bulk of the diff is multi-GPU test coverage — three cuda:1-parameterized tests guarded by a new multi_gpu pytest marker, plus a dedicated CI job on the multi-GPU runner so regressions show up on PRs that touch FabricFrameView.

The skip-vs-fail logic in _skip_if_unavailable is intentional:

  • On a developer workstation with a single GPU, cuda:1 tests pytest.skip with a warning so local runs stay green.
  • In CI (GITHUB_ACTIONS=true), a missing cuda:1 becomes pytest.fail so a misconfigured runner is caught immediately rather than silently green-lighting every PR.

Stacked on: isaac-sim#5380. Merge that one first; this PR contains only the multi-GPU enablement on top of it.

Type of change

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

cuda:0 continues to work exactly as before; cuda:1+ now also works instead of silently falling back to USD. No public API surface changed.

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • 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

Note on the changelog item: this PR uses a fragment file at source/isaaclab_physx/changelog.d/feat-frame-view-enable-mgpu.rst per the new fragment-based changelog system (isaac-sim#5434). CHANGELOG.rst and config/extension.toml are intentionally not edited directly — the nightly CI workflow compiles them from fragments.

Test plan

Three new tests, all marked @pytest.mark.multi_gpu and parameterized with ["cuda:1"]:

  • test_fabric_cuda1_world_pose_roundtripset_world_posesget_world_poses returns the same values on a non-primary CUDA device.
  • test_fabric_cuda1_no_usd_writeback — Fabric writes on cuda:1 do not write back to USD (atol=0.0 — equality, not approximate).
  • test_fabric_cuda1_scales_roundtrip — covers the set_scales write path on cuda:1, since both Fabric write paths now run on self._device.

A new CI job, test-fabric-multi-gpu, runs in .github/workflows/test-multi-gpu.yaml on the existing [self-hosted, linux, x64, gpu, multi-gpu] runner. The job pre-flights with ./isaaclab.sh -p -c "import torch; print(torch.cuda.device_count())" and fails loudly with ::error:: if the runner regresses to a single GPU. Triggered automatically on PRs that touch source/isaaclab_physx/isaaclab_physx/sim/views/fabric_frame_view.py or its test file.

To verify locally on a multi-GPU machine:

./isaaclab.sh -p -m pytest -m multi_gpu \
    source/isaaclab_physx/test/sim/test_views_xform_prim_fabric.py -v

To verify the cuda:0 path is unchanged:

./isaaclab.sh -p -m pytest -m "not multi_gpu" \
    source/isaaclab_physx/test/sim/test_views_xform_prim_fabric.py -v

@pv-nvidia pv-nvidia changed the title Feat/frame view enable mgpu Enable mgpu in FrameView classes May 4, 2026
@pv-nvidia pv-nvidia marked this pull request as draft May 4, 2026 14:43
@pv-nvidia pv-nvidia self-assigned this May 4, 2026
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from f3ecad1 to 297dc09 Compare May 4, 2026 14:53
matthewtrepte and others added 4 commits May 5, 2026 13:13
…m#5473)

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

Extend debug Visualization Markers, which are supported in the Kit
Visualizer, to the Newton Visualizers.

These Visualization Markers are various shapes and models which can be
added to envs for debugging / showing extra information.

Also added filtering for partial visualization (when we filtered which
envs are shown the in the visualizer, we also filter the markers)

For general USD mesh marker support in Newton, a followup PR will be
required, once a Newton API for general USD -> Newton Mesh conversion is
added (see newton-physics/newton#2667)

Checked velocity arrows, dexcubes, raycasts, frames, goal markers


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

- Increase the CI startup-hang grace period from 45s to 120s so slow but
valid Kit startup is not killed prematurely.
- Make `SurfaceGripper` fail fast on non-CPU simulation backends before
loading the surface gripper extension.
- Skip the CI-only `SurfaceGripperView` CPU initialization path that can
deadlock, while keeping CUDA fail-fast coverage.

## 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
-->
…isaac-sim#5478)

Follow-up to isaac-sim#5434 (fragment-based changelog system). Two
contributor-facing references still pointed at the old "edit
CHANGELOG.rst directly" workflow:

- **`docs/source/refs/contributing.rst`** — *Maintaining a changelog and
extension.toml* section described per-version editing of CHANGELOG.rst
with manual SemVer bumps.
- **`.github/PULL_REQUEST_TEMPLATE.md`** — checklist asked contributors
to update the changelog and bump extension.toml directly.

Replaced only the parts that talk about direct editing; section/style
guidance (Added/Changed/Deprecated/Removed/Fixed, past tense, the sample
bullets themselves) stays intact.

## Test plan

- [x] Pre-commit clean
- [ ] Verify Build Latest Docs CI step renders the new section correctly

cc @kellyguo11 — addresses the doc gaps flagged after isaac-sim#5434 merged.
# Description

Mark all RTX-based rendering test cases flaky until they can produce
deterministic low-res camera outputs that pass golden image testing on
every CI run.

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 change

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

---------

Signed-off-by: HuiDong Chen <huidongc@nvidia.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from 297dc09 to 25e958f Compare May 6, 2026 15:30
…ic_write (isaac-sim#5380)

## Summary

Replace the `sync_usd_on_fabric_write` workaround in `FabricFrameView`
with proper `PrepareForReuse()` calls on the Fabric `PrimSelection`.
This tells the renderer (FSD/Storm) that Fabric data has changed, so the
next rendered frame reflects updated transforms — eliminating the need
to copy Fabric writes back to USD.

## Motivation

The existing `sync_usd_on_fabric_write` flag worked by mirroring every
Fabric write back to USD, which defeated the performance benefits of
Fabric. With `PrepareForReuse()`, the rendering pipeline is properly
notified of Fabric data changes without any USD writeback.

Additionally, the old code incorrectly fell back to USD for CPU devices
— Warp handles CPU Fabric buffers correctly, so the fallback was
unnecessary.

This addresses two of the issues raised in @pbarejko Piotr's review of
PR isaac-sim#4923:
- **Issue #1** (USD write-back): Fabric writes no longer sync back to
USD
- **Issue #4** (PrepareForReuse): Renderer notification via
`PrepareForReuse()` instead of USD writeback

## Changes

### Core (FabricFrameView)
- Call `_prepare_for_reuse()` in write paths (`set_world_poses`,
`set_scales`) to notify the renderer
- Remove `sync_usd_on_fabric_write` parameter (accepted via `**kwargs`
for backward compat)
- Remove incorrect CPU/device fallback warnings — Warp handles CPU
Fabric buffers correctly
- Add `_rebuild_fabric_arrays()` for topology change recovery when
`PrepareForReuse()` returns True, with assertion guarding the prim-count
invariant

### Camera
- Remove `sync_usd_on_fabric_write=True` from FrameView construction in
`camera.py`

## Benchmark Results

1024 prims, 50 iterations, NVIDIA L40 GPU:

| Operation | USD (ms) | Fabric (ms) | Speedup |
|---|---|---|---|
| Get World Poses | 14.71 | 0.07 | **203x** |
| Set World Poses | 40.75 | 0.16 | **259x** |
| Interleaved Set→Get | 55.90 | 0.24 | **232x** |
| Get Local Poses | 11.08 | 11.12 | 1.0x |
| Set Local Poses | 16.14 | 16.28 | 1.0x |

Local poses fall back to USD (expected — Fabric only accelerates world
poses via `omni:fabric:worldMatrix`).

## Tests Added

| Test | What it validates |
|------|------------------|
| `test_camera_pose_update_reflected_in_render` | Camera pose changes
propagate to rendered depth (close vs far) for CPU/GPU, tiled/non-tiled
|
| `test_fabric_set_world_does_not_write_back_to_usd` | Fabric writes
stay in Fabric, USD prim unchanged |
| `test_set_world_updates_local` (xfail) | Documents Issue #5:
`set_world_poses` doesn't update local pose in Fabric mode |

## Test Results

| Test Suite | Passed | Skipped | Xfailed | Total |
|---|---|---|---|---|
| Fabric contract tests (`test_views_xform_prim_fabric.py`) | 17 | 16 |
1 | 34 |
| USD contract tests (`test_views_xform_prim.py`) | 45 | 0 | 0 | 45 |
| Camera render test (`test_tiled_camera.py`) | 8 | 0 | 0 | 8 |

## Type of change

- Performance improvement (removes redundant USD writeback on Fabric
operations)

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

*No doc changes needed (parameter wasn't referenced in any docs)*
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from 3d7335a to ce0aaa0 Compare May 6, 2026 16:46
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label May 6, 2026
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from ce0aaa0 to a6cd73e Compare May 6, 2026 17:10
…tation (isaac-sim#5506)

# Description

This PR changes the PyTorch3d installation command in the
locomanipulation SDG policy training / rollout to use git and install
pytorch3d from source.

Fixes # (issue)

NV bug 6115836

## 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
-->
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from a6cd73e to 2c619fe Compare May 7, 2026 08:44
r-schmitt and others added 12 commits May 7, 2026 11:53
# Description

the camera config was importing `isaaclab_physx.renderers` because the
default render_cfg was set to that config. this PR sets that to
RendererConfig to remove the import, but provides a
get_default_render_config method to the backend_utils to lazily import
the config if needed. this is called __post_init__ on the camera config
to replace the generic config as soon as possible to avoid downstream
issues referencing the renderer config. this action can be moved to the
factory if downstream references are cleaned up.

## Type of change

- Refactor to remove imports in cfg class

## 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: nvsekkin <72572910+nvsekkin@users.noreply.github.com>
…ields (isaac-sim#5275)

# Description

Splits IsaacLab's USD-physics cfg classes into solver-common base
classes and backend-specific subclasses, and refactors the writers
(`modify_*_properties`, `spawn_rigid_body_material`) so that schema
application is data-driven rather than hard-coded per-class. Prepares
the schema layer for multi-backend support (PhysX today, Newton/Mjc
next) without polluting base classes with silently-ignored fields or
stamping backend-specific schemas onto prims that didn't opt in.

## Architecture

Two layered concepts:

1. **Per-declaring-class routing.** Each cfg field's USD namespace is
determined by the class that declares it (walking the MRO). Base-class
fields write under `physics:*`; subclass fields write under their own
namespace (`physxRigidBody:*`, etc.). When a
`PhysxRigidBodyPropertiesCfg` instance is written, base fields still go
under `physics:*` because `_usd_namespace` is read from the declaring
class via `__dict__`, not via `getattr` (which would hit the subclass
override).
2. **Per-field exceptions.** Some "universal physics" fields have no USD
path except through a backend-namespaced attribute today (e.g.,
`disable_gravity` only exists at `physxRigidBody:disableGravity`). These
are declared as `_usd_field_exceptions = {applied_schema: (namespace,
[fields...])}` on the base class; the writer applies the exception
schema only when one of the listed fields is non-None.

The single helper `_apply_namespaced_schemas(prim, cfg, cfg_dict)` in
`schemas.py` does both passes for every writer (rigid body, collision,
articulation root, joint drive, mesh collision, rigid-body material).

## Design constraints

**One cfg class per spawner slot.** Spawners (`UsdFileCfg`,
`MeshCuboidCfg`, etc.) carry a single field for each property group:
`rigid_props: RigidBodyBaseCfg | None`, `collision_props:
CollisionBaseCfg | None`, `joint_drive_props: JointDriveBaseCfg | None`,
etc. The user cannot pass two cfgs into the same slot, so the cfg class
hierarchy must be **single-rooted per spawner field** — one base class
per group, with backend-specific subclasses below.

This rules out a "PhysX cfg sits next to a Newton cfg as siblings"
design and drives several placement decisions:

| Constraint | Consequence |
|---|---|
| Universal-physics fields must be reachable from any backend's cfg |
Goes on the **base** class, not a sibling backend cfg. Users on
Newton-only deployments can use `RigidBodyBaseCfg(disable_gravity=True)`
without importing `isaaclab_physx`. |
| A PhysX-namespaced field whose semantics are universal (e.g.,
`disable_gravity`) | Lives on the base but routes to the PhysX namespace
via `_usd_field_exceptions`. The base stays backend-clean; the writer
dispatches the PhysX write only when the field is non-None. |
| Writer logic must not branch on cfg subclass | Every writer is the
same code path regardless of subclass. The cfg metadata
(`_usd_namespace`, `_usd_applied_schema`, `_usd_field_exceptions`)
drives behavior; the writer is a pure data interpreter. |
| Adding a new backend (Newton, Mjc) | Requires a new subclass with its
own `_usd_namespace` / `_usd_applied_schema`. No spawner-side changes,
no writer-side changes, no base-cfg-side changes. |
| A field has multiple USD paths today (one PhysX-namespaced, one
Newton-namespaced) | Belongs on the **PhysX subclass**, not the base. A
future `NewtonArticulationRootPropertiesCfg` will own the same
conceptual field on the Newton side. ("Rule 2" — e.g.,
`enabled_self_collisions`.) |
| A field has only one USD path today, namespaced under PhysX, but the
conceptual quantity is universal | Belongs on the **base** with an
`_usd_field_exceptions` entry. ("Rule 1" — e.g., `disable_gravity`,
`articulation_enabled`, `contact_offset`, `rest_offset`,
`max_joint_velocity`.) When Newton ships its own native attribute, the
exception namespace switches transparently with no API change. |

## Field placement

### Base (solver-common) classes — `physics:*` namespace via
`UsdPhysics.*API`

| Cfg class | Field | USD attribute |
|---|---|---|
| `RigidBodyBaseCfg` | `rigid_body_enabled` | `physics:rigidBodyEnabled`
|
| `RigidBodyBaseCfg` | `kinematic_enabled` | `physics:kinematicEnabled`
|
| `CollisionBaseCfg` | `collision_enabled` | `physics:collisionEnabled`
|
| `MassPropertiesCfg` | `mass` | `physics:mass` |
| `MassPropertiesCfg` | `density` | `physics:density` |
| `RigidBodyMaterialBaseCfg` | `static_friction` |
`physics:staticFriction` |
| `RigidBodyMaterialBaseCfg` | `dynamic_friction` |
`physics:dynamicFriction` |
| `RigidBodyMaterialBaseCfg` | `restitution` | `physics:restitution` |
| `JointDriveBaseCfg` | `drive_type` | `drive:<axis>:physics:type` |
| `JointDriveBaseCfg` | `max_force` | `drive:<axis>:physics:maxForce` |
| `JointDriveBaseCfg` | `stiffness` | `drive:<axis>:physics:stiffness` |
| `JointDriveBaseCfg` | `damping` | `drive:<axis>:physics:damping` |
| `MeshCollisionBaseCfg` | `mesh_approximation_name` |
`physics:approximation` (token) |
| `ArticulationRootBaseCfg` | `fix_root_link` | (synthesizes
`UsdPhysics.FixedJoint`) |

`JointDriveBaseCfg` and `MeshCollisionBaseCfg` use the typed
`UsdPhysics.DriveAPI` / `UsdPhysics.MeshCollisionAPI` accessors at the
writer level (multi-instance namespace and `TfToken` with
`allowedTokens`, respectively); all other base fields flow through the
helper's per-class routing.

### PhysX subclasses — `physx*:*` namespaces, `Physx*API` schemas

| Cfg class | `_usd_namespace` | `_usd_applied_schema` | Adds fields |
|---|---|---|---|
| `PhysxRigidBodyPropertiesCfg` | `physxRigidBody` | `PhysxRigidBodyAPI`
| `linear_damping`, `angular_damping`, `max_linear_velocity`,
`max_angular_velocity`, `max_depenetration_velocity`,
`max_contact_impulse`, `enable_gyroscopic_forces`,
`retain_accelerations`, solver iter counts, sleep / stabilization
thresholds |
| `PhysxCollisionPropertiesCfg` | `physxCollision` | `PhysxCollisionAPI`
| `torsional_patch_radius`, `min_torsional_patch_radius` |
| `PhysxArticulationRootPropertiesCfg` | `physxArticulation` |
`PhysxArticulationAPI` | `enabled_self_collisions`, solver iter counts,
sleep / stabilization thresholds |
| `PhysxJointDrivePropertiesCfg` | `physxJoint` | `PhysxJointAPI` |
(currently empty; reserved for future PhysX-only knobs) |
| `PhysxRigidBodyMaterialCfg` | `physxMaterial` | `PhysxMaterialAPI` |
`compliant_contact_stiffness`, `compliant_contact_damping`,
`friction_combine_mode`, `restitution_combine_mode` |
| `PhysxConvexHullPropertiesCfg` | `physxConvexHullCollision` |
`PhysxConvexHullCollisionAPI` | `hull_vertex_limit`, `min_thickness` |
| `PhysxConvexDecompositionPropertiesCfg` |
`physxConvexDecompositionCollision` |
`PhysxConvexDecompositionCollisionAPI` | hull / voxel / shrink-wrap
tunables |
| `PhysxTriangleMeshPropertiesCfg` | `physxTriangleMeshCollision` |
`PhysxTriangleMeshCollisionAPI` | `weld_tolerance` |
| `PhysxTriangleMeshSimplificationPropertiesCfg` |
`physxTriangleMeshSimplificationCollision` |
`PhysxTriangleMeshSimplificationCollisionAPI` | `simplification_metric`,
`weld_tolerance` |
| `PhysxSDFMeshPropertiesCfg` | `physxSDFMeshCollision` |
`PhysxSDFMeshCollisionAPI` | `sdf_margin`, `sdf_narrow_band_thickness`,
`sdf_resolution`, etc. |

### `_usd_field_exceptions` table

These fields are declared on a *base* class but the only USD path today
goes through a non-base namespace. Each entry says: "if any listed field
on this cfg is non-None, apply the exception schema and write that one
attribute under the exception namespace." All other fields on the cfg
follow the per-declaring-class routing rule.

| Base cfg class | Exception schema | Namespace | Field(s) | Why on the
base |
|---|---|---|---|---|
| `RigidBodyBaseCfg` | `PhysxRigidBodyAPI` | `physxRigidBody` |
`disable_gravity` | Per-body gravity exclusion is universal physics;
PhysX honors per-body, Newton consumes the same attribute via the bridge
resolver (scene-level today; per-body fix is a Newton-side kernel
change, not a cfg-API change) |
| `CollisionBaseCfg` | `PhysxCollisionAPI` | `physxCollision` |
`contact_offset`, `rest_offset` | Collision-pair generation distance and
rest gap are universal physics; Newton importer consumes both via PhysX
bridge to populate `Model.shape_collision_radius` / `_thickness`
(`import_usd.py:2104, 2111`) |
| `ArticulationRootBaseCfg` | `PhysxArticulationAPI` |
`physxArticulation` | `articulation_enabled` | PhysX honors at sim time;
IsaacLab Newton wrapper reads it as a spawn-time guard at
`rigid_object.py:1035`. Universal user-facing intent |
| `JointDriveBaseCfg` | `PhysxJointAPI` | `physxJoint` |
`max_joint_velocity` | Sole USD path to `Model.joint_velocity_limit` in
Newton (no `newton:*` equivalent today). The exception namespace
switches transparently when Newton ships `newton:maxJointVelocity` as a
registered applied API |

When any exception field is non-None, the corresponding `Physx*API`
schema is applied to the prim. When all exception fields are None, no
PhysX schema is stamped — Newton-targeted prims authored from `*BaseCfg`
stay free of PhysX schemas they didn't opt in to.

## Field renames (with deprecation aliases)

To enforce the convention that python `snake_case` cfg field names map
identity-style to USD `camelCase` attribute names, two legacy fields
were renamed. Both keep the old name as a deprecation alias forwarded
via `__post_init__` (emits `DeprecationWarning`, scheduled for removal
in 5.0).

| Old name | New name | USD attribute |
|---|---|---|
| `JointDriveBaseCfg.max_velocity` | `max_joint_velocity` |
`physxJoint:maxJointVelocity` |
| `JointDriveBaseCfg.max_effort` | `max_force` |
`drive:<axis>:physics:maxForce` |

## Type of change

- New feature (non-breaking change which adds functionality)
- Breaking change (existing functionality will not work without user
modification)

The split is non-breaking at the spawner-cfg level — every base-class
type accepts any subclass via polymorphism, and every legacy
`RigidBodyPropertiesCfg` / `JointDrivePropertiesCfg` /
`CollisionPropertiesCfg` / `ArticulationRootPropertiesCfg` /
`MeshCollisionPropertiesCfg` / `RigidBodyMaterialCfg` /
`FixedTendonPropertiesCfg` / `SpatialTendonPropertiesCfg` import path
continues to work via deprecation-alias subclasses and `__getattr__`
shims on `isaaclab.sim`, `isaaclab.sim.schemas`, and
`isaaclab.sim.schemas.schemas_cfg`. Direct attribute access to the
renamed fields still works through deprecation aliases. Removal
scheduled for 5.0.

The breaking aspect: cfg classes in `isaaclab_physx.sim.schemas` and
`isaaclab_physx.sim.spawners.materials` are physically relocated. Anyone
importing from internal paths (rather than `isaaclab.sim`) needs to
update.

## Migration

```python
# Before
import isaaclab.sim as sim_utils
rigid_props = sim_utils.RigidBodyPropertiesCfg(disable_gravity=True, linear_damping=0.1)
joint_props = sim_utils.JointDrivePropertiesCfg(max_effort=80.0, max_velocity=5.0)
collision_props = sim_utils.CollisionPropertiesCfg(contact_offset=0.02, torsional_patch_radius=1.0)
material = sim_utils.RigidBodyMaterialCfg(static_friction=0.7, compliant_contact_stiffness=1000.0)

# After (PhysX-targeted)
import isaaclab.sim as sim_utils
from isaaclab_physx.sim.schemas import (
    PhysxRigidBodyPropertiesCfg,
    PhysxJointDrivePropertiesCfg,
    PhysxCollisionPropertiesCfg,
)
from isaaclab_physx.sim.spawners.materials import PhysxRigidBodyMaterialCfg

rigid_props = PhysxRigidBodyPropertiesCfg(disable_gravity=True, linear_damping=0.1)
joint_props = PhysxJointDrivePropertiesCfg(max_force=80.0, max_joint_velocity=5.0)
collision_props = PhysxCollisionPropertiesCfg(contact_offset=0.02, torsional_patch_radius=1.0)
material = PhysxRigidBodyMaterialCfg(static_friction=0.7, compliant_contact_stiffness=1000.0)

# After (Newton-targeted — base classes only, no PhysX schemas applied)
from isaaclab.sim.schemas import RigidBodyBaseCfg, JointDriveBaseCfg, CollisionBaseCfg
from isaaclab.sim.spawners.materials import RigidBodyMaterialBaseCfg

rigid_props = RigidBodyBaseCfg(disable_gravity=True)  # only base + exception fields available
joint_props = JointDriveBaseCfg(max_force=80.0, max_joint_velocity=5.0)
material = RigidBodyMaterialBaseCfg(static_friction=0.7)
```

Spawner type annotations remain unchanged — they accept any subclass via
polymorphism.

## Internal helper

```python
def _apply_namespaced_schemas(prim, cfg, cfg_dict):
    # 1. Per-field exceptions: pop listed fields, apply exception schema if any non-None,
    #    write under exception namespace.
    # 2. Per-declaring-class routing: walk MRO to find each remaining field's owner class;
    #    write under that class's _usd_namespace; apply that class's _usd_applied_schema.
```

Used by all five `modify_*_properties` writers and
`spawn_rigid_body_material`. Replaced ~125 lines of duplicated gating
logic with a single ~30-line helper.

## Side change: configclass

`source/isaaclab/isaaclab/utils/configclass.py:_process_mutable_types`
now detects string-form `ClassVar` annotations under PEP 563 (`from
__future__ import annotations`) so it doesn't wrap `ClassVar[dict]`
defaults in `field(default_factory=...)`. Matches Python stdlib
`dataclasses` semantics. No pre-existing IsaacLab class used `ClassVar`
inside a `@configclass` block, so the change has no effect on existing
code; it enables the `ClassVar` metadata pattern this PR introduces.

## Test plan

- [x] `test_schemas.py` (38 → 40 tests): all schema-cfg classes write
correct attributes under the right namespace; PhysX schemas are NOT
applied when only base/UsdPhysics fields are set; deprecation aliases
(`max_velocity` → `max_joint_velocity`, `max_effort` → `max_force`)
forward correctly and emit `DeprecationWarning`. **40 passed.**
- [x] `test_schemas_shim.py`: legacy import paths
(`isaaclab.sim.schemas.RigidBodyPropertiesCfg` etc.) resolve via
`__getattr__` shims. **All passing.**
- [x] `test_articulation.py`, `test_rigid_object_iface.py`,
`test_valid_configs.py`, `test_spawn_*` — no regressions.
- [x] Full suite (`./isaaclab.sh -t`): 8768/9205 pass, 437 unrelated
baseline failures (rendering, `omni.physics.tensors.api` missing, OSC
controller, `install_ci`, `pyglet`, Newton env-path, Anymal-C
determinism). Zero new regressions; +123 passing tests vs. earlier
state.
- [x] `./isaaclab.sh -f` (pre-commit) clean.

## Supersedes

Together with isaac-sim#5276, supersedes isaac-sim#4847 and isaac-sim#5203 with a cleaner
schema-layer design.

## 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 (changelog
fragments under `source/isaaclab/changelog.d/`)
- [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 (fragment-based system) 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: ooctipus <zhengyuz@nvidia.com>
…c-sim#5301)

Updates docs for using nurec background in locomanipulation sdg

## 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)
- [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>
Bumped packages:
- isaaclab: 4.6.28 → 4.7.0
- isaaclab_newton: 0.5.26 → 0.6.0
- isaaclab_ov: 0.1.3 → 0.1.4
- isaaclab_ovphysx: 0.1.2 → 0.1.3
- isaaclab_physx: 0.5.29 → 0.6.0
- isaaclab_rl: 0.5.1 → 0.5.2
- isaaclab_tasks: 1.5.34 → 1.5.35
- isaaclab_teleop: 0.3.9 → 0.3.10
## Summary

Bumps the Newton pin to
[`v1.2.0rc2`](https://pypi.org/project/newton/1.2.0rc2/), which pulls in
IsaacLab-relevant fixes plus the upstream tendon-scoping fix.

## What's new in Newton v1.2.0rc2 vs IsaacLab's current pin (`a27277e`)

The current IsaacLab Newton pin is from late April; v1.2.0rc2 is the
latest release-candidate cut. Notable fixes pulled in:

-
**[newton-physics/newton#2659](newton-physics/newton#2659
\"Scope USD custom-frequency parsing\" — `parse_usd` now scopes the
custom-frequency walk to `root_path` natively.
-
**[newton-physics/newton#2678](newton-physics/newton#2678
Regression fix.
-
**[newton-physics/newton#2720](newton-physics/newton#2720
`SolverKamino` reset under `world_mask`.
-
**[newton-physics/newton#2710](newton-physics/newton#2710
VRAM leak fix on example reset.
- Plus 16 other smaller fixes between rc1 and rc2.

## Required dep bumps

Newton 1.2.0rc2's \`pyproject.toml\` requires:

- \`warp-lang==1.13.0\`
- \`mujoco==3.8.0\` (was 3.6.0)
- \`mujoco-warp==3.8.0.1\` (was 3.6.0)

Pins updated in:

| File | Change |
|---|---|
| \`source/isaaclab/setup.py\` | \`warp-lang==1.12.0\` → \`==1.13.0\`;
\`mujoco==3.6.0\` → \`==3.8.0\`; \`mujoco-warp==3.6.0\` → \`==3.8.0.1\`
|
| \`source/isaaclab_newton/setup.py\` | mujoco / mujoco-warp bumps;
Newton pin → \`v1.2.0rc2\` |
| \`source/isaaclab_visualizers/setup.py\` | 3× Newton pin →
\`v1.2.0rc2\` |
| \`tools/wheel_builder/res/python_packages.toml\` | All four pins
mirrored |

## Code adapts

\`warp-lang\` 1.13 removed the \`wp.math\` namespace. Two IsaacLab call
sites use it:

-
\`source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py:72\`
-
\`source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer_kernels.py:330\`

Both rewritten as \`wp.math.transform_to_matrix(...)\` →
\`wp.transform_to_matrix(...)\`. That's the only IsaacLab-side adapt
needed.

## Test plan

- [x] \`./isaaclab.sh -i newton\` clean install against the bumped pins.
- [x] \`pip list\` confirms \`newton 1.2.0rc2\`, \`warp-lang 1.13.0\`,
\`mujoco 3.8.0\`, \`mujoco-warp 3.8.0.1\`.
- [x] Sanity smoke: Shadow-Hand-Over MAPPO (4 envs, 1 iter) runs clean —
simulation init through CUDA graph capture through one training step +
checkpoint save, no errors.
- [x] Pre-commit clean.

## Caveat

Smoke covered Shadow-Hand-Over MAPPO. Other envs with different sensors
/ renderers / collision setups could surface warp 1.13 or mujoco 3.8
differences the smoke didn't exercise; full PR CI catches them.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Bumped packages:
- isaaclab: 4.7.0 → 4.8.0
- isaaclab_mimic: 1.2.5 → 1.2.6
- isaaclab_newton: 0.6.0 → 0.7.0
- isaaclab_ov: 0.1.4 → 0.1.5
- isaaclab_physx: 0.6.0 → 0.6.1
# Description

Clarifies the articulation joint friction API docs across the base,
PhysX, and Newton implementations.

The base API now warns that joint friction semantics are
backend-specific. The PhysX docs distinguish legacy
unitless coefficients from PhysX 5 static/dynamic friction efforts and
viscous coefficients. The Newton docs now
identify joint friction as an absolute force/torque value and include an
MJWarp example mapping the value to
MuJoCo Warp's `dof_frictionloss`.

Fixes isaac-sim/IsaacLab-Internal#875

## Type of change

- Documentation update

## Screenshots

Not applicable.

## Checklist

- [ ] 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 (not applicable: docs-only change)
- [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

Reduce higher-level dependency on packed state tensors in targeted
IsaacLab call sites without changing existing task observation keys.

This PR:
- changes Pink IK to read `body_link_pose_w` directly instead of slicing
`body_link_state_w`;
- changes Dexsuite orientation rewards to use `root_link_quat_w`
directly instead of slicing `root_state_w`;
- adds explicit pick-place helpers for robot link pose and velocity;
- keeps `get_all_robot_link_state()` available for compatibility, but
marks it deprecated for removal in IsaacLab 4.0;
- keeps existing `robot_links_state` task config entries unchanged.

Fixes # (issue)

## Type of change

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

## Screenshots

N/A

## Test Plan

- `./isaaclab.sh -p -m py_compile
source/isaaclab/isaaclab/envs/mdp/__init__.pyi
source/isaaclab/isaaclab/envs/mdp/actions/pink_task_space_actions.py
source/isaaclab/isaaclab/envs/mdp/observations.py
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/mdp/__init__.pyi
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/mdp/observations.py
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/dexsuite/mdp/rewards.py`
- `./isaaclab.sh -f`
- `git diff --check origin/develop..HEAD`
- `rg -n "body_link_state_w|root_state_w"
source/isaaclab/isaaclab/envs/mdp/actions/pink_task_space_actions.py
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/mdp/observations.py
source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/dexsuite/mdp/rewards.py`
(no matches)
- Existing/new MDP pytest not run locally. Per review, new MDP tests
were removed and should be added in a separate PR. Local pytest
collection is also blocked in this worktree because `./isaaclab.sh -p`
selects `/usr/bin/python3.12` without `torch`.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] 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

Notes:
- The unchecked warning item is intentional: this PR adds a
`DeprecationWarning` to `get_all_robot_link_state()` so users can
migrate before IsaacLab 4.0.
- The unchecked test item follows review feedback: MDP tests should be
added in a separate PR.
## Summary
- Updated PhysX and Newton backend tests to use the current root-state,
joint-state, contact-sensor, and wrench-composer API names.
- Updated the Newton contact sensor adapter to use the current
SensorContact constructor and force/metadata fields.
- Bumped matching PhysX and Newton extension changelog/version files.

## Test Plan
- [x] ./isaaclab.sh -p -m py_compile
source/isaaclab_physx/test/sensors/test_frame_transformer.py
source/isaaclab_newton/test/sensors/test_frame_transformer.py
source/isaaclab_physx/test/sensors/test_contact_sensor.py
source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py
source/isaaclab_newton/isaaclab_newton/sensors/contact_sensor/contact_sensor.py
source/isaaclab_newton/isaaclab_newton/sensors/contact_sensor/contact_sensor_kernels.py
- [x] ./isaaclab.sh -f
- [x] Focused deprecation scan: 118 matches on origin/develop, 0 matches
on this branch
- [ ] Targeted GPU pytest on NvidiaWorkstation-WiFi: attempted in
isaac-lab-base-pr5304:latest, but the PhysX container timed out after
3600s during pytest collection before tests ran
## Summary
- Migrates core test and MDP callers off deprecated state/read/write
helper APIs.
- Updates the test_pose_inv tensor-to-NumPy conversion for NumPy 2.0.
- Bumps the isaaclab changelog/version because core MDP source changed.

## Verification
- ./isaaclab.sh -f
- Scoped deprecated-call-site search: assigned core matches removed.

Rebased onto develop after PR isaac-sim#5304 merged.
# Description

Adds the missing core-concepts sensor documentation for the ground-truth
PVA
sensor and joint wrench sensor. The sensor overview now links both
pages, the
public `isaaclab.sensors` API page includes `Pva`, `PvaData`, and
`PvaCfg`, and
the sensor module table documents the joint wrench sensor prim-path
expectation.

Fixes isaac-sim/IsaacLab-Internal#880

Validation:

- `./isaaclab.sh -f`
- `git diff --check`
- Verified `origin/develop` did not list `pva` or `joint_wrench_sensor`
from
`docs/source/overview/core-concepts/sensors/index.rst`, and this branch
does.
- Parsed the two new RST pages with `docutils` using local stubs for
  Sphinx-only directives and roles.
- `make -C docs current-docs` was attempted locally but could not run
because
  `sphinx-build` is not installed in this environment.

## Type of change

- Documentation update

## Screenshots

N/A; documentation text update.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [ ] 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
isaac-sim#5538)

## Summary

Two unrelated CI breakages on develop, bundled here so develop turns
green in one PR.

### 1. Skip the failing viewergl test

`test_cartpole_newton_visualizer_viewergl_rgb_motion[physx,newton]`
started returning all-black frames on develop after
`nvcr.io/nvidian/isaac-sim:latest-develop` flipped to a Kit 110.1.1 +
USD 25.11 base. The failure has been deterministic across multiple PRs
(isaac-sim#5523, isaac-sim#5495, isaac-sim#5408, …).

Investigation so far has ruled out:
- PR isaac-sim#5521 (revert in
isaac-sim#5539 still failed)
- Newton 1.0 → 1.2.0rc2 viewer code regression (only 7-line addition;
ViewerGL alone yields 1.08M nonzero pixels)
- warp 1.12 → 1.13 RegisteredGLBuffer ABI (byte-identical)
- Module-load side effects of `isaaclab_physx.renderers`
- CUDA-GL interop (PR isaac-sim#5540 diagnostic confirms direct CPU FBO readback
also returns zeros, with `GL_NO_ERROR`)
- GL context-currency (PR isaac-sim#5541 H6 attempt: still fails)
- GL/CUDA sync (PR isaac-sim#5542 H4 attempt: still fails)

Diagnostic output (PR isaac-sim#5540 v2):
```
[VIZDIAG] fbo=c_uint(8)  pbo=None  size=600x600
[VIZDIAG] glGetError before: GL_NO_ERROR
[VIZDIAG] CPU-readback: nonzero=0/1080000  max=0  err=GL_NO_ERROR
[VIZDIAG] PBO-result: nonzero=0/1080000  max=0
```

The FBO itself is empty — Newton's pyglet/EGL renderer is not depositing
pixels under Kit 110.1.1, even though `tiled_camera_rgb_non_black` (Kit
RTX path) on the same env passes. Underlying root cause still being
chased; this PR ships the skip to unblock develop.

### 2. Fix warp intersphinx 404 in docs build

`https://nvidia.github.io/warp/objects.inv` started returning 404 —
Warp's `objects.inv` only lives at `/stable/` and `/latest/` now. With
Sphinx's `warnings_treated_as_errors`, the broken intersphinx fetch
fails the docs build on every PR. Pinning to `/stable/` (matches the
existing PyTorch `/docs/2.11/` workaround pattern in the same file).

Verified `https://nvidia.github.io/warp/stable/objects.inv` returns 200.

## Test plan

- [x] CI `isaaclab_visualizers` on this branch — was passing earlier
with the skip; will re-verify with the bundled docs fix
- [ ] CI `Build Latest Docs` on this branch — must turn green (was
failing on every recent PR before this fix)

## Re-enable plan

Once the underlying viewergl bug is identified and fixed, drop the
`@pytest.mark.skip` decorator and remove the
`jichuanh-disable-viewergl-flaky.skip` fragment.
mingxueg-nv and others added 29 commits May 15, 2026 11:50
# Description
Fixed rlinf install docs to run RLinf RL posting training

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

<!--
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
-->
…ual environments (isaac-sim#5623)

# Description

This PR refactors the reinforcement learning train/play scripts into
unified entry points while preserving the existing library folder
structure and adding a lightweight `uv` workflow for fresh source
checkouts.

The main changes are:

- Added unified RL entrypoints:
  - `scripts/reinforcement_learning/train.py --library <library>`
  - `scripts/reinforcement_learning/play.py --library <library>`
- Added library-specific implementation files under the existing library
folders, for example:
  - `scripts/reinforcement_learning/rsl_rl/train_rsl_rl.py`
  - `scripts/reinforcement_learning/rsl_rl/play_rsl_rl.py`
- Kept the old per-library `train.py` and `play.py` scripts intact, with
deprecation warnings and migration examples.
- Added shared RL entrypoint utilities in
`scripts/reinforcement_learning/common.py`.
- Added direct Isaac Lab CLI commands:
  - `./isaaclab.sh train --library <library> ...`
  - `./isaaclab.sh play --library <library> ...`
- Kept bare script aliases for `./isaaclab.sh -p train.py ...` and
`./isaaclab.sh -p play.py ...`.
- Added Python package entry points so installed environments can run:
  - `train --library <library> ...`
  - `play --library <library> ...`
- Added a root source-checkout `pyproject.toml` project so a fresh clone
can run kitless Newton training with:
- `uv run train --library rsl_rl --task Isaac-Cartpole-Direct-v0
presets=newton_mjwarp --num_envs 4096`
- Pinned the source-checkout `uv` environment to the same PyTorch family
used by the Isaac Lab installer to avoid CUDA stack churn when users
switch between `uv run` and `./isaaclab.sh`.
- Updated docs, tests, tools, and pretrained checkpoint helpers to use
the unified train/play entrypoints.
- Fixed CLI Python discovery so `./isaaclab.sh` prefers an active or
repo-local virtual environment before falling back to system Python.
- Fixed `./isaaclab.sh --install` in uv-created virtual environments
that do not include the `pip` module by using `uv pip` for venv-targeted
pip operations.

Motivation:

The previous RL scripts duplicated substantial train/play setup logic
across libraries. This made behavior harder to keep consistent and
increased maintenance cost when updating shared functionality. The new
structure keeps library-specific logic in each library folder while
centralizing shared dispatch and common helpers.

The `uv` workflow gives users a fast path from a fresh clone to kitless
Newton training without manually creating an environment first. Isaac
Sim / Kit workflows, including PhysX, continue to use the existing full
installation path.

Dependencies:

No new required runtime dependencies are added to Isaac Lab packages.
The root source-checkout `pyproject.toml` describes the local
development environment used by `uv run`.

Fixes # N/A

## Type of change

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

## Screenshots

Not applicable.

## Validation

Ran:

- `uv lock`
- `uv lock --check`
- `uv run --frozen train --help`
- `./isaaclab.sh --install`
- `./isaaclab.sh -p -m pytest source/isaaclab/test/cli/test_install.py
-q`
- `./isaaclab.sh -p -m pytest
source/isaaclab/test/cli/test_install.py::TestGetPipCommand
source/isaaclab/test/cli/test_install.py::TestExtractPythonExe -q`
- Help smoke tests for unified train/play entrypoints and `./isaaclab.sh
-p train.py --help` / `./isaaclab.sh -p play.py --help`


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

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…ac-sim#5523) (isaac-sim#5433)

## Summary

Extends `_rename_builder_labels` in
`isaaclab_newton.cloner.newton_replicate` so that every label-bearing
column on the merged Newton `ModelBuilder` is rewritten to per-env USD
paths after replication. Previously, only the built-in
body/joint/shape/articulation columns were rewritten; tendon labels (and
any other string-typed custom-attribute column) kept the source proto
path on every replicated environment.

## Stack / dependencies

- **Depends on isaac-sim#5523** (\"[Newton] Bump Newton pin to v1.2.0rc2\").
After isaac-sim#5523 lands, this PR rebases cleanly on develop.

The Newton 1.2 release
([newton-physics/newton#2659](newton-physics/newton#2659))
also includes the upstream tendon-scoping fix that obsoletes the
IsaacLab-side \`_scope_custom_frequencies\` workaround a previous
version of this PR carried — that workaround has been removed in favor
of relying on the Newton bump in isaac-sim#5523.

## Why the rename is needed

Newton's \`add_builder\` copies each proto's bodies, joints, shapes,
articulations, etc. into the merged builder verbatim, and tags each row
with a \`*_world\` integer column to track env identity. Labels (path
strings) are copied as-is. So after cloning N environments from one
proto, the merged builder has N copies of every row, all with the **same
proto-path string label**, distinguished only by the integer \`*_world\`
column.

IsaacLab keys most of its data flow off **USD prim paths** (sensor
binding, event-term scope, visualization, logging). It needs labels to
be unique per-env paths so a body called
\`/World/envs/env_3/Robot/Forearm\` is reachable by path lookup. The
rename function is the bridge: it walks every label-bearing column
post-replication and rewrites the source-root prefix to the per-env
destination root using each row's \`*_world\` value.

Until this PR, the rename only walked **5 built-in label arrays**.
Tendon labels and any string-typed custom-attribute column were missed,
so e.g. \`mujoco:tendon_label\` showed \`/World/envs/env_0/...\` for
every env — surfaced on Shadow Hand fixed tendons.

## What this PR changes

### \`_rename_builder_labels\` extension

* **Pass 1 (built-in label arrays)** — extended from 5 to 6 entity
types: \`body\`, \`joint\`, \`shape\`, \`articulation\`,
\`constraint_mimic\`, **\`equality_constraint\`** (the latter was
missing — would have surfaced for any env using \`MjcEquality\`
constraints, currently none).
* **Pass 2 (string custom-attribute columns)** — new. Walks every
registered custom attribute, finds string-typed columns whose frequency
has a \`references=\"world\"\` companion column, and applies the same
prefix rewrite. Any future solver-registered string column at such a
frequency is handled automatically without changes here.
* **Path-separator boundary** on the prefix match:
\`startswith(src_path.rstrip(\"/\") + \"/\")\`. Prevents source paths
that are string prefixes of one another (\`/Sources/protoA\` vs
\`/Sources/protoAB\`) from cross-contaminating when both feed the same
envs.
* **Hard error on length mismatch**: raises \`ValueError\` if the
parallel \`(labels, worlds)\` arrays differ in length, instead of
silently truncating. By contract Newton's \`add_builder\` keeps them in
lockstep.

### Tests

New \`source/isaaclab_newton/test/cloner/test_rename_builder_labels.py\`
with 10 cases covering:

- Both passes with built-ins and \`mujoco:tendon_label\` rewrite
correctly per world.
- Cross-pass consistency: every renamed label lives under the per-env
root.
- Guards: non-path strings pass through untouched; rows whose world id
is not in \`env_ids\` keep their original label.
- \`test_sparse_env_ids\` — non-contiguous env ids \`[10, 20, 30]\`.
- \`TestRenamePass2Generality\` — multiple coexisting custom
frequencies, multiple string columns at one frequency,
registered-but-empty string column.
-
\`TestRenameMultiSource::test_prefix_overlap_does_not_cross_contaminate\`
— explicit regression for the \`/Sources/protoA\` vs
\`/Sources/protoAB\` boundary fix; both sources feed the same envs so
the world-id guard cannot mask the boundary bug. Fails without the fix;
passes with it.

## Test plan

- [x] All 10 unit tests pass.
- [x] \`./isaaclab.sh -f\` clean (pre-commit hooks).
- [x] Verified the boundary-prefix regression test fails when the
boundary terminator is removed and passes when it's restored.
- [x] Smoke (Shadow-Hand-Over MAPPO 4 envs / iter 1) shows tendon labels
go from \`/World/envs/env_0/.../T_FFJ\` (every env) to
\`/World/envs/env_<wid>/.../T_FFJ\` (per-env paths) after the rename.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
…c-sim#5394)

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

In Isaac Sim, we have added more capabilities to handle joint presets,
fixed joints, and other properties to the importers, so we can simplify
the isaac lab importer workflow.

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 <kellyg@nvidia.com>
…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]` |
Remove _fabric_supported_devices allowlist and the device fallback check.
USDRT SelectPrims supports any CUDA device index, so Fabric acceleration
now runs on cuda:0, cuda:1, etc. This unblocks distributed training where
each rank is pinned to a non-primary GPU.

- Remove _fabric_supported_devices constant and device check in __init__
- Remove assertion in _initialize_fabric
- Update docstrings for multi-GPU support
- Add cuda:1 test cases (skipped on single-GPU runners)
- Add sys.argv strip to prevent Kit segfault from pytest flags
- Add dedicated multi-GPU CI workflow
@pv-nvidia pv-nvidia force-pushed the feat/frame-view-enable-mgpu branch from 1c2e02d to 8de9a39 Compare May 17, 2026 22:23
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.