Skip to content

feat(schemas): joint-drive schema-fragment API (additive) - #8

Draft
vidurv-nvidia wants to merge 45 commits into
vidurv/schema-frag-frameworkfrom
vidurv/schema-frag-jointdrive
Draft

feat(schemas): joint-drive schema-fragment API (additive)#8
vidurv-nvidia wants to merge 45 commits into
vidurv/schema-frag-frameworkfrom
vidurv/schema-frag-jointdrive

Conversation

@vidurv-nvidia

@vidurv-nvidia vidurv-nvidia commented Jun 5, 2026

Copy link
Copy Markdown
Owner

Description

Additive joint-drive fragment family (custom func)

  • core: UsdPhysicsDriveCfg overriding funcapply_drive (multi-instance DriveAPI, rad→deg for angular, drive_typetype, tendon-child guard)
  • physx: PhysxJointCfg (physxJoint:maxJointVelocity); newton: MujocoJointCfg (mjc:actuatorgravcomp)
  • apply_joint_drive_properties(...): DriveAPI presence-gated; ensure_drives_exist is a spawner-level flag.

⚠️ Known divergence to resolve before ready: max_joint_velocity rad→deg conversion is NOT reproduced (it now lives on PhysxJointCfg written by the generic applier, which has no joint-type awareness). For angular-joint parity, PhysxJointCfg needs its own override func. Status: authored, ruff clean, sim verification pending.

Fixes # (N/A — part of the staged physics schema-fragment refactor; no tracked public issue)

Type of change

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

Screenshots

N/A — no user-facing visual changes.

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks (ruff + ruff-format) on the changed files
  • I have made corresponding changes to the documentation (the public API reference is auto-generated via ./isaaclab.sh -d; not separately authored)
  • My changes generate no new warnings
  • I have added tests that prove my feature works
  • I have added a changelog fragment under source/<pkg>/changelog.d/ for every touched package
  • I have added my name to CONTRIBUTORS.md

huidongc and others added 20 commits June 24, 2026 09:18
…`` (isaac-sim#6242)

# Description

Fixed the `newton[sim]` dependency pin to use Newton commit
`79e95bf5571d70a0a46c8eaedc80644531d27368`, including the
`RenderContext` triangle-mesh construction fix from
[newton-physics/newton#3199](newton-physics/newton#3199).


## Type of change

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

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
Bumped packages:
- isaaclab: 7.0.5 → 7.1.0
- isaaclab_newton: 1.0.4 → 1.1.0
- isaaclab_ov: 0.4.6 → 0.5.0
- isaaclab_physx: 2.0.2 → 2.1.0
- isaaclab_tasks: 8.0.4 → 8.0.5
- isaaclab_visualizers: 1.0.1 → 1.0.2
…cartpole, dexsuite_kuka, and shadow_hand with test coverage (isaac-sim#6101)

# Description

Add distance_to_camera and distance_to_image_plane camera presets to
cartpole, dexsuite_kuka, and shadow_hand with test coverage.

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

# Description

Add ISAAC_LAB_ENABLE_ISAAC_RTX_PER_ENV_SCENE_PARTITION environment
variable to opt in to authoring primvars:omni:scenePartition and
omni:scenePartition on the USD stage. Previously this was always on; now
it is off by default. This is to address an OOM in one of our IsaacSim
RTX benchmark suites related to primvar inheritance of the scene
partition attributes while the root cause/fix is under investigation.

## Testing

We have a separate issue which only visualizes env_0 in kit when scene
partitioning is enabled... so I tested with:
```bash
./isaaclab.sh train --rl_library rsl_rl \
    --task Isaac-Lift-KukaAllegro-Camera \
    presets=newton_mjwarp,isaacsim_rtx_renderer,rgb64,single_camera \
    --seed 42 \
    --num_envs 4 \
    --max_iterations 1000 \
    --visualizer kit
```
... and it shows all the envs - checked all the env Xforms and camera
and they don't have the scenePartition attribute/primvars:
<img width="3813" height="2072" alt="image"
src="https://github.com/user-attachments/assets/ea22b566-db95-498b-aa5d-445c1c2b0c8b"
/>

Conversely, tested with the environment variable enabled:
```bash
ISAAC_LAB_ENABLE_ISAAC_RTX_PER_ENV_SCENE_PARTITION=1 ./isaaclab.sh train --rl_library rsl_rl \
    --task Isaac-Lift-KukaAllegro-Camera \
    presets=newton_mjwarp,isaacsim_rtx_renderer,rgb64,single_camera \
    --seed 42 \
    --num_envs 4 \
    --max_iterations 1000 \
    --visualizer kit
```

And we get the old behavior of only env_0 showing.

@fatimaanes keen to hear if this helps mitigate the benchmark OOM you
are seeing.

## Checklist

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

## Summary (PR 1 of 2 — additive, no behavior change)

Introduces single-namespace schema **fragments** so a prim can carry
rigid-body properties from multiple USD namespaces at once (`physics:`,
`physxRigidBody:`, `mjc:`), with core naming no backend. **Purely
additive** — existing cfgs and the deprecated `RigidBodyPropertiesCfg`
class are untouched.

- **core:** `SchemaFragment`, `RigidBodyFragment`,
`UsdPhysicsRigidBodyCfg`; `apply_namespaced` (generic per-fragment
writer) and `apply_rigid_body_properties` (applies a fragment list with
`UsdPhysics.RigidBodyAPI` as the implicit anchor).
- **spawner:** `rigid_props` accepts a fragment list; legacy single cfgs
keep working via a transition bridge
(shapes/meshes/from_files/mesh_converter).
- **backends:** `PhysxRigidBodyCfg` (physx), `MujocoRigidBodyCfg`
(newton).
- new `test_schema_fragments.py` + exports.

**PR 2** (stacked) flips `RigidBodyPropertiesCfg` to a deprecation
factory and migrates all call sites: #4 (review
after this lands).

## Test Plan
- [x] `test_schema_fragments.py` — 7 passed
- [x] pre-commit clean · `./isaaclab.sh -d` docs build clean
- [ ] CI

First slice of the staged physics schema-cfg refactor (collision / mass
/ joint-drive / … follow later). Draft for review of the fragment API
shape.


## Type of change

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

## Screenshots

N/A — no user-facing visual changes.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the pre-commit checks (`ruff` + `ruff-format`) on the
changed files
- [ ] I have made corresponding changes to the documentation (the public
API reference is auto-generated via `./isaaclab.sh -d`; not separately
authored)
- [x] My changes generate no new warnings
- [x] I have added tests that prove my feature works
- [x] I have added a changelog fragment under
`source/<pkg>/changelog.d/` for every touched package
- [ ] I have added my name to `CONTRIBUTORS.md`

---------

Co-authored-by: ooctipus <zhengyuz@nvidia.com>
…ttp:// asset URLs in saved USDs (isaac-sim#6255)

# Description

Preserve URI asset paths in save_stage

Avoid resolving asset paths with explicit URI schemes as filesystem
paths
during stage save path remapping. This keeps remote assets such as
DomeLight texture URLs from being rewritten into invalid relative paths.

Fixes # ([OMPE-96696](https://jirasw.nvidia.com/browse/OMPE-96696))

## Type of change


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

## Screenshots

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



## Checklist

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

<!--
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
-->
Bumped packages:
- isaaclab: 7.1.0 → 7.2.0
- isaaclab_newton: 1.1.0 → 1.2.0
- isaaclab_ov: 0.5.0 → 0.5.1
- isaaclab_physx: 2.1.0 → 2.2.0
- isaaclab_tasks: 8.0.5 → 8.0.6
- isaaclab_visualizers: 1.0.2 → 1.0.3
…ndings (view series, part 1) (isaac-sim#6224)

> **📦 Part 1 of a 5-part series** adding an OvPhysX binding view and
migrating the assets onto it:
> 1. **This PR** — add `OvPhysxView` (the API) + tests.
> 2. Migrate the OvPhysX **Articulation** to `root_view`.
> 3. Migrate the **RigidObject**.
> 4. Migrate the **RigidObjectCollection** (uses the fused
`prim_paths`+`key_aliases` path).
> 5. Migrate the **sensors** (pose tracking; contact forces use a
separate `ContactBinding` API and may not fully adopt the view).
>
> Parts 2–5 each depend only on this PR and can be reviewed
independently.

---

# Description

Adds **`OvPhysxView`**, a string-keyed binding-management layer over the
OVPhysX tensor bindings, in `isaaclab_ovphysx`.

**Why.** OVPhysX is the odd backend out: it exposes physics attributes
as a loose `dict[TensorType, TensorBinding]` with **no view object**,
whereas Newton has `selection.ArticulationView` and PhysX has typed
tensor views. Today callers must hold the right `TensorType` enum
member, manage a destination buffer, and create bindings against a USD
glob — and the `create_tensor_binding` calls are scattered across the
asset classes behind a private `_get_binding`. `OvPhysxView` gives
OVPhysX a single, discoverable surface as pleasant as Newton's selection
API, and one owner of binding creation/caching that the asset/data
classes can delegate to. It is the narrow, independently-useful slice
carved out of the (shelved) cross-backend `get_property`/`set_property`
effort; the full rationale and decision log live in
`docs/superpowers/specs/2026-06-17-ovphysx-view-design.md`.

**What it provides**
- String-keyed access by lowercased `TensorType` name (auto-derived from
the wheel enum — no hand-maintained table); a `TensorType` member is
also accepted.
- `get_attribute(name, out=)` — fresh-allocates a **typed** array
(`wp.transformf` for poses, `wp.spatial_vectorf` for velocities, flat
`float32` otherwise; via a maintained `_ATTR_DTYPE` map), no aliasing;
**`read_into(name, dst)`** — zero-copy fill of a caller-owned, possibly
structured-dtype buffer (`wp.transformf`, …) via a `float32` reinterpret
view that is **cached per destination buffer** so the wheel's
object-identity read cache stays warm even when callers hand a
structured buffer each step; `set_attribute(name, values,
indices=/mask=)` (structured sources reinterpreted); and a raw
`binding_for(name)` accessor for adoption.
- The fused multi-prim form (`prim_paths=[...]` + `key_aliases`) so
`RigidObjectCollection` can use it.
- Discoverability (`attribute_names`, `available_attributes`,
`has_attribute`), metadata passthrough, and a nested error hierarchy
(`UnknownAttribute` / `ReadOnlyAttribute` / `AttributeUnavailable` /
`ShapeMismatch` / `DeviceMismatch`).

**Device policy:** no implicit CPU↔GPU conversion — CPU-resident
property types are read/written on CPU, and a buffer on the wrong device
raises `DeviceMismatch` rather than being staged.

**Scope / status:** this PR adds the view plus 48 mock-based unit tests
(no live sim). The asset adoption that replaces
`_get_binding`/`_binding_read`/`_binding_write` lives in the follow-up
PRs (Articulation isaac-sim#6225, RigidObject isaac-sim#6226), which dogfood the view
against a live sim on CPU and GPU and have fed fixes back here (e.g.
`try_binding_for`, the read-view cache, typed `get_attribute`).

Fixes # — N/A (internal design tracking; surviving slice of the shelved
cross-backend view effort).

## Type of change

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

## Screenshots

N/A — no user-facing visual change.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation <!-- design
note updated separately
(docs/superpowers/specs/2026-06-17-ovphysx-view-design.md); no rendered
API-doc change in this PR yet -->
- [x] My changes generate no new warnings
- [x] I have added tests that prove my feature works
(`test/sim/test_ovphysx_view.py`, 48 tests)
- [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
…for normals for all renderers (isaac-sim#6261)

# Description

- Added support for the "normals" data type in the ovrtx renderer
integration
- Added render correctness test coverage for "normals" across applicable
physics/renderer combinations

## Screenshots

See new golden images

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

# Description

Introduce a new general "RTX" preset, where a user does not need to
understand the differences and caveats between Isaac Sim RTX vs. ovrtx.
As a user, they can specify presets=rtx, and we will have logic to
determine whether Isaac Sim RTX or ovrtx should be used. Users can still
explicitly specify presets=ovrtx or presets=isaacsim_rtx, and we will
produce an error if any invalid combinations are provided (e.g. ovrtx +
isaac sim).

If a user specifies presets=rtx, runs physx from isaac sim or uses the
kit visualizer, we will use isaac sim RTX.

If a user specifies presets=rtx, does not launch any isaac sim instances
(e.g. no kit visualizer and no isaac sim physx), then we can use ovrtx
(or whichever option is more performant)

Fixes OMPE-92354

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

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

## Checklist

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

<!--
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: Matthew Taylor <mataylor@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
# Description

Adds the **mass** schema-fragment API. Unlike the other families, mass
has **no backend split** — it is a single core fragment.

- `MassFragment` marker + `MassCfg` (`physics:mass` / `physics:density`;
`UsdPhysics.MassAPI` anchor) in `isaaclab`.
- `apply_mass_properties` family writer (applies the `MassAPI` anchor,
then dispatches each fragment via its `func`).
- The spawner `mass_props` slot now also accepts a `MassCfg` /
`list[MassCfg]`.

This PR is purely **additive** and self-contained: it builds only on the
single-namespace schema-fragment base (`SchemaFragment` +
`apply_namespaced`) already in `develop`, existing call sites are
untouched (a transition bridge routes legacy single cfgs to the existing
`define_`/`modify_` writers), and it does **not** depend on any other
open PR.

## Type of change

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

## Screenshots

N/A — non-visual API change.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have 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 the **collision** schema-fragment API: a prim can carry collision
properties from multiple USD namespaces (`UsdPhysics` + PhysX + Newton)
at once, and core names no backend.

- `CollisionFragment` marker + `UsdPhysicsCollisionCfg`
(`physics:collisionEnabled`; `UsdPhysics.CollisionAPI` anchor) in
`isaaclab`.
- `PhysxCollisionCfg` (`physxCollision:*` — `contact_offset`,
`rest_offset`, `torsional_patch_radius`, `min_torsional_patch_radius`)
in `isaaclab_physx`.
- `NewtonCollisionCfg` (`newton:*`) in `isaaclab_newton`.
- `apply_collision_properties` family writer (applies the anchor, then
dispatches each fragment via its `func`; core imports no backend).
- The spawner `collision_props` slot now also accepts a
`CollisionFragment` / `list[CollisionFragment]`.

This PR is purely **additive** and self-contained: it builds only on the
single-namespace schema-fragment base (`SchemaFragment` +
`apply_namespaced`) already in `develop`, existing call sites are
untouched (a transition bridge routes legacy single cfgs to the existing
`define_`/`modify_` writers), and it does **not** depend on any other
open PR.

## Type of change

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

## Screenshots

N/A — non-visual API change.

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have 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: 7.2.0 → 7.3.0
- isaaclab_newton: 1.2.0 → 1.3.0
- isaaclab_ov: 0.5.1 → 0.5.2
- isaaclab_ovphysx: 3.2.0 → 4.0.0
- isaaclab_physx: 2.2.0 → 2.3.0
- isaaclab_tasks: 8.0.6 → 8.0.7
# Description

Adds so101 stack env for teleop + imitation learning

Fixes # (issue)

## Type of change

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

## Checklist

- [x] I have read and understood the [contribution
guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [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: Rafael Wiltz <rwiltz@nvidia.com>
Add the additive joint-drive schema-fragment framework, mirroring the
rigid-body pilot. This is the override-func family: UsdPhysicsDriveCfg
overrides func with apply_drive instead of the generic applier.

Core:
- JointDriveFragment marker and UsdPhysicsDriveCfg (typed multi-instance
  UsdPhysics.DriveAPI; max_effort -> max_force alias).
- apply_drive: per-joint writer reproducing modify_joint_drive_properties
  (angular/linear instance pick, tendon-child guard, rad->deg conversion
  for angular stiffness/damping, drive_type -> type carve-out).
- apply_joint_drive_properties: recursive family writer; DriveAPI is
  presence-gated (applied only when a UsdPhysicsDriveCfg is present).
  ensure_drives_exist is a writer kwarg, not a fragment field.

Backends:
- PhysxJointCfg (physxJoint:* / PhysxJointAPI, max_joint_velocity with
  max_velocity alias).
- MujocoJointCfg (mjc:* / MjcJointAPI, actuatorgravcomp).

Spawner:
- Widen joint_drive_props slot to accept a fragment list; add the
  spawner-level ensure_drives_exist flag. Bridge the from-files spawn site
  while keeping the gravcomp auto-enable logic working for fragments.

Add exports, test_joint_drive_fragments.py, and changelog fragments.
The tendon-child guard (PhysxTendonAxisAPI without PhysxTendonAxisRootAPI)
lived only inside apply_drive. The dispatch loop in
apply_joint_drive_properties runs every fragment's func per joint prim, so
PhysxJointCfg / MujocoJointCfg authored physxJoint:* / mjc:* attributes on
tendon-child joints that the legacy modify_joint_drive_properties skipped
wholesale (it returns False, so @apply_nested writes nothing and descends).

Hoist the guard into the dispatch loop so a tendon-child joint is skipped
for all fragments (and its children are descended into, matching the
legacy writer). apply_drive keeps its own guard defensively.

Add a regression test (verified to fail before the fix).
@vidurv-nvidia
vidurv-nvidia force-pushed the vidurv/schema-frag-jointdrive branch from cf63878 to 89f743c Compare June 26, 2026 07:42
@github-actions github-actions Bot added documentation Improvements or additions to documentation asset infrastructure labels Jun 26, 2026
AntoineRichard and others added 5 commits June 26, 2026 09:50
…saac-sim#6225)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> This PR depends on **isaac-sim#6224** and is stacked on top of it. It targets
> `develop`, but because isaac-sim#6224 has not merged yet, the diff below
includes the
> Part 1 `OvPhysxView` commits **as well as** the Part 2 migration.
**Please
> review isaac-sim#6224 first.** Once isaac-sim#6224 merges, this branch will be rebased
onto
> `develop` and the diff will shrink to the articulation migration only.

# Description

Part 2 of the OVPhysX view-migration series. It migrates the OVPhysX
**`Articulation`** onto the new `OvPhysxView` binding manager introduced
in
**isaac-sim#6224 (Part 1)**.

The goal of the series is to *dogfood* `OvPhysxView` on the real asset
classes
to surface weaknesses before the rigid-object/collection/sensor
migrations, and
to consolidate the scattered `create_tensor_binding` / `binding.read` /
`binding.write` calls behind one managed surface.

### What changed

* `Articulation._initialize_impl` now builds a single
`OvPhysxView(physx, pattern, device)` and populates it via
`try_binding_for`
(best-effort: tensor types that do not apply to these prims are skipped,
the
asset still raises if *no* binding could be created). All binding
creation,
  caching, and the CPU/GPU device policy now live in the view.
* `ArticulationData` is constructed from the view; its counts come from
the
view metadata, and both `_get_binding` helpers (asset + data container)
  delegate to `OvPhysxView.try_binding_for`.
* **Every write now goes through `root_view.set_attribute(...)`**
instead of
calling `binding.write` on a binding obtained from the view — the ~70
property
/ state / target / wrench / tendon writes, including the per-step
actuation
path. This brings the view's read-only, device, dtype, and contiguity
guards
  to the asset write path, which previously bypassed them.
* **Every read now goes through `root_view.read_into(...)`.**
`ArticulationData`
drops its bespoke `_get_read_view` reinterpret cache; the view now
caches the
`float32` reinterpret per destination buffer (keeping the wheel's read
cache
  warm) and derives the structured layout from the binding shape, so the
  transform / spatial-vector / scalar read helpers collapse to one
  implementation. CPU-only reads keep their pinned-host staging.
* `Articulation.root_view` now returns the `OvPhysxView` instead of a
raw
`dict[TensorType, TensorBinding]` (**breaking** — see migration note
below).
* The articulation tests route through the new API
  (`root_view.get_attribute(...)`, `root_view.try_binding_for(...)`).

### Breaking change / migration

`Articulation.root_view` returns an `OvPhysxView`, not a dict:

* `root_view[tensor_type]` → `root_view.try_binding_for(tensor_type)`
* `tensor_type in root_view` (availability) →
`root_view.try_binding_for(tensor_type) is not None`
* full-tensor read → `root_view.get_attribute(tensor_type)`

### Findings surfaced (the point of the exercise)

* **CPU-only property writes work through `set_attribute`.**
mass/COM/inertia/DOF
limits/stiffness/… are CPU-resident even on a GPU sim, and
`set_attribute`
refuses to stage CPU↔GPU. This is fine because the asset *already*
pre-stages
those to pinned CPU buffers, so the source is on the binding's native
(CPU)
device and the no-stage policy is satisfied with no change. (An initial
assumption that the device policy would block these turned out to be
wrong —
  verified by the green `cuda:0` run.)
* `read_into` allocates a fresh `float32` reinterpret view per call,
which would
defeat the wheel binding's internal read cache that the data container
caches
by `(tensor_type, ptr)`; hot-path reads were kept on the cached-view
path.
* Per-step writes re-resolve the binding through `set_attribute` (a dict
lookup
+ cheap guards) rather than the previously cached binding handle; the
cost is
negligible because the pre-built `float32` write-view passes through the
reinterpret unchanged. A "bound writer" handle on the view would remove
even
  that lookup — a possible Part 1 follow-up.
* The view rejects 0-count bindings (stricter than the old loop, which
could
  store a phantom binding) — a correctness improvement.

## Type of change

- [x] New feature (non-breaking change which adds functionality)
- [x] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] This change requires a documentation update

## Checklist

- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have added tests that prove my fix is effective or that my
feature works (articulation tests route through the new API)
- [x] I have updated the changelog
(`source/isaaclab_ovphysx/changelog.d/`)
- [ ] I have updated the documentation accordingly
- [x] I have added my changes to the right `changelog.d` fragment(s)

### Testing

Run kitless; cpu and cuda must be separate invocations (process-global
device lock):

```
101 passed, 4 xfailed   # -k cpu
101 passed, 4 xfailed   # -k cuda
```
Deduplicate the drive-instance resolution (revolute->angular,
prismatic->linear) and the angular rad->deg branching shared by
apply_drive and _ensure_drive_exists into a single helper, so the
mapping has one source of truth.
The joint-level actuatorgravcomp <-> body-level gravcomp coupling lived
in the core spawner, which had to import isaaclab_newton to detect the
fragment types. Move it into a custom func, apply_mujoco_joint, that
MujocoJointCfg now points to: it writes the mjc:* joint attrs and, when
actuatorgravcomp is requested, enables mjc:gravcomp on the joint's child
body (physics:body1) if unset. Per-joint dispatch covers every actuated
body in the articulation. Core no longer adds backend coupling for the
fragment path; the pre-existing legacy coupling is left untouched.
## Summary
- cache PhysX body-frame COM offsets as model properties instead of
re-reading them every sim timestamp
- invalidate all PhysX COM-offset-dependent cached buffers after
set_coms_index writes
- apply the same model-property cache policy and dependent invalidation
to OVPhysX articulation COM offsets
- add PhysX and OVPhysX regression tests for timestamp reuse, setter
cache updates, joint writes, partial writes, and dependent invalidation
- add changelog fragments for the touched packages

This intentionally keeps the scope to the cached-property fix; it does
not include PR isaac-sim#6260's local-only composition fast path.

## Profiling
- G1 PhysX, 4096 env quick profile before the dependent-invalidation
follow-up: compose_to_body_frame dropped from ~7.25 ms to ~0.24 ms
- after the cache fix, normal step time was 69.20 ms vs 68.76 ms with
compose skipped in the same quick profile
- full-run wall timings were noisy on the laptop/GPU, likely thermal
throttling, but no longer showed the pre-fix COM-read cliff

## Test Plan
- python3 tools/changelog/cli.py check develop
- pre-commit run --from-ref origin/develop --to-ref HEAD
- git diff --check origin/develop...HEAD
- ./isaaclab.sh -p -m py_compile
source/isaaclab_physx/isaaclab_physx/assets/articulation/articulation_data.py
source/isaaclab_physx/isaaclab_physx/assets/articulation/articulation.py
source/isaaclab_ovphysx/isaaclab_ovphysx/assets/articulation/articulation_data.py
source/isaaclab_ovphysx/isaaclab_ovphysx/assets/articulation/articulation.py
source/isaaclab/test/assets/test_articulation_iface.py
source/isaaclab_ovphysx/test/assets/test_articulation.py
- ./isaaclab.sh -p -m pytest
source/isaaclab/test/assets/test_articulation_iface.py -k
'physx_set_coms_index_invalidates_body_com_pose_b_dependents or
physx_body_com_pose_b_is_cached_across_sim_timestamps or
physx_set_coms_index_updates_body_com_pose_b_cache or
physx_joint_position_write_preserves_body_com_pose_b_cache or
physx_partial_set_coms_index_initializes_cold_body_com_pose_b_cache' -q
- ./isaaclab.sh -p -m pytest
source/isaaclab_ovphysx/test/assets/test_articulation.py -k
'body_com_pose_b_cache_and_set_coms_invalidation' -q
…m#6247)

# Description

All other tests are treated as a part of the full suite and do not get
run on push only the following:


[rendering-correctness](https://github.com/isaac-sim/IsaacLab/actions/runs/27923944023/job/82630331274#logs)
(~20m)

[rendering-correctness-kitless](https://github.com/isaac-sim/IsaacLab/actions/runs/27923944023/job/82630331226#logs)
(~20m)


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

- 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

<!--
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
-->
vidurv-nvidia and others added 20 commits June 26, 2026 09:52
Restructure the joint-drive spawn block so the fragment path is a clean
dispatch to apply_joint_drive_properties (no isaaclab_newton import, no
gravcomp coupling) and the pre-existing legacy gravcomp auto-enable lives
verbatim in the legacy else-branch. Previously the Newton import and the
gravcomp detection ran for both paths; now no backend coupling is added
in core for the fragment path.
Cover the cases the two happy-path tests missed: actuatorgravcomp unset
must leave the child body's gravcomp untouched (guards against an
always-writes regression), and per-joint dispatch must enable gravcomp
on every joint's own child body across the articulation (revolute and
prismatic).
The legacy test_newton_schemas covers gravcomp/actuatorgravcomp
written + not-written-when-none via the define_/modify_ writers; the
fragment path only had the written cases. Add the two missing
not-written-when-none equivalents: actuatorgravcomp via apply_mujoco_joint
(asserts not authored to True — the fragment applies MjcJointAPI so the
attr resolves to the schema default False) and gravcomp via
apply_namespaced (MujocoRigidBodyCfg applies no schema, so the attr stays
unauthored).
# Description

Adds the **tendons** schema-fragment API.

- `FixedTendonFragment` / `SpatialTendonFragment` markers +
`PhysxFixedTendonCfg` / `PhysxSpatialTendonCfg` in `isaaclab_physx`.
These are data carriers that override `func` to the existing
multi-instance `modify_fixed_tendon_properties` /
`modify_spatial_tendon_properties` writers (tune-not-apply), since
tendon attributes live under multi-instance `PhysxTendonAxisRootAPI:*`
schemas that the generic `apply_namespaced` writer cannot handle.
- The spawner `fixed_tendons_props` / `spatial_tendons_props` slots now
also accept fragment lists.

This PR is purely **additive** and self-contained: it builds only on the
single-namespace schema-fragment base (`SchemaFragment` +
`apply_namespaced`) already in `develop`, existing call sites are
untouched (a transition bridge routes legacy single cfgs to the existing
`define_`/`modify_` writers), and it does **not** depend on any other
open PR.

## Type of change

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

## Screenshots

N/A — non-visual API change.

## Checklist

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

# Conflicts:
#	source/isaaclab/isaaclab/sim/schemas/schemas_cfg.py
#	source/isaaclab_newton/isaaclab_newton/sim/schemas/__init__.pyi
#	source/isaaclab_newton/isaaclab_newton/sim/schemas/schemas.py
#	source/isaaclab_physx/isaaclab_physx/sim/schemas/__init__.pyi
#	source/isaaclab_physx/isaaclab_physx/sim/schemas/schemas.py
#	source/isaaclab_physx/isaaclab_physx/sim/schemas/schemas_cfg.py
Address greptile: the fragile str()-based PhysxTendonAxisAPI substring
check was duplicated across apply_drive and apply_joint_drive_properties.
Replace both with a backend-agnostic hook: core exposes
register_joint_drive_skip_predicate + _skip_joint_drive, and the PhysX
package registers a robust set-based _is_physx_tendon_child detector on
import. Core no longer carries any PhysX schema name in the joint-drive
writers; the skip behavior is preserved (the predicate is registered
whenever PhysX schema fragments are used).
Cover the registry mechanism independent of PhysX: a registered predicate
excludes a joint, and the empty default skips nothing. Uses monkeypatch to
isolate the module-global predicate list from the session-wide PhysX
registration.
…ac-sim#6262)

# Description

Cherry picks commits from the release branch that fixed some docker
setup and version updates:

- isaac-sim#6169
- isaac-sim#6192
- isaac-sim#6195 
- isaac-sim#6209 
- isaac-sim#6211

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

---------

Co-authored-by: Sheikh Dawood <7774242+sheikh-nv@users.noreply.github.com>
…saac-sim#6226)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> This PR depends on **isaac-sim#6224** and is branched off it (a *sibling* of
the Articulation
> migration isaac-sim#6225, not stacked on it). It targets `develop`, but because
isaac-sim#6224 has not
> merged yet, the diff below includes the Part 1 `OvPhysxView` commits
**as well as** the
> Part 3 migration. **Please review isaac-sim#6224 first.** Once isaac-sim#6224 merges,
this branch will be
> rebased onto `develop` and the diff will shrink to the rigid-object
migration only.

# Description

Part 3 of the OVPhysX view-migration series. It migrates the OVPhysX
**`RigidObject`**
onto the `OvPhysxView` binding manager introduced in **isaac-sim#6224 (Part 1)**,
mirroring the
Articulation migration in **isaac-sim#6225 (Part 2)**.

The series dogfoods `OvPhysxView` on the real asset classes to surface
weaknesses and to
consolidate the scattered `create_tensor_binding` / `binding.read` /
`binding.write` calls
behind one managed surface.

### What changed

* `RigidObject._initialize_impl` builds a single `OvPhysxView(physx,
pattern, device)` and
eagerly creates the rigid-body bindings through it. RigidObject keeps
its **fail-loud**
contract (a missing core type raises a helpful `RuntimeError`) by
creating each via
`binding_for` rather than the best-effort `try_binding_for` the
articulation uses.
* `RigidObjectData` is constructed from the view; counts come from the
view's bindings,
and both `_get_binding` helpers delegate to
`OvPhysxView.try_binding_for`.
* **Every write goes through `root_view.set_attribute(...)`** —
pose/velocity/wrench plus
the CPU-only mass/COM/inertia properties (which the asset pre-stages to
pinned CPU
buffers, so the source is already on the binding's native device and the
view's
no-implicit-staging policy is satisfied). Writes now get the view's
read-only/device/
  dtype/contiguity guards.
* **Every read goes through `root_view.read_into(...)`.**
`RigidObjectData._read_binding_into`
routes through the view, which caches the `float32` reinterpret per
destination buffer
and derives the structured layout from the binding shape — this path
previously rebuilt
the reinterpret on every read, so it is a strict read-cache improvement.
CPU-only reads
  keep their pinned-host staging.
* `RigidObject.root_view` now returns the `OvPhysxView` instead of a raw
  `dict[TensorType, TensorBinding]` (**breaking** — see migration note).

### Breaking change / migration

`RigidObject.root_view` returns an `OvPhysxView`, not a dict:

* `root_view[tensor_type]` → `root_view.try_binding_for(tensor_type)`
* full-tensor read → `root_view.get_attribute(tensor_type)`

## Type of change

- [x] New feature (non-breaking change which adds functionality)
- [x] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] This change requires a documentation update

## Checklist

- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have added tests that prove my fix is effective or that my
feature works (rigid-object tests exercise the migrated read/write
paths)
- [x] I have updated the changelog
(`source/isaaclab_ovphysx/changelog.d/`)
- [ ] I have updated the documentation accordingly
- [x] I have added my changes to the right `changelog.d` fragment(s)

### Testing

Run kitless; cpu and cuda must be separate invocations (process-global
device lock):

```
42 passed, 10 xfailed              # test_rigid_object.py -k cpu
41 passed, 2 skipped, 8 xfailed    # test_rigid_object.py -k cuda
1 passed                           # test_rigid_object_helpers.py
```
…aac-sim#6228)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> Branched off isaac-sim#6224 as a sibling of the asset migrations
(isaac-sim#6225/isaac-sim#6226/isaac-sim#6227). Targets `develop`; until isaac-sim#6224 merges, the diff
below includes the Part 1 `OvPhysxView` commits. **Please review isaac-sim#6224
first.**

# Description

Part 5 of the OVPhysX view-migration series — route the **IMU** sensor's
tensor-binding management through `OvPhysxView`. Internal refactor; **no
public API change** (sensors do not expose a `root_view`).

* `_initialize_impl` builds one `OvPhysxView` instead of separate
`create_tensor_binding` calls; binding handles come from `binding_for`.
* Pose/state reads route through `read_into` (cached `float32`
reinterpret, typed off the binding shape), replacing the manual
`wp.array(ptr=...)` reinterpret views.
* The CPU-only `RIGID_BODY_COM_POSE` keeps its pinned-host staging +
`wp.copy` to the sim device.
* Numeric behavior unchanged.

## Type of change

- [x] This change requires no public API change (internal refactor)

## Checklist

- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment (`.skip` — internal refactor, no
user-facing change / no bump)

## Testing

`test_imu.py` — cpu: **12 passed**, cuda: **12 passed**.
…aac-sim#6229)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> Branched off isaac-sim#6224 as a sibling of the asset migrations
(isaac-sim#6225/isaac-sim#6226/isaac-sim#6227). Targets `develop`; until isaac-sim#6224 merges, the diff
below includes the Part 1 `OvPhysxView` commits. **Please review isaac-sim#6224
first.**

# Description

Part 5 of the OVPhysX view-migration series — route the **PVA** sensor's
tensor-binding management through `OvPhysxView`. Internal refactor; **no
public API change** (sensors do not expose a `root_view`).

* `_initialize_impl` builds one `OvPhysxView` instead of separate
`create_tensor_binding` calls; binding handles come from `binding_for`.
* Pose/state reads route through `read_into` (cached `float32`
reinterpret, typed off the binding shape), replacing the manual
`wp.array(ptr=...)` reinterpret views.
* The CPU-only `RIGID_BODY_COM_POSE` keeps its pinned-host staging +
`wp.copy` to the sim device.
* Numeric behavior unchanged.

## Type of change

- [x] This change requires no public API change (internal refactor)

## Checklist

- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment (`.skip` — internal refactor, no
user-facing change / no bump)

## Testing

`test_pva.py` — cpu: **13 passed**, cuda: **13 passed**.
…rt 5) (isaac-sim#6230)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> Branched off isaac-sim#6224 as a sibling of the asset migrations
(isaac-sim#6225/isaac-sim#6226/isaac-sim#6227). Targets `develop`; until isaac-sim#6224 merges, the diff
below includes the Part 1 `OvPhysxView` commits. **Please review isaac-sim#6224
first.**

# Description

Part 5 of the OVPhysX view-migration series — route the **joint-wrench**
sensor's tensor-binding management through `OvPhysxView`. Internal
refactor; **no public API change** (sensors do not expose a
`root_view`).

* `_initialize_impl` builds one `OvPhysxView` instead of separate
`create_tensor_binding` calls; binding handles come from `binding_for`.
* Pose/state reads route through `read_into` (cached `float32`
reinterpret, typed off the binding shape), replacing the manual
`wp.array(ptr=...)` reinterpret views.
* All bindings are GPU-resident state
(`ARTICULATION_LINK_INCOMING_JOINT_FORCE`); no CPU staging needed.
* Numeric behavior unchanged.

## Type of change

- [x] This change requires no public API change (internal refactor)

## Checklist

- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] I have added a changelog fragment (`.skip` — internal refactor, no
user-facing change / no bump)

## Testing

`test_joint_wrench_sensor.py` — cpu: **11 passed**, cuda: **11 passed**.
…ries, part 5) (isaac-sim#6232)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> Branched off isaac-sim#6224 as a sibling of the other migrations. Targets
`develop`; until isaac-sim#6224 merges the diff includes the Part 1 `OvPhysxView`
commits. **Please review isaac-sim#6224 first.**

# Description

Part 5 of the OVPhysX view-migration series — the **contact sensor**.
This is the *partial* one: only the `RIGID_BODY_POSE` pose binding (the
`track_pose` path) is a `TensorBinding` the view can manage, so only it
is migrated. The **`ContactBinding`** (net forces via `read_net_forces`,
force matrix via `read_force_matrix`) is a separate ovphysx wheel API
that `OvPhysxView` does not wrap — it is left exactly as-is.

* `_initialize_impl` builds an `OvPhysxView` for the pose binding (when
`track_pose`) and obtains it via `binding_for(TT.RIGID_BODY_POSE)`; the
count-mismatch check and the `pose_binding` accessor are unchanged.
* The per-step pose read goes through `read_into(TT.RIGID_BODY_POSE,
...)` (cached reinterpret).
* The `ContactBinding` create/read/destroy paths are untouched.
* Internal refactor; no public API change.

## Type of change

- [x] Internal refactor (non-breaking)

## Checklist

- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [x] My changes generate no new warnings
- [x] Changelog fragment (`.skip` — internal refactor, no bump)

## Testing

`test_contact_sensor.py` — cpu: **9 passed, 4 skipped**; cuda: **9
passed, 4 skipped** (exercises both the ContactBinding force path and
the migrated pose-tracking path).
…sxView (view series) (isaac-sim#6233)

> ### 🔗 Stacked on top of isaac-sim#6224 (Part 1 — `OvPhysxView`)
> Branched off isaac-sim#6224 as a sibling of the asset/sensor migrations.
Targets `develop`; until isaac-sim#6224 merges the diff includes the Part 1
`OvPhysxView` commits. **Please review isaac-sim#6224 first.**

# Description

Two more `RIGID_BODY_POSE` binding consumers the asset (isaac-sim#6225-6227) and
sensor (isaac-sim#6228-6232) passes didn't cover, migrated together in one PR:

* **`OvPhysxFrameView`** (`sim/views/ovphysx_frame_view.py`) — the frame
view that cameras / `XformPrim` use. Builds one `OvPhysxView` +
`try_binding_for(RIGID_BODY_POSE)` (preserving its explicit "matched
zero bodies" error, since the view rejects a 0-count binding), and reads
via `read_into`.
* **`OvPhysxSceneDataBackend`** (`physics/ovphysx_manager.py`) — the
scene-data provider. Builds one `OvPhysxView` per distinct rigid-body
pattern, stores it on the per-pattern entry, and reads via `read_into`;
the per-entry merge into the transform buffer is unchanged.

Both are internal refactors — **no public API change** (neither exposes
a `root_view`). The `ContactBinding` is unrelated (separate wheel API;
see isaac-sim#6232). The scene-data backend's bypass-init unit test hand-seeds
the internal entry dict, so it now seeds a matching `view` stub with
`read_into`.

## Type of change

- [x] Internal refactor (non-breaking)

## Checklist

- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [x] Changelog fragment (`.skip` — internal refactor, no bump)

## Testing

* `test_views_xform_prim_ovphysx.py` — cpu: **18 passed**, cuda: **18
passed**.
* `test_ovphysx_scene_data_backend.py` — **11 passed**.
…saac-sim#6234)

# Description

- Add `upload-omni-github-test-results` composite action to convert
JUnit XML into the omni-github test-result artifact contract.
- Wire the upload step into install-ci, package test, and Docker test
composite actions.
- Use IsaacLab upstream repository ID `567038244` in artifact identities
for omni-github registration.

- [x] Installation Tests workflow uploads
`pytest-results-*--v1-567038244-*` artifacts
- [x] omni-github registration PR can reference real sample artifact
names from this run

link to slack discussion:

https://nvidia.slack.com/archives/C0B16FFDDBP/p1782216333267729

link to artifact schema:


https://github.com/NVIDIA-Omniverse/omni-github/blob/main/docs/test-results/clients/artifact-upload/artifact-schema.md




reference to junit format:
https://github.com/testmoapp/junitxml#structure


link to test results dashboard:


https://omni-github-stg.horde-aks.nvidia.com/test-results/repository-test-summary?repository=isaac-sim%2FIsaacLab&days=30&prMode=include&groupBy=job_name&groupValue=isaaclab+%28core%29+%5B3%2F3%5D


example artifact from most recent pipeline run:


- rendering correctness test:
[test_results.json](https://github.com/user-attachments/files/29359914/test_results.json)

- asset test:
https://github.com/isaac-sim/IsaacLab/actions/runs/28196987278/artifacts/7890469555

corresponding golden images are uploaded with 




Fixes # ([OMPE-98494](https://jirasw.nvidia.com/browse/OMPE-98494))

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

- 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

<!--
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: 7.3.0 → 7.4.0
- isaaclab_assets: 0.3.4 → 0.4.0
- isaaclab_newton: 1.3.0 → 1.4.0
- isaaclab_ovphysx: 4.0.0 → 5.0.0
- isaaclab_physx: 2.3.0 → 2.4.0
- isaaclab_tasks: 8.0.7 → 8.1.0
The PhysX schema package registered its joint-drive skip predicate by
importing the register function from the core schemas module at package
import time. That core module imports pxr at module top, so importing the
backend package eagerly pulled USD libraries into otherwise USD-free import
paths (e.g. resolving a robot config), failing the omni/pxr-free import
guard.

Move the registry and registration API into a dedicated USD-free hooks
module so a backend can register its hook at import time without dragging
in pxr.
# Description

Adds the **mesh-collision** schema-fragment API (collision-mesh cooking
approximations).

- `MeshCollisionFragment` marker + `UsdPhysicsMeshCollisionCfg`
(`physics:approximation` token; `UsdPhysics.MeshCollisionAPI` anchor) in
`isaaclab`.
- PhysX cooking fragments in `isaaclab_physx` — `PhysxConvexHullCfg`,
`PhysxConvexDecompositionCfg`, `PhysxTriangleMeshCfg`, `PhysxSDFMeshCfg`
(each its own `physx*Collision:*` namespace + applied schema).
- `NewtonMeshCollisionCfg` / `NewtonSDFCollisionCfg` in
`isaaclab_newton`.
- `apply_mesh_collision` — the default `func` every
`MeshCollisionFragment` carries. It writes the fragment's backend
cooking namespace (via `apply_namespaced`) **and** the shared
`physics:approximation` token its `mesh_approximation_name` implies
(skipping `"none"` so it does not clobber). This keeps the
approximation-token coupling with the fragment, matching the tendon
fragments where the backend application logic lives in a `func` rather
than being special-cased by the caller.
- `apply_mesh_collision_properties` family writer — applies the
`MeshCollisionAPI` anchor, then dispatches each fragment via its `func`
and aggregates the results. It is the same generic shape as the sibling
family writers (`apply_collision_properties`,
`apply_rigid_body_properties`); the shared-token "last non-`none` wins"
behavior emerges from dispatch order rather than a special reduction
pass in the writer body. Core imports no backend.
- The spawner `mesh_collision_props` slot now also accepts a fragment
list.

This PR is purely **additive** and self-contained: it builds only on the
single-namespace schema-fragment base (`SchemaFragment` +
`apply_namespaced`) already in `develop`, existing call sites are
untouched (a transition bridge routes legacy single cfgs to the existing
`define_`/`modify_` writers), and it does **not** depend on any other
open PR.

## Type of change

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

## Screenshots

N/A — non-visual API change.

## Checklist

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

# Conflicts:
#	source/isaaclab/isaaclab/sim/__init__.pyi
#	source/isaaclab/isaaclab/sim/schemas/__init__.pyi
#	source/isaaclab/isaaclab/sim/schemas/schemas_cfg.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset documentation Improvements or additions to documentation infrastructure isaac-lab

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants