Skip to content

Implement Fabric-aware get/set_local_poses via indexedfabricarray#2

Open
pv-nvidia wants to merge 50 commits into
fix/fabric-prepare-for-reusefrom
pv/5381-rebased
Open

Implement Fabric-aware get/set_local_poses via indexedfabricarray#2
pv-nvidia wants to merge 50 commits into
fix/fabric-prepare-for-reusefrom
pv/5381-rebased

Conversation

@pv-nvidia
Copy link
Copy Markdown
Owner

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

Description

Replaces isaac-sim#5381

Adopts the prototype design from bareya/pbarejko/camera-update: all transform reads and writes go through wp.indexedfabricarray, the view→fabric mapping is path-based (no custom prim attributes), and FabricFrameView reads/writes omni:fabric:localMatrix directly.

Previously get_local_poses delegated to USD even when Fabric held the source-of-truth world matrices, so after set_world_poses() the next get_local_poses() returned stale values — the reason test_set_world_updates_local was marked xfail(strict=True). An earlier attempt fixed this by composing local = inv(parent_world) * child_world in torch using a Python-level USD parent loop, which was correct but 3× slower than USD. This PR replaces that with two Warp kernels operating on Fabric matrices via a parent indexed fabric array, eliminating the Python bottleneck.

Implementation summary

  • Three persistent PrimSelection instances (trans_ro, world_rw, local_rw) differing only in per-attribute access mode.
  • Path-based view→fabric index mapping computed from selection.GetPaths(); no isaaclab:view_index:HASH prim attributes written anywhere.
  • wp.indexedfabricarray everywhere: kernels dereference ifa[view_index] instead of taking a separate mapping argument.
  • Stage-level IFabricHierarchy cache + dirty-stages set: multiple FabricFrameView instances on the same stage share one hierarchy lookup.
  • Symmetric local↔world propagation via Warp kernels: set_local_poses marks the stage dirty; the next world read fires child_world = parent * child_local per child. Mirror kernel runs after set_world_poses to recompute child_local = inv(parent) * child_world.
  • Two new public Warp kernels in isaaclab.utils.warp.fabric: decompose_indexed_fabric_transforms and compose_indexed_fabric_transforms, plus propagation kernels update_indexed_local_matrix_from_world and update_indexed_world_matrix_from_local.

The shared contract test test_set_world_updates_local no longer needs the xfail override and passes for both cpu and cuda:0. Three additional tests cover the new paths: test_set_local_via_fabric_path, test_get_scales_fabric_path, test_prepare_for_reuse_detects_topology_change. Local run of the full fabric test suite: 41 passed, 0 failed.

Benchmark results

1024 prims, 50 iterations, NVIDIA RTX A6000.

Operation USD (ms) Fabric (ms) Speedup
Get World Poses 13.5 0.067 201×
Set World Poses 30.0 0.123 244×
Interleaved Set→Get 43.8 0.159 276×
Get Local Poses 6.1 0.064 96×
Set Local Poses 8.6 0.053 163×

Reproduce with:

./isaaclab.sh -p scripts/benchmarks/benchmark_view_comparison.py \
  --num_envs 1024 --num_iterations 50 --backends usd fabric \
  --device cuda:0 --headless

Depends on: pv-nvidia:fix/fabric-prepare-for-reuse (PR #<TBD>) — please merge that one first.

Fixes #5

Type of change

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

Checklist

• [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
• [x] I have run the [pre-commit checks](https://pre-commit.com/) with ./isaaclab.sh --format
• [x] I have made corresponding changes to the documentation
• [x] My changes generate no new warnings
• [x] I have added tests that prove my fix is effective or that my feature works

• [x] I have updated the changelog and the corresponding version in the extension's config/extension.toml file
• [x] I have added my name to the CONTRIBUTORS.md or my name already exists there

Per the fragment-based changelog system (#5434), this PR ships fragments at source/isaaclab_physx/changelog.d/fabric-frame-view-local-poses.rst and source/isaaclab/changelog.d/pv-5381-rebased.rst instead of editing CHANGELOG.rst and config/extension.toml directly — the nightly CI workflow compiles those from the fragments.

@pv-nvidia pv-nvidia changed the title Pv/5381 rebased Implement Fabric-aware get/set_local_poses via indexedfabricarray May 5, 2026
matthewtrepte and others added 6 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>
…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 isaac-sim#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 isaac-sim#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)*
…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
-->
@github-actions github-actions Bot added documentation Improvements or additions to documentation infrastructure labels May 7, 2026
r-schmitt and others added 19 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.
# Description

Replicates fk invalidation on other assets in Newton.

Fixes isaac-sim#5359

## Type of change

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

## Checklist

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
## Summary
- Migrates task/contrib camera callers from TiledCamera aliases to
Camera.
- Updates task state reads and in-hand write/target helper calls to
explicit APIs.
- Bumps task/contrib changelogs and extension versions for touched
packages.

## Verification
- ./isaaclab.sh -f
- Scoped deprecated-call-site search: concrete task/contrib deprecated
calls removed.

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

Enabled OVRTX rendering tests on CI.

`OVRTX 0.3` is not published yet, so we have to use `OVRTX 0.2` render
output as golden images. Some of them are incorrect, I will update those
images when we pin to `OVRTX 0.3`.


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

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

- Fixes OvPhysX backend compatibility with the upcoming ovphysx 0.4 API
by using `active_cuda_gpus` and explicit DirectGPU Carbonite settings
when supported, while preserving the older `gpu_index` constructor path.
- Fixes CPU-only OvPhysX tensor binding reads into GPU-backed
articulation buffers.
- Uses raw Warp buffers for OvPhysX articulation write views instead of
`ProxyArray` wrappers.
- Adds the `ovphysx` physics preset to the cartpole camera presets task.

Validation

- `./isaaclab.sh -f`
- `./isaaclab.sh -p -m pytest
source/isaaclab_ovphysx/test/assets/test_articulation_data.py
source/isaaclab_ovphysx/test/assets/test_articulation.py`
- `./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py
--task Isaac-Cartpole-Direct-v0 --num_envs 64 --max_iterations 2
--headless presets=ovphysx`
- `./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py
--task Isaac-Ant-Direct-v0 --num_envs 64 --max_iterations 2 --headless
presets=ovphysx`
- `./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py
--task Isaac-Humanoid-Direct-v0 --num_envs 64 --max_iterations 2
--headless presets=ovphysx`
- `./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py
--task=Isaac-Cartpole-Camera-Presets-Direct-v0 --num_envs=32
--max_iterations=2 --headless --enable_cameras
presets=ovphysx,ovrtx_renderer,rgb`

# Description

This PR fixes several small IsaacLab-side issues needed for the OvPhysX
backend to run the supported direct cartpole, ant, and humanoid tasks
with the upcoming ovphysx 0.4 wheel. It also enables the cartpole camera
presets task to select the `ovphysx` physics preset.

The OvPhysX manager now detects the new constructor surface and passes
explicit DirectGPU settings for GPU simulations. Older public wheels
that still use `gpu_index` keep the previous constructor path.

Fixes # (not applicable)

## Type of change

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

## Screenshots

Not applicable.

## Checklist

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

Adds a dedicated Newton experimental tutorial for using the Kamino
solver. The page explains that Kamino is selected through a Newton
physics solver preset, shows the task changes needed to add a `kamino`
preset, lists compatibility checks for assets, resets, sensors, and
renderers, and documents the Kamino-specific solver parameters by
category.

This addresses Kellys follow-up request on isaac-sim#5457 for a tutorial
describing what needs to change to work with Kamino and for descriptions
of Kamino-specific solver parameters.

Fixes # (issue)

## Type of change

- Documentation update

## Screenshots

Not applicable. Documentation-only RST change.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [ ] 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
extensions `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

Notes:
- Ran `./isaaclab.sh -f` successfully.
- Verified the `literalinclude` target and referenced labels locally.
- `./isaaclab.sh -d` could not start in this checkout because there is
no virtual environment and system Python is PEP 668 protected, so pip
refused to install docs requirements. Because Sphinx did not run, the
warning checklist item is intentionally left unchecked.
- No tests or changelog fragment were added because this is a
documentation-only follow-up under `docs/source`; the current repository
guidance uses `source/<pkg>/changelog.d` fragments only for touched
source packages.
…ty and position controllers (isaac-sim#3895)

## Description

This PR extends [3760](isaac-sim#3760)
by introducing a navigation tasks for the ARL robot. The PR adds a
confined cluttered environment, adds acceleration, velocity and position
controllers + configs, extends the MDP and RL configs and adds a
Variational Auto Encoder to generate image latents for observations. The
PR depends on the `MultiMeshRayCasterCamera` introduced in PR
[3298](isaac-sim#3298) (currently not
merged in IsaacLab).

## Changes
### Type of Change

- New feature (non-breaking change which adds functionality)
- Documentation update (added docs/comments where applicable)

### Files changed (high-level summary)

- New files added:
-
source/isaaclab_tasks/isaaclab_tasks/manager_based/drone_arl/navigation/*
(new task code and config, obstacle scene code and config)
-
source/isaaclab_tasks/isaaclab_tasks/manager_based/drone_arl/mdp/vae_model.pt
- source/isaaclab/isaaclab/controllers/lee_acceleration_control_cfg.py
   - source/isaaclab/isaaclab/controllers/lee_acceleration_control.py
   - source/isaaclab/isaaclab/controllers/lee_velocity_control_cfg.py
   - source/isaaclab/isaaclab/controllers/lee_velocity_control.py
   - source/isaaclab/isaaclab/controllers/lee_position_control_cfg.py
   - ource/isaaclab/isaaclab/controllers/lee_position_control.py
- Modified:
- source/isaaclab_tasks/isaaclab_tasks/manager_based/drone_arl/mdp/*
(added navigation specifics)
- source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py (added new
action config)
- source/isaaclab/isaaclab/envs/mdp/actions/thrust_actions.py
(introduced new navigation action handling controller application)
- Total diff (branch vs main, includes also unmerged changes of PR
[3760](isaac-sim#3760) and PR
[3298](isaac-sim#3298)): 74 files
changed, 8029 insertions, 88 deletions
 
## Dependencies

- The new drone task references standard repo-internal packages and
Isaac Sim; no external pip packages required beyond the repo standard.


## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Grzegorz Malczyk <44407007+grzemal@users.noreply.github.com>
Signed-off-by: renezurbruegg <zrene@ethz.ch>
Signed-off-by: Welf Rehberg <65718465+Zwoelf12@users.noreply.github.com>
Co-authored-by: grzemal <grzegorz.malczyk@ntnu.no>
Co-authored-by: Grzegorz Malczyk <44407007+grzemal@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: René zurbrügg <zrene@ethz.ch>
Co-authored-by: Pascal Roth <roth.pascal@outlook.de>
Co-authored-by: Pascal Roth <57946385+pascal-roth@users.noreply.github.com>
myurasov-nv and others added 9 commits May 8, 2026 12:21
# Description

Fixed bugs:

- [NVBug 6122918] - Grammar in installation docs (``these dependency``
-> ``these dependencies``; drop redundant ``guides`` after
``:ref:`how-to```).
- [NVBug 6125106] - Add an ``Environment setup`` section to the kit-less
install page so it does not jump from ``git clone`` straight to
``./isaaclab.sh --install``.
- [NVBug 6125054] - Relax ``starlette==0.49.1`` -> ``>=0.46.0,<0.50`` so
``isaaclab[isaacsim,all]==3.0.0`` resolves alongside
``isaacsim==6.0.0.0`` (transitively requires ``starlette<0.49.0``).
- [NVBug 6122885] - Bump recommended driver versions on the installation
index to the Beta2 POR (Linux ``580.95.05``, Spark ``580.142``, Windows
``581.42.00``).

## Type of change

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

## Checklist

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

---------

Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
…m#5544)

# Description

The `isaaclab.sim.spawners.from_files` module imports `fcntl`
unconditionally at module load. `fcntl` is Unix-only, so on Windows the
import fails with:

```
ModuleNotFoundError: No module named 'fcntl'
```

This breaks **any** Windows usage of the spawner — including single-GPU
runs that never take the lock path. Reproducer reported by a user
(IsaacLab `develop` @ `b258e87`, IsaacSim `6.0.0rc41`):

```
python scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --video --video_length 100 --video_interval 500 --max_iterations 5
```

`fcntl` was introduced in isaac-sim#5032 to serialize USD download/stage
composition across distributed ranks (preventing segfaults in
`Sdf_CrateFile::_MmapStream::Read` on shared cached USD files). The
intent is correct — only the implementation is Unix-only.

## Change

- Replace `fcntl.flock` with
[`filelock.FileLock`](https://pypi.org/project/filelock/), which uses
`fcntl` on POSIX and `msvcrt` on Windows.
- Use `contextlib.nullcontext` for the single-rank path so the lock file
is only created when actually needed (i.e., `LOCAL_WORLD_SIZE > 1`).
- Drop the manual `try/finally` and the `# noqa: SIM115` on the bare
`open(...)` — the `with FileLock(...)` form is exception-safe.
- Declare `filelock` in `source/isaaclab/setup.py::INSTALL_REQUIRES`. It
was previously only transitively available via `transformers` →
`huggingface_hub`; making it a direct dep so we don't depend on a
transitive chain that could change.

The lock semantics are unchanged: an exclusive advisory lock on
`<tempdir>/isaaclab_usd_spawn.lock`, held only while `LOCAL_WORLD_SIZE >
1`.

Original lock implementation: @ooctipus (isaac-sim#5032) — tagging for review
since this changes the locking primitive.

## Type of change

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

## Screenshots

N/A — import-time failure on Windows; no UI surface.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation (N/A —
internal change)
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works — the failure is `import fcntl` at module load on Windows;
a regression test would require a Windows CI runner, which IsaacLab does
not currently exercise. Locally verified the module imports and
`FileLock` resolves to `filelock._unix.UnixFileLock` on Linux (and would
resolve to `WindowsFileLock` on Windows).
- [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

articulation tests have been timing out in CI. disabling it to unblock
isaac sim MR merging until we figure out why the timeouts are happening.

## Type of change

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

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


## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

OVRTX renderer relies on Warp. In some instances, i.e. unit tests, the
ovrtx integration layer can fail with following error:

```python
        else:
            try:
                if torch_device.type == "cuda":
>                   return warp._src.context.runtime.cuda_devices[torch_device.index]
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E                   AttributeError: 'NoneType' object has no attribute 'cuda_devices'

ovphysx-ovrtx/lib/python3.12/site-packages/warp/_src/torch.py:41: AttributeError
```

This problem is because warp runtime isn't initialized, by importing
`import isaaclab.utils.warp` module we ensure warp runtime is
initialized.

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
-->
Bumped packages:
- isaaclab: 4.8.0 → 4.8.1
- isaaclab_contrib: 0.3.0 → 0.3.1
- isaaclab_newton: 0.7.0 → 0.7.1
- isaaclab_ov: 0.1.5 → 0.1.6
- isaaclab_ovphysx: 0.1.3 → 0.1.4
- isaaclab_physx: 0.6.1 → 0.6.2
- isaaclab_tasks: 1.5.35 → 1.5.36
# Description

Pink IK uses DAQP through `qpsolvers`, but the install-time dependency
repair only
verified that Pinocchio could be imported. In environments where
`pin-pink` or
`qpsolvers` is present but DAQP is missing, unregistered, or too old for
`qpsolvers` warm-start arguments, `solve_ik(..., solver="daqp")` can
fail and
fall back to current joint targets. The controller then reports a
misleading
end-effector position error in `test_pink_ik.py`.

This change makes the installer probe the full Pink IK stack:
`pinocchio`, DAQP
registration in `qpsolvers`, and the `daqp.solve` API shape required by
current
`qpsolvers` (`primal_start`). It also aligns the IsaacLab dependency pin
with
the compatible DAQP release, `daqp==0.8.5`.

Runtime handling stays narrow: ordinary IK failures keep the existing
fallback,
while missing DAQP or the specific `primal_start` API mismatch is
surfaced with
an actionable install message instead of being swallowed as an IK
fallback.

The docs config also mocks `qpsolvers`, matching the existing docs
treatment for
optional Pink IK dependencies such as `pink` and `pinocchio`, so API
docs can be
built without the runtime solver stack installed.

## Type of change

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

## Test Plan

- `./isaaclab.sh -p -m py_compile
source/isaaclab/isaaclab/cli/commands/install.py
source/isaaclab/isaaclab/controllers/pink_ik/pink_ik.py
source/isaaclab/setup.py docs/conf.py`
- `./isaaclab.sh -p -c "import inspect, pinocchio, daqp, qpsolvers;
assert 'daqp' in qpsolvers.available_solvers; assert 'primal_start' in
inspect.signature(daqp.solve).parameters; print('pink ik dependency
probe passed')"`
- `./isaaclab.sh -p -c "..."` small monkeypatch check that
`TypeError("solve() got an unexpected keyword argument 'primal_start'")`
raises the new DAQP compatibility `RuntimeError`
- `./isaaclab.sh -p -m pytest
source/isaaclab/test/controllers/test_pink_ik.py::test_movement_types -k
"GR1T2-Abs-v0 and stay_still" -q --tb=short -s -x`
- `./isaaclab.sh -p -m pytest
source/isaaclab/test/controllers/test_pink_ik.py -q --tb=short -x` (`23
passed, 1 skipped`)
-
`VIRTUAL_ENV=/home/zhengyuz/Projects/IsaacLab.wt/feature-heterogeneous_dexsuite/env_isaaclab
PATH=/home/zhengyuz/Projects/IsaacLab.wt/feature-heterogeneous_dexsuite/env_isaaclab/bin:$PATH
make current-docs` from `docs/`
-
`VIRTUAL_ENV=/home/zhengyuz/Projects/IsaacLab.wt/feature-heterogeneous_dexsuite/env_isaaclab
./isaaclab.sh -f`

## 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 (N/A - docs
config only)
- [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
Bumped packages:
- isaaclab: 4.8.1 → 4.8.2
# Description
This PR a lot simplify cloner logic:
Refactors scene cloning so `InteractiveScene` builds a `ClonePlan`
directly from asset configuration, rewrites spawner configs to spawn
representative sources in their selected environment paths, and then
replicates directly from those sources to the remaining destinations.
This removes the previous template round trip and hard-deletes
`clone_from_template`.

This also updates the cloner API around `CloneCfg` and
`make_clone_plan`, adds explicit `spawn_paths` support for multi-asset
spawners, tightens rigid object collection spawning invariants, and
refreshes docs, tests, and changelog coverage for the new planning flow.

Fixes # N/A

Dependencies: none.

## Type of change

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

## Screenshots

N/A.

## Test plan

Focused tests were run individually while developing this branch:

- `source/isaaclab/test/scene/test_interactive_scene.py`
- `source/isaaclab/test/sim/test_cloner.py`
- `source/isaaclab/test/sim/test_spawn_wrappers.py`
- `source/isaaclab_physx/test/sim/test_cloner.py`
- `py_compile` checks for touched Python modules

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

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Bumped packages:
- isaaclab: 4.8.2 → 5.0.0
- isaaclab_newton: 0.7.1 → 0.7.2
- isaaclab_physx: 0.6.2 → 0.6.3
kellyguo11 and others added 14 commits May 11, 2026 16:10
…5564)

# Description

When benchmarking scripts are executed with num_iterations set to below
the threshold for reward logging, the run can produce missing reward
data. However, the scripts are hardcoded to always parse rewards from
tensorboard, which may not exist in these cases. This change patches the
RL benchmarking scripts to only process rewards logging if they were
written to tensorboard.

## Type of change

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

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


## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

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

- Documentation update

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

- [ ] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [ ] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

<!--
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
-->
This PR improves IsaacLab Teleop retargeting performance and
installation reliability.

- Added configurable IsaacTeleop retargeting execution via
`IsaacTeleopCfg.retargeting_execution`.
- Enabled deadline-paced pipelined retargeting by default, so
IsaacTeleop retargeting work can overlap with Isaac Lab simulation
stepping.
- Preserved synchronous retargeting as an opt-in mode for exact
current-frame behavior.
- Added an extension-level `pip_upgrade_dependencies` setting in
`extension.toml` so `./isaaclab.sh --install` can explicitly upgrade
selected `install_requires` dependencies after editable install.
- Used that mechanism for `isaaclab_teleop` to upgrade to the latest
compatible `isaacteleop` without duplicating the version spec outside
`setup.py`.

## Why

The pipelined retargeting path reduces Python-side frame pressure by
returning the latest completed retargeting output while the current
frame is submitted in parallel.

The install change fixes CI/local environments where an older compatible
`isaacteleop` version is already installed. Since `pip install -e
source/isaaclab_teleop` does not upgrade already-satisfied dependencies
by default, which could keep using a stale IsaacTeleop package. The new
targeted upgrade keeps the version range in `setup.py` as the source of
truth while still allowing the install command to refresh `isaacteleop`.

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

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

## Screenshots

Please attach before and after screenshots of the change if applicable.

<!--
Example:

| Before | After |
| ------ | ----- |
| _gif/png before_ | _gif/png after_ |

To upload images to a PR -- simply drag and drop an image while in edit
mode and it should upload the image directly. You can then paste that
source into the above before/after sections.
-->

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
# Description

Adds the **Assemble Trocar** manipulation task for the Unitree G1
(29-DoF + Dex3), with RLinf support.

Key additions:
- **Task MDP**: observations (body + Dex3 joint states), reward
functions (4-stage sparse), termination conditions (timeout, success,
object drop), and reset events (scene reset, task stage reset, random
tray rotation).
- **Camera presets**: front camera and left/right wrist cameras
(TiledCamera, 224×224) configured for GR00T visual input.
- **Robot presets**: G1 29-DoF + Dex3 articulation configuration.
- **GR00T data config**: `IsaacLabDataConfig` defining
video/state/action modality keys, transforms (SinCos state encoding,
min-max action normalization, color jitter), and model-specific
settings.
- **RLinf extension update**: minor update to
`isaaclab_contrib/rl/rlinf/extension.py` to support the new task
registration.

## Type of change

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

## Checklist

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

---------

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

# Description

Adds Newton-native and MuJoCo-specific schema cfg classes to
`isaaclab_newton.sim.schemas`,
following the base/subclass framework from isaac-sim#5275. All new cfgs use the
per-declaring-class
MRO routing in `_apply_namespaced_schemas` — no backend-specific
branching in any writer.

Depends on isaac-sim#5275.

## New cfgs

### MuJoCo (Newton MuJoCo kernel, `mjc:*` namespace)

| Class | Field | USD attribute | Applied schema |
|---|---|---|---|
| `MujocoRigidBodyPropertiesCfg` | `gravcomp` | `mjc:gravcomp` | None
(raw attr) |
| `MujocoJointDrivePropertiesCfg` | `actuatorgravcomp` |
`mjc:actuatorgravcomp` | `MjcJointAPI` |

Body-level `gravcomp` must be set for joint-level `actuatorgravcomp` to
have any effect.
The spawner auto-enables `MujocoRigidBodyPropertiesCfg(gravcomp=1.0)`
when joint-level
actuator gravcomp is requested without body-level gravcomp.

### Newton-native (`newton:*` namespace)

| Class | Fields | USD attributes | Applied schema |
|---|---|---|---|
| `NewtonCollisionPropertiesCfg` | `contact_margin`, `contact_gap` |
`newton:contactMargin`, `newton:contactGap` | `NewtonCollisionAPI` |
| `NewtonMeshCollisionPropertiesCfg` | `max_hull_vertices` |
`newton:maxHullVertices` | `NewtonMeshCollisionAPI` |
| `NewtonMaterialPropertiesCfg` | `torsional_friction`,
`rolling_friction` | `newton:torsionalFriction`,
`newton:rollingFriction` | `NewtonMaterialAPI` |
| `NewtonArticulationRootPropertiesCfg` | `self_collision_enabled` |
`newton:selfCollisionEnabled` | `NewtonArticulationRootAPI` |

## Design constraints

Same single-cfg-per-spawner-slot rule as isaac-sim#5275. Newton cfgs subclass the
same base classes
as PhysX cfgs; each declares `_usd_namespace`/`_usd_applied_schema`
(ClassVar) and fields
that auto-camelCase to their USD attr names. Per-declaring-class MRO
routing handles mixed
PhysX+Newton cfg hierarchies correctly.

## Field renames (with deprecation aliases through 5.0)

| Old | New | Reason |
|---|---|---|
| `gravity_compensation_scale` | `gravcomp` | Single word identity:
`gravcomp` → `mjc:gravcomp` |
| `gravity_compensation` | `actuatorgravcomp` | Single word identity:
`actuatorgravcomp` → `mjc:actuatorgravcomp` |

## Type of change

- New feature (non-breaking)

Forwarding shims on `isaaclab.sim.schemas` keep existing imports
working.
Deprecation aliases keep old field names working through 5.0.

## Test plan

- [x] MuJoCo tests: `mjc:gravcomp` / `mjc:actuatorgravcomp` written when
set, not written when None
- [x] Newton collision, material, articulation-root: attrs written,
schemas applied only when non-None
- [x] Deprecation alias tests for renamed fields
- [x] `test_schemas.py` 46/46 pass — no regressions
- [x] Pre-commit clean

## Supersedes

Together with isaac-sim#5275, supersedes isaac-sim#4847 and isaac-sim#5203.

---------

Co-authored-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
Bumped packages:
- isaaclab: 5.0.0 → 5.1.0
- isaaclab_assets: 0.3.3 → 0.3.4
- isaaclab_contrib: 0.3.1 → 0.3.2
- isaaclab_experimental: 0.0.3 → 0.0.4
- isaaclab_newton: 0.7.2 → 0.8.0
- isaaclab_ov: 0.1.6 → 0.1.7
- isaaclab_tasks: 1.5.36 → 1.5.37
- isaaclab_teleop: 0.3.10 → 0.3.11
Replaces the earlier Python-based parent-loop implementation (which was
correct but ~3× slower than USD for local poses) with a fully GPU-side
Fabric path that follows the bareya/pbarejko/camera-update prototype:

* Three persistent ``PrimSelection`` instances differing only in
  per-attribute access mode — one each for {trans_ro, world_rw, local_rw}.
* Path-based view → fabric index mapping computed once from
  ``selection.GetPaths()`` and stored as a Warp ``int32`` array.  No
  custom prim attributes are written to the stage.
* All transform reads and writes go through ``wp.indexedfabricarray``,
  so the kernels just dereference ``ifa[view_index]`` instead of taking
  a separate mapping argument.
* Stage-level ``IFabricHierarchy`` cache and dirty-stages set so multiple
  ``FabricFrameView`` instances on the same stage share state.

World ↔ local consistency is preserved through Warp kernels that run on
the affected write paths:

* ``set_local_poses`` writes ``omni:fabric:localMatrix`` directly via the
  compose kernel, then a second kernel recomputes child worldMatrix from
  ``parent_world * child_local`` so the next ``get_world_poses`` read is
  consistent.  ``IFabricHierarchy.update_world_xforms()`` is *not* used
  for this — in practice it re-reads USD's authored xformOps and would
  overwrite the matrices we just authored.
* ``set_world_poses`` mirrors the above, recomputing
  ``child_local = inv(parent_world) * child_world`` after the write.

Two new public Warp kernels in ``isaaclab.utils.warp.fabric``:

* ``decompose_indexed_fabric_transforms`` /
  ``compose_indexed_fabric_transforms`` — indexed-array variants of the
  existing decompose/compose kernels.
* ``update_indexed_local_matrix_from_world`` /
  ``update_indexed_world_matrix_from_local`` — propagate one direction
  using a parent indexed fabric array.  Implemented directly in storage
  convention (``local = world * inv(parent)``,
  ``world = local * parent``) — the four transposes the math-convention
  form would imply cancel out under ``(A·B)^T = B^T·A^T``.

Benchmark (1024 prims, 50 iterations, RTX A6000):

  Operation             USD (ms)   Fabric (ms)   Speedup
  Get World Poses        12.33      0.044         282×
  Set World Poses        27.98      0.117         240×
  Interleaved Set→Get    41.34      0.160         258×
  Get Local Poses         6.04      0.037         162×
  Set Local Poses         8.54      0.053         162×

Local-pose ops went from ~3× slower than USD (in the earlier
torch-based parent-loop implementation) to ~160× faster, with the
new Fabric-side localMatrix authoring keeping ``test_set_world_updates_local``
passing without an xfail override.

Tests: 41 passed in the Fabric backend's contract + new coverage for
the Fabric-native ``set_local_poses``, ``get_scales``, and topology
rebuild paths.

Drops the no-longer-needed ``cd571d482`` Python-loop attempt.
Three review fixes on the indexedfabricarray refactor:

* set_scales wrote the new scale into worldMatrix but never refreshed
  localMatrix, so a subsequent get_local_poses returned the stale
  scale.  Call _sync_local_from_world after the world write, matching
  set_world_poses.

* The view->fabric mapping was stored in a single shared
  _fabric_indices field that each accessor overwrote from its own
  selection's GetPaths() ordering.  Selections do not guarantee a
  shared path ordering, so this was brittle and hard to reason about.
  Cache the mapping per selection (_trans_ro_fabric_indices,
  _world_rw_fabric_indices, _local_rw_fabric_indices) and pass it
  explicitly to _build_indexed_array.  The three trans_ro accessors
  now share a _rebuild_trans_ro_arrays helper.

* Update two test comments that referenced the removed
  _fabric_usd_sync_done attribute to point at the lazy
  _initialize_fabric() call instead.
The chained set_world_poses -> get_world_poses round-trip in
test_fabric_rebuild_after_topology_change goes through Warp's float32
SRT compose/decompose, which accumulates a few ULP of drift.

At the test's position magnitudes (~4-6), one float32 ULP is
~4.77e-7, so the prior atol of 1e-7 demanded sub-ULP agreement and
was sensitive to GPU/codegen variation -- it passed locally on the
A6000 but flaked in CI.

1e-5 corresponds to roughly 20 ULP at those magnitudes: tight enough
to catch any real bug (a wrong index or stale read would be at least
~1e-3 off given the test setup) and consistent with the shared
contract harness in frame_view_contract_utils.py, which already
documents and uses ATOL = 1e-5 for compose/decompose-through-float32
checks.
The previous _static_dirty_stages set was keyed by stage_id, but
_sync_world_from_local_if_dirty only recomputes worldMatrix for the
*calling view's* children before clearing the flag.  With two views
on the same stage, view B's world-read would clear the flag set by
view A's set_local_poses, leaving A's worlds silently stale.

Replace the class-level set with a per-instance bool.  Each view now
tracks its own dirty state, which matches the actual scope of the
recompute kernel and removes a mutable ClassVar.

Also:
- Raise a clearer error when _compute_parent_fabric_indices is asked
  to look up the parent of a root-level prim (rsplit produces ""),
  instead of bubbling up the generic "not found in selection" message.
- Document on the remaining _static_hierarchy_cache that it is not
  thread-safe by design (Isaac Lab's loop is single-threaded; adding a
  lock would negate the per-stage caching benefit).
- Update the module docstring to reflect the per-view dirty model and
  drop the stale reference to IFabricHierarchy.update_world_xforms.
Three review fixes plus the missing coverage for the transpose
storage convention.

* Hierarchy cache eviction: cache key is now (stage_id, fabric_id) so a
  recycled stage_id paired with a new Fabric attachment never returns a
  stale handle.  Added FabricFrameView.clear_static_caches() classmethod
  for explicit teardown and wired it into the test fixture so cached
  handles do not accumulate across the suite.

* PrepareForReuse no longer fires twice per sync.  Both _sync_local_from_world
  and _sync_world_from_local_if_dirty refresh trans_sel_ro exactly once,
  then read _world_ifa_ro / _local_ifa_ro / _parent_world_ifa_ro directly
  from the fields instead of going through the accessors.

* Class docstring rewritten to describe the actual PrepareForReuse policy
  (every accessor calls it; idempotent and cheap in the steady state).
  The prior wording claimed reads avoided PrepareForReuse, which has not
  been true since the indexedfabricarray rewrite.

* New regression tests for the transpose storage convention.  The standard
  fixture parents are translation-only, so the rotation block is identity
  and equal to its transpose - which means a wrong transpose convention
  would still pass every existing test.  Two new tests place a parent
  rotated 90 degrees around Z and verify the world<->local round-trip:
  - test_set_local_then_get_world_with_rotated_parent exercises
    update_indexed_world_matrix_from_local
  - test_set_world_then_get_local_with_rotated_parent exercises
    update_indexed_local_matrix_from_world
  Confirmed locally that flipping the multiply order in either kernel
  makes the matching test fail.

45 tests pass on cpu and cuda:0.
pv-nvidia added 2 commits May 12, 2026 15:13
FabricFrameView is referenced by fully-qualified name in the migration
guide and in this PR's changelog fragment, but no RST file documented
the module - so the Sphinx :class: and :meth: cross-refs were not
resolvable.  Add a thin automodule page mirroring the sibling pages
under docs/source/api/lab_physx/ and register it in the API index
toctree.  This also picks up the new clear_static_caches() classmethod
automatically via :members:.
The submodule was not surfaced anywhere in the Sphinx tree, so :func:
cross-references to its kernels (added in the changelog fragment for
this branch and used by FabricFrameView throughout) did not resolve.

Add a Warp Fabric kernels subsection to isaaclab.utils.rst that
automodule's the submodule, and add __all__ to fabric.py so the
generated page lists only the eight public kernels - the type aliases
(FabricArrayMat44d, ArrayUInt32, ...) and the re-imported `wp` /
`TYPE_CHECKING` / `Any` symbols stay out of the rendered docs.

The page covers both the pre-existing kernels
(compose/decompose_fabric_transformation_matrix_*_warp_arrays,
set_view_to_fabric_array, arange_k) and the four kernels added on
this branch.
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.