Skip to content

Migrate in-repo call sites to physics schema fragments - #7838

Merged
ooctipus merged 14 commits into
isaac-sim:developfrom
vidurv-nvidia:vidurv/schema-migrate-all
Sep 19, 2026
Merged

ooctipus merged 14 commits into
isaac-sim:developfrom
vidurv-nvidia:vidurv/schema-migrate-all

Conversation

@vidurv-nvidia

@vidurv-nvidia vidurv-nvidia commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Description

Migrates every in-repo call site from the legacy physics schema config classes to the composable schema fragments, and lands a parity test that proves the two spellings author identical USD.

The fragment framework has been additive so far: both APIs coexist and nothing internal used the new one. This converts the repo's own 150 call sites so the legacy surface can be deprecated next on a clean tree — deprecating first would make our own configs and tests emit DeprecationWarning on import.

Mapping applied, with each field placed in the fragment whose USD namespace actually owns it:

legacy fragments
RigidBodyPropertiesCfg UsdPhysicsRigidBodyCfg + PhysxRigidBodyCfg
CollisionPropertiesCfg UsdPhysicsCollisionCfg + PhysxCollisionCfg
MassPropertiesCfg MassCfg
ArticulationRootPropertiesCfg PhysxArticulationCfg + NewtonArticulationCfg
JointDrivePropertiesCfg UsdPhysicsDriveCfg + PhysxJointCfg
*MeshCollisionPropertiesCfg the Physx*Cfg cooking fragments
fix_root_link, ensure_drives_exist spawner-level flags (not fragment fields)

Why this is one PR rather than one per package: the packages themselves are disjoint, but converting the shipped asset configs changes the shape of their spawner slots, which breaks in-place tuning everywhere downstream. Those 35 sites span 7 packages, so splitting would leave CI red between merges.

Breaking change

Spawner schema slots on shipped isaaclab_assets configs now use a bare fragment for a single schema and a list for multiple schemas. Single-fragment slots retain direct field access; multi-fragment slots require selecting the owning fragment:

# before
FRANKA_PANDA_HIGH_PD_CFG.spawn.rigid_props.disable_gravity = True
robot_cfg.spawn.articulation_props.fix_root_link = True

# after
FRANKA_PANDA_HIGH_PD_CFG.spawn.rigid_props.disable_gravity = True
robot_cfg.spawn.fix_root_link = True   # spawner-level flag, not a fragment field

# multi-fragment slots: select by type rather than index
next(f for f in cfg.spawn.articulation_props if isinstance(f, PhysxArticulationCfg)).enabled_self_collisions = True

All 35 in-repo sites are updated here. The isaaclab_assets changelog fragment carries the migration guidance.

A behavior trap worth reviewing carefully

The legacy modify_articulation_root_properties does not only write the PhysX namespace — it also mirrors enabled_self_collisions onto newton:selfCollisionEnabled and applies NewtonArticulationRootAPI (schemas.py:612-619). PhysxArticulationCfg writes only the PhysX half.

A PhysX-only mapping therefore compiles, passes config-value equality, and silently changes Newton behavior — most configs pass enabled_self_collisions=False, so dropping the mirror turns self-collisions back on. Every migrated site emits both fragments, and the parity test's negative control exists specifically to catch this.

Type of change

  • Breaking change (existing functionality will not work without user modification)

Testing

source/isaaclab/test/sim/test_schema_fragment_parity.py: authors the legacy cfg on one prim of an in-memory stage and the replacement fragments on a sibling, then diffs applied API schemas and every authored attribute. Covers rigid body, collision, mass, articulation root (including the Newton mirror), and joint drive parametrized over revolute and prismatic — that pair pins the rad→deg conversion (maxJointVelocity 3.0 → 171.887 on revolute, unconverted on prismatic) and the DriveAPI:angular vs :linear instance selection.

It includes a negative control asserting the check detects a dropped Newton mirror, verified non-vacuous: supplying the correct mapping flips the control to failing.

Applied schemas are read via GetPrimTypeInfo().GetAppliedAPISchemas(), since GetAppliedSchemas() drops token-authored schemas such as NewtonArticulationRootAPI.

Green: parity 7, test_schema_fragments 14, test_articulation_fragments 29, test_collision_fragments 19, test_mass_fragments 9, test_joint_drive_fragments 22, test_tendon_fragments 18, test_material_fragments 21, test_schema_writer_nested_targets 16, test_schemas_shim 142, test_spawn_shapes 12, test_spawn_meshes 19, test_spawn_wrappers 6.

Whole-repo smokes, identical to clean develop: all 29 isaaclab_assets.robots modules import, gym registry holds 206 entries, and 48/48 registered env_cfg_entry_point configs instantiate.

The CI follow-up also fixes joint-drive fragment reads and floating-root overrides in backend tests. Invalid-articulation fixtures use explicit target mappings so fragment authoring does not create a missing rigid body. Regression gates reject singleton lists in shipped asset/task configs and direct field reads on multi-fragment joint-drive slots. Pink action tests exercise the migrated GR1T2 and G1 robot configs; the controller itself remains unchanged.

Local validation of the follow-up:

  • Schema and Pink component tests: 38 passed. Full Pink IK integration: 23 passed, 1 skipped.
  • Newton articulation limits and gravity tests: 39 passed; invalid-articulation fixtures: 4 passed. A separate cuda:1 run passed all 15 selected limit/gravity tests.
  • PhysX articulation limits, floating-root and gravity tests: 13 passed; invalid-articulation fixtures: 4 passed.
  • OVPhysX CPU/GPU limit tests: 8 passed; invalid-articulation fixtures: 4 passed.
  • Spawning tests: shapes 12, meshes 19, wrappers 6 passed, each in a separate process.
  • Structural audit: no singleton schema keyword lists remain across the PR's 148 Python files. Behavioral and structural regression checks reject the original PR configuration shapes.
  • All pre-commit checks passed.

Full CI will rerun on the pushed commit.

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have added a changelog fragment under source/<pkg>/changelog.d/ for every touched package
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

Replace the inheritance-based ``*PropertiesCfg`` physics-schema
configurations used inside the isaaclab package and its tests with the
composable per-namespace schema fragments. Each field moves to the
fragment that owns its USD namespace: the UsdPhysics* fragments carry
the standard ``physics:*`` attributes, the isaaclab_physx fragments
carry the ``physxRigidBody:*``, ``physxCollision:*``,
``physxArticulation:*`` and mesh-cooking attributes, and MassCfg carries
``physics:mass`` / ``physics:density``.

The legacy articulation-root writer mirrored ``enabled_self_collisions``
into ``newton:selfCollisionEnabled``; fragments only write their own
namespace, so those call sites now pass NewtonArticulationCfg alongside
PhysxArticulationCfg to keep the authored USD identical.

The legacy classes continue to work, so no user configuration needs to
change.

(cherry picked from commit 55eb603)
The physics-schema configuration classes have been superseded by
composable fragments, one per applied USD schema, each writing a single
attribute namespace. Update the test and benchmark call sites in the two
backend packages to pass fragment lists instead of the inheritance-based
cfg objects, splitting every field into the fragment whose USD namespace
owns it (core `UsdPhysics*`/`MassCfg` fragments from `isaaclab.sim.schemas`,
PhysX add-on fragments from `isaaclab_physx.sim.schemas`).

The authored USD is unchanged: the same attributes land in the same
namespaces, and the defining API schemas are still applied on the spawn
targets. The schema tests that exercise the legacy writers on purpose are
left untouched so that coverage is preserved.

(cherry picked from commit 516e3d6)
The legacy articulation-root writer is cross-namespace: besides
`physxArticulation:enabledSelfCollisions` it also applies
`NewtonArticulationRootAPI` and writes `newton:selfCollisionEnabled`
with the same value. `PhysxArticulationCfg` only covers the PhysX half,
so mapping the legacy cfg to that fragment alone drops the Newton
attribute and silently reverts Newton to its schema default.

Pair every migrated articulation fragment that carries
`enabled_self_collisions` with `NewtonArticulationCfg`, matching the
authored USD of the legacy path.

(cherry picked from commit 4170cd2)
Replace the legacy single-cfg physics schema properties on the shipped
robot configurations with composable schema fragments, so each USD
applied schema is authored by exactly one fragment writing one attribute
namespace.

Fields are split by the namespace that owns them: the core
``physics:*`` rigid-body attributes go to ``UsdPhysicsRigidBodyCfg`` and
the ``physxRigidBody:*`` attributes to ``PhysxRigidBodyCfg``; collision
offsets go to ``PhysxCollisionCfg``; articulation solver and sleep
settings to ``PhysxArticulationCfg``; drive type to
``UsdPhysicsDriveCfg``. The non-USD ``fix_root_link`` and
``ensure_drives_exist`` knobs move to the spawner, which is where the
fragment API expects them.

The authored USD attributes and their values are unchanged. Call sites
that tuned a shipped configuration in place now index the fragment list,
and the G1 usage example in the module docstring is updated to the
spawner-level ``fix_root_link``.

(cherry picked from commit 3021c6b)
The legacy articulation-root writer did not only write the PhysX
namespace: whenever ``enabled_self_collisions`` was set it also applied
``NewtonArticulationRootAPI`` and mirrored the value to
``newton:selfCollisionEnabled``. On the fragment path that attribute
belongs to the separate ``NewtonArticulationCfg`` fragment, so it has to
be listed explicitly.

Migrating the configurations to ``PhysxArticulationCfg`` alone therefore
stopped authoring the Newton attribute, leaving Newton on its default
instead of the requested value. Most of these configurations ask for
``enabled_self_collisions=False``, so self-collisions would have been
silently re-enabled under Newton.

Add ``NewtonArticulationCfg(self_collision_enabled=...)`` next to
``PhysxArticulationCfg`` in every configuration that sets
``enabled_self_collisions``, matching the pattern the Allegro, Kuka
Allegro and Shadow Hand configurations already used.

Verified by authoring each configuration onto a synthetic in-memory
stage through the real spawner dispatch and diffing applied schemas and
authored attributes against the pre-migration tree: 58 configurations,
byte-identical USD state.

(cherry picked from commit 620548a)
Task configurations authored physics schemas through the combined legacy
property configs (RigidBodyPropertiesCfg, CollisionPropertiesCfg,
MassPropertiesCfg, ArticulationRootPropertiesCfg, JointDrivePropertiesCfg,
MeshCollisionPropertiesCfg), each of which spans several USD namespaces.
Author them with one fragment per namespace instead, so a reader can see
which applied schema every value lands on.

Each legacy field moves to the fragment whose USD namespace owns it:
UsdPhysics.RigidBodyAPI / CollisionAPI / MassAPI / DriveAPI attributes to
the core fragments, PhysX add-on attributes to the isaaclab_physx ones.
The legacy articulation-root writer mirrored enabled_self_collisions onto
newton:selfCollisionEnabled, so those call sites also carry a
NewtonArticulationCfg. The non-USD fix_root_link and ensure_drives_exist
knobs move from the config onto the spawner, where they belong.

The authored USD is unchanged: every migrated call site was checked by
authoring both spellings onto sibling prims of an in-memory stage through
the real writers and diffing the resulting applied schemas and attributes.

One call site in the NIST assets stays on the legacy path because its
nested mesh-collision config is a Newton legacy class outside this change.

(cherry picked from commit 245ec7b)
Replace the inheritance-based physics-schema cfg classes with the
composable single-namespace schema fragments in the isaaclab_ov,
isaaclab_mimic and isaaclab_contrib packages.

Each legacy cfg is split across the fragments that own its USD
namespaces, so the authored attributes are unchanged:

  RigidBodyPropertiesCfg      -> UsdPhysicsRigidBodyCfg + PhysxRigidBodyCfg
  CollisionPropertiesCfg      -> UsdPhysicsCollisionCfg + PhysxCollisionCfg
  MassPropertiesCfg           -> MassCfg
  ArticulationRootPropertiesCfg -> PhysxArticulationCfg
  JointDrivePropertiesCfg     -> UsdPhysicsDriveCfg + PhysxJointCfg

Fragments whose fields are all unset are dropped, since an empty
fragment would apply its schema without authoring anything. The
deprecated `max_effort` and `max_velocity` aliases are spelled as their
canonical `max_force` and `max_joint_velocity` names.

Equivalence was checked by authoring each legacy cfg and its replacement
fragments onto sibling prims of an in-memory stage and comparing the
resulting applied schemas and attributes.

(cherry picked from commit c7ac882)
The spawner's rigid_props, collision_props, mass_props, articulation_props
and joint_drive_props slots now hold a list of single-namespace schema
fragments, so reaching through the slot for a field (for example
robot.spawn.rigid_props.disable_gravity) raises AttributeError against the
migrated robot configurations.

Rewrite every remaining in-place tuning site to work against the new shape:
select the fragment that owns the field, and set the non-USD fix_root_link
flag on the spawner, which is where it now lives. Where a slot carries more
than one fragment, pick it by type rather than by index so the PhysX and the
Newton halves cannot be confused. The franka_pour scene authors the
self-collision flag in both namespaces, matching what the legacy writer
mirrored automatically.

The authored USD attributes are unchanged.
A fragment list only replaces a legacy schema config faithfully when it
authors the same USD. Add a test that authors the legacy config on one prim
and the replacement fragments on a sibling prim of the same type, then diffs
both the applied API schemas and every authored attribute.

Cover rigid body, collision, mass, articulation root, and joint drive on both
a revolute and a prismatic joint -- the joint pair exercises the DriveAPI
angular/linear instance selection and the radian-to-degree conversion that
applies to angular drives only.

A negative control asserts that a deliberately wrong articulation mapping,
PhysX-only and therefore dropping the newton:selfCollisionEnabled mirror, is
reported as a difference, so the check is shown to detect what it exists for.

The test runs on an in-memory stage without launching Kit.
The migration lands as one change, so collapse the per-package fragments onto
a single slug. Mark the isaaclab_assets entry as breaking: the shipped robot
configurations changed attribute shape, so downstream code that tuned one in
place must select the owning fragment or set the spawner-level flag. Spell
out both migrations in the entry and raise the tier to major accordingly.
@vidurv-nvidia
vidurv-nvidia requested a review from a team September 15, 2026 23:31
@github-actions github-actions Bot added documentation Improvements or additions to documentation asset New asset feature or request isaac-mimic Related to Isaac Mimic team labels Sep 15, 2026
@vidurv-nvidia vidurv-nvidia added the ci:run-docker Trigger the on-demand Docker and GPU CI workflow label Sep 15, 2026
@isaaclab-bot isaaclab-bot Bot removed the ci:run-docker Trigger the on-demand Docker and GPU CI workflow label Sep 17, 2026
kellyguo11 pushed a commit that referenced this pull request Sep 17, 2026
)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[#6457](#6457)
([564a008](564a008)),
then moved into the current Lift tasks in
[#6732](#6732)
([73106da](73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for #7838, #7608, #7832, #7834, and
#7866. [The #7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. #7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.
kellyguo11 pushed a commit that referenced this pull request Sep 17, 2026
A standalone demo that becomes ready at 299 seconds is currently
terminated at the 300-second startup deadline, before its five-second
soak can finish. This caused the arms smoke test in #7608 and #7674 to
fail after printing its setup and reset messages. Stop applying the
startup deadline once the readiness marker has been observed, while
preserving the existing 300-second startup and five-second soak
settings.

The unconditional deadline was introduced by
[#6704](#6704), commit
[16083cc](16083cc).
This fix does not address the separate arms failures in #7838 and #7866
that never reached readiness within 300 seconds.

Validation: the deterministic regression fails on develop and passes
with this change; all 11 supervisor checks pass; `uv run isaaclab -f`
passes.
kellyguo11 pushed a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…im#7869)

A standalone demo that becomes ready at 299 seconds is currently
terminated at the 300-second startup deadline, before its five-second
soak can finish. This caused the arms smoke test in isaac-sim#7608 and isaac-sim#7674 to
fail after printing its setup and reset messages. Stop applying the
startup deadline once the readiness marker has been observed, while
preserving the existing 300-second startup and five-second soak
settings.

The unconditional deadline was introduced by
[isaac-sim#6704](isaac-sim#6704), commit
[16083cc](isaac-sim@16083cc).
This fix does not address the separate arms failures in isaac-sim#7838 and isaac-sim#7866
that never reached readiness within 300 seconds.

Validation: the deterministic regression fails on develop and passes
with this change; all 11 supervisor checks pass; `uv run isaaclab -f`
passes.

(cherry picked from commit 0921d32)
kellyguo11 pushed a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…aac-sim#7870)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[isaac-sim#6457](isaac-sim#6457)
([564a008](isaac-sim@564a008)),
then moved into the current Lift tasks in
[isaac-sim#6732](isaac-sim#6732)
([73106da](isaac-sim@73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and
isaac-sim#7866. [The isaac-sim#7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.

(cherry picked from commit c5d33ef)
@vidurv-nvidia vidurv-nvidia added the ci:run-docker Trigger the on-demand Docker and GPU CI workflow label Sep 17, 2026
kellyguo11 pushed a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…aac-sim#7870)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[isaac-sim#6457](isaac-sim#6457)
([564a008](isaac-sim@564a008)),
then moved into the current Lift tasks in
[isaac-sim#6732](isaac-sim#6732)
([73106da](isaac-sim@73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and
isaac-sim#7866. [The isaac-sim#7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.

(cherry picked from commit c5d33ef)
kellyguo11 pushed a commit to kellyguo11/IsaacLab-public that referenced this pull request Sep 17, 2026
…aac-sim#7870)

Franka Lift can stall while filling its reset-state bank: the updated
`franka_panda.usda` defaults to `Colliders=primitives`, whose first-link
capsule extends 6 cm below the ground. The existing ground-clearance
criterion rejects every candidate, leaving the RSL-RL export batch at
`0/2048` until its 600-second timeout. This PR selects
`Colliders=convex_hulls` on the robot configuration shared by rigid
Franka Lift and Reorient, restoring the previous collision geometry and
successful reset sampling.

The affected asset and reset setup originated in
[isaac-sim#6457](isaac-sim#6457)
([564a008](isaac-sim@564a008)),
then moved into the current Lift tasks in
[isaac-sim#6732](isaac-sim#6732)
([73106da](isaac-sim@73106da)).
The triggering change is external: the production Franka asset's top
layer now selects primitive colliders and reports `Last-Modified:
2026-09-15 22:49:27 GMT`. Controlled comparisons found 0 valid states in
128 draws with the new default; explicit convex hulls and the preserved
old asset both produced 63 valid states from the same draws.

The same reset hang appeared in CI for isaac-sim#7838, isaac-sim#7608, isaac-sim#7832, isaac-sim#7834, and
isaac-sim#7866. [The isaac-sim#7866 RL
log](https://github.com/isaac-sim/IsaacLab/actions/runs/35202342707/job/105139978507)
shows the batch blocked on Franka Lift after environment setup. isaac-sim#7866
fixes the independently configured Franka Pour task; it does not change
Lift's robot configuration. This change covers Lift/Reorient only.

Validation:

- Fresh regression check on this branch: both Lift/Reorient cases failed
without the production fix; all 9 tests in `test_lift_env_cfg.py` passed
with it.
- `uv run isaaclab -f` passed.
- Earlier GPU validation of the identical Lift change completed the
original 2,048-state harvest and reset in 22.169 seconds; the existing
four-task RSL-RL export batch passed in 107.92 seconds.
- Local GPU validation used PyTorch 2.11+cu128, Newton 1.6rc1, and
RSL-RL 5.4.1. The identical Lift fix also passed [the full
locked-environment RL CI job in
isaac-sim#7865](https://github.com/isaac-sim/IsaacLab/actions/runs/35207648168/job/105158711330).

Reset-bank sizes, clearance criteria, export behavior, the global Franka
defaults, and Pour remain unchanged.

(cherry picked from commit c5d33ef)
@ooctipus

Copy link
Copy Markdown
Collaborator

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 19, 2026
Update develop through fa3687d. Remove the raw-target quaternion normalization and extra nullspace damping left by 20ea23a, restoring the test behavior retained by the merged fix in isaac-sim#7868. Preserve the schema fragment migration and remove the superseded OSC test changelog fragment.

Validation: 21 OSC tests, 17 mesh-fragment tests, five CUDA-runtime tests, and uv run isaaclab -f passed.
@ooctipus

Copy link
Copy Markdown
Collaborator

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 19, 2026
@ooctipus
ooctipus merged commit 5d3ad0d into isaac-sim:develop Sep 19, 2026
53 checks passed
ooctipus added a commit that referenced this pull request Sep 20, 2026
…7904)

## Description

Backports ten `develop` PRs to `release/3.0.0`, including the PyTorch
2.12/CUDA 13.0 upgrade, the near-singular OSC fix, and the complete
cfg-first cloning and schema-fragment migrations.

The audit covers September 17, 2026 00:00 UTC through `develop` commit
`4269c29a39e463dd07c74a9704d890d7a5c01e08` (September 19, 23:55 UTC),
against release base `970d21ef48057a2efc3d749c0f2abab8e7e0c30e`.

| Source PR | Included change |
| --- | --- |
| #7777 | Refresh Newton solver transforms after fixed-root pose writes
|
| #7608 | Make direct cloning cfg-first, including assets, callers,
templates, tests, and migration documentation |
| #7895 | Apply the existing CI exclusion for Franka cable/cloth/soft
kitless rendering tests |
| #7872 | Load the CUDA runtime matching PyTorch for Newton graph
capture |
| #7831 | Check authored Newton mesh-collision schema tokens correctly |
| #7834 | Build documentation with the extra that provides Sphinx |
| #7838 | Migrate maintained consumers to physics schema fragments,
including readers and overrides |
| #7840 | Consistently name Isaac Lab 3.1 as the deprecation removal
release |
| #7903 | Handle near-singular operational-space control |
| #7674 | Upgrade PyTorch to 2.12, TorchVision to 0.27, and the CUDA
stack to 13.0, including installer, wheel, and cuRobo compatibility
changes |

All 305 changed non-lock files match the audited `develop` snapshot
exactly. The remaining file, `uv.lock`, matches that snapshot after
substituting the package versions from the release branch's existing
manifests; all 418 package entries were checked. Existing release
package versions, compiled changelogs, documentation routing, and OVRTX
compatibility code remain intact, including the #7880 revert. Source
commit hashes are recorded in the commit messages.

### Already present

#7866, #7870, #7867, #7869, and #7868 were included in #7851; #7819 was
backported by #7884; #7883, #7885, and #7887 were backported by #7889.
#7874, #7888, #7773, #7886, and #7042 were also already present.

The three automatic changelog/version compilation commits are excluded;
the release branch compiles its own fragments and maintains its own
versions.

## Type of change

- Release integration/backport
- Bug fixes and documentation updates
- Breaking changes already accepted for the 3.0 cloning and schema
migrations; their migration guidance and changelog fragments are
included

## Validation

- `uv run --no-sync isaaclab -f`: all checks passed using the existing
shared environment and the release base for changelog validation.
- Focused cloning, OSC feature, schema parity/shim, CLI, and task
configuration suite: **283 passed**.
- Newton fixed-root updates and CUDA runtime/capture regressions: **14
passed**.
- Complete OSC simulation suite: **21 passed**.
- Mesh-collision fragments: **17 passed**; cfg-first cloning
integration: **16 passed**; scene construction/ownership: **7 passed**.
- The above **358 tests passed with PyTorch 2.11**.
- With **PyTorch 2.12/CUDA 13.0**: installer/metadata/Docker tests **91
passed**; CPU/GPU OSC feature tests **17 passed**; complete OSC
simulation suite **21 passed**.
- `uv lock --check`: passed; release package manifests match their
lockfile entries.
- Repository skill validation: **23 skills passed**.
- File-by-file source audit, release-metadata preservation checks, and
`git diff --check`: passed.

Local simulation used RTX 5090 and Isaac Sim 6.0.1 with PyTorch 2.11 and
2.12. The full Docker image build and fresh installation matrix were not
rerun locally for this backport. Release CI uses its pinned Isaac Sim
6.1 image and remains the authoritative full integration check.
Kit-dependent suites run in separate processes to avoid loading
standalone USD before Kit.

## Release backport

Not applicable: this PR targets `release/3.0.0` directly.

## Checklist

- [x] Ran the complete pre-commit command.
- [x] Included the original migration documentation, regression tests,
and changelog fragments for every changed package.
- [x] Preserved source attribution and recorded every source commit.
- [x] Preserved the release branch's versions and existing
release-specific changes.

---------

Co-authored-by: vidurv-nvidia <vidurv@nvidia.com>
Co-authored-by: ooctipus <ooctipus@users.noreply.github.com>
ooctipus added a commit that referenced this pull request Sep 20, 2026
# Description

Marks the legacy physics schema config classes and writers deprecated,
with per-symbol migration guidance. **Nothing is removed.** Per
`AGENTS.md`, this is the prior-release deprecation that a later removal
requires.

Best reviewed after #7838, which converts the repo's own call sites to
fragments. This PR does not depend on it to build or pass — verified
that importing shipped asset configs emits the same 8
`DeprecationWarning`s on this branch and on clean `develop`, so it adds
no new import-time noise — but landing the migration first keeps our own
configs off the deprecated path.

## Scope

**35 classes.** Core: `MassPropertiesCfg`, `RigidBodyBaseCfg`,
`CollisionBaseCfg`, `JointDriveBaseCfg`, `ArticulationRootBaseCfg`,
`MeshCollisionBaseCfg`, `BoundingCube/BoundingSpherePropertiesCfg`.
PhysX: the 9 `Physx*PropertiesCfg` classes plus the 10 2.x aliases.
Newton: 8 `Newton*`/`Mujoco*PropertiesCfg`.

**13 writers.** `define_`/`modify_` × {articulation_root, rigid_body,
collision, mass}, plus `modify_joint_drive_properties`, the two tendon
writers, and `define_`/`modify_mesh_collision_properties`.

**Excluded: everything deformable.** Its fragment families are still in
#6673, so there is nothing to point users at yet. A test asserts the
deformable symbols stay undeprecated so this cannot drift.

## Mechanism

Uses `typing_extensions.deprecated`, which is already a dependency. A
small config-class helper applies it to the generated `__init__` above
`@configclass`, so construction warns once for the concrete class while
importing and defining subclasses remain silent. Signatures, field
aliases, `to_dict()`, `copy()`, `replace()`, and `dataclasses.replace()`
remain intact.

Writers use the standard decorator above `@apply_nested`. Six internal
delegation calls bypass only the deprecation wrapper through
`__wrapped__`, retaining subtree traversal and emitting one warning
naming the public entry point. There is no custom writer decorator or
nesting state. Tests that need the raw per-prim writer use
`inspect.unwrap(writer)` to bypass all decorators;
`modify_*.__wrapped__` now refers to the traversal wrapper.

## Removal version

The legacy cfgs and writers are deprecated in **3.1** and scheduled for
removal in **3.2**.

## Documentation

New migration-guide section in
`docs/source/migration/migrating_to_isaaclab_3-0.rst`: full
deprecated→fragment table, before/after code, the two non-USD flags that
moved to the spawner (`fix_root_link`, `ensure_drives_exist`), the
writer table, and a warning-filter snippet for migrating incrementally.

Also corrects that guide's existing "Class moves and renames" section,
which still recommended `Physx*PropertiesCfg` / `*BaseCfg` as the
"Recommended 3.0 pattern" — exactly what this PR deprecates.

## Type of change

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

## Testing

**292 tests passed** locally:

- `test_schemas_deprecation.py`: 88 passed.
- `test_schemas_shim.py`: 142 passed.
- `test_schemas.py`: 44 passed.
- `test_tendon_fragments.py`: 18 passed.

Covered warning messages and caller locations, construction without
import-time warnings, inherited configs, direct and delegated writers,
nested mesh collision, child traversal, and raw-writer access. A
regression check rejects the removed custom writer decorator and depth
state; it fails on the preceding implementation and passes here.

All 13 writer warning messages are unchanged. An AST comparison verified
that the writer bodies are unchanged apart from the six delegation
calls. `uv run isaaclab -f` passed with the changelog checker configured
against the PR base.

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the `pre-commit` checks with `uv run isaaclab -f`
- [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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Co-authored-by: Octi Zhang <zhengyuz@nvidia.com>
ooctipus added a commit that referenced this pull request Sep 20, 2026
…ters (#7839) (#7908)

## Description

Backports #7839 to `release/3.0.0`. Legacy physics schema configs and
writers emit deprecation warnings naming their schema-fragment
replacements, while the existing APIs continue to work. Includes the
migration guide, the standard `typing_extensions.deprecated`
implementation, and the original changelog fragments. The
fragment-consumer migration from #7838 is already in the release through
#7904.

Exact cherry-pick of `5889bae6e8de7a2b5a6e3ff099f82236d251cd19` onto
release commit `ff22c52891`, with no conflicts or source changes.
Preserves the source removal target of 3.2, release package versions,
and dependency pins.

## Validation

**292 tests passed** locally with PyTorch 2.12:

- Schema deprecation and compatibility tests: **230 passed**.
- Schema integration tests: **44 passed**.
- Tendon fragment tests: **18 passed**.
- `uv run --no-sync isaaclab -f`: all checks passed with changelog
validation against the release base.
- All 13 changed files match the merged source commit; `git diff
--check` passed.

Kit integration tests ran in separate processes on RTX 5090 with Isaac
Sim 6.0.1. Release CI uses its pinned Isaac Sim 6.1 image.

## Release backport

Targets `release/3.0.0` directly; no further backport requested.

Co-authored-by: vidurv-nvidia <vidurv@nvidia.com>
ooctipus added a commit that referenced this pull request Sep 21, 2026
…7530, #7899) (#7926)

## Description

Backports the two changes merged into `develop` since September 19 that
are still missing from `release/3.0.0`:

| Source PR | Change | Source commit |
| --- | --- | --- |
| #7530 | Validate camera outputs against renderer capabilities before
simulator startup | `31d1c53510490c76841e9c35a329574b357d9900` |
| #7899 | Share native resources by construction cfg and centralize
ownership and teardown | `c90c3a1097a0a669a823b880b1c8d0654d7fd267` |

Includes the original regression tests, API documentation, and changelog
fragments. #7530 applied without changes. #7899 required two conflict
resolutions to retain the release branch's OVRTX mapping API,
documentation, and tests. Of its 62 files, 59 match the merged source
exactly; the other three retain those existing release additions.
Release versions, lockfile entries, compiled changelogs, and
documentation routing are preserved.

## Audit

Checked all **33 PRs** merged from September 19, 2026 00:00
America/Los_Angeles through `develop` commit `c90c3a1097` (September 20,
21:29 Pacific), against release base `75e9c8ce12`. **31 are already
backported; the remaining two are included here.** Git first-parent
history and GitHub's merged PR list agree. Automatic changelog/version
compilation remains branch-specific.

<details>
<summary>31 PRs already recorded in release</summary>

| Source PRs | Existing release commit |
| --- | --- |
| #7777, #7608, #7895, #7872, #7831, #7834, #7838, #7840, #7903, #7674 |
[`ff22c52891`](ff22c52)
|
| #7886 |
[`41bfaee5f0`](41bfaee)
|
| #7042 |
[`970d21ef48`](970d21e)
|
| #7905 |
[`f0563d1f9e`](f0563d1)
|
| #7604 |
[`dca7cfe984`](dca7cfe)
|
| #7610, #7603 |
[`5dd2220243`](5dd2220)
|
| #7839 |
[`b8b93bb96e`](b8b93bb)
|
| #6851 |
[`baa025ad90`](baa025a)
|
| #7250 |
[`f86b33e6b1`](f86b33e)
|
| #7910 |
[`24f7b4842b`](24f7b48)
|
| #7810 |
[`9738e096c8`](9738e09)
|
| #7832 |
[`be270ed88b`](be270ed)
|
| #4679 |
[`80157aa22d`](80157aa)
|
| #7914 |
[`01b59b5a22`](01b59b5)
|
| #7502 |
[`db7db61f60`](db7db61)
|
| #7918 |
[`bca9dba8bb`](bca9dba)
|
| #7919 |
[`ef1514c97c`](ef1514c)
|
| #7922 |
[`7d6979a19e`](7d6979a)
|
| #7923 |
[`a1dd560b98`](a1dd560)
|
| #7924 |
[`892e51dc1d`](892e51d)
|
| #7925 |
[`75e9c8ce12`](75e9c8c)
|

</details>

## Validation

**745 tests passed** on the combined backport:

- Core registry, configclass, replication, camera contracts, and task
presets: 158 passed.
- Newton manager/model/reset and coupling suites: 299 passed.
- OVPhysX/OVRTX lifecycle, scene data, bindings, and material contracts:
141 passed on CPU.
- Clone-plan algebra: 83 passed.
- All 8 OV CUDA cases skipped in the CPU run: 8 passed on GPU.
- OVPhysX ray-caster regression: 1 passed.
- Kit simulation-context and PhysX scene-data tests: 54 passed.
- Newton solver reset integration: 1 passed.

The registry-identity and borrowed-config-field regressions both fail
with the pre-backport implementations and pass with this change.
Backport file-scope validation, source-file comparison, `git diff
--check`, and `uv run isaaclab -f` passed.

Local validation used PyTorch 2.12.0/CUDA 13.0, Isaac Sim 6.0.1.0,
Newton 1.6.0rc1, and an RTX 5090. Existing deprecation/runtime warnings
occurred. Full Docker CI is requested separately against the pinned
environment; local checks do not claim a startup or runtime speedup.

## Checklist

- [x] Read the contribution guidelines and ran formatting/changelog
checks.
- [x] Included source tests, documentation, and changelog fragments.
- [x] Verified regression behavior and preserved release-specific
changes.
- [x] Recorded source commit hashes and audited the requested merge
window.

---------

Co-authored-by: Antoine RICHARD <antoiner@nvidia.com>
Co-authored-by: ooctipus <zhengyuz@nvidia.com>
ooctipus pushed a commit that referenced this pull request Sep 24, 2026
# Description

Migrates the remaining in-repo users of the legacy physics schema cfgs
to schema fragments. These classes are deprecated in 3.1 and removed in
3.2 (#7839), so every site here currently emits `DeprecationWarning`s
and would break at removal.

The earlier migration (#7838) converted `source/` but never covered
`scripts/`, and its grep missed the `*BaseCfg` spellings. On top of
that, some new legacy usage has landed since. An AST scan (comments and
docstrings excluded) finds **144 live legacy constructions or writer
calls in 37 files on `develop`. This PR brings that to 0**, outside the
deliberate exclusions listed below.

**Scope**
- **`scripts/` (29 files):** all tutorials, demos (including the MPM
demos), `convert_mesh` / `convert_instanceable`, and three benchmarks.
- **Task configs:** `core/reach/reach_env_cfg.py`,
`contrib/ur10_particle_push`, and one of the five `contrib/nist` sites.
- **Tests:** the camera-pose, first-frame-rendering and
OpenCV-distortion sensor tests; the rigid/mass/collision parts of the
cable and MPM tests; `test_ovphysx_gravity`.

## Mapping rules

Every one of these has caused a real regression in an earlier migration:
- **A bare fragment when one covers the fields.** This keeps in-place
tuning such as `cfg.rigid_props.disable_gravity = True` working
downstream.
- **Empty legacy cfgs map only to the core `UsdPhysics*` fragment.** A
fragment applies its schema even when all of its fields are `None`.
`RigidBodyPropertiesCfg()` therefore becomes `UsdPhysicsRigidBodyCfg()`
alone. Adding `PhysxRigidBodyCfg()` would add a `PhysxRigidBodyAPI` the
legacy class never applied.
- **`enabled_self_collisions` keeps its Newton mirror.** The legacy
writer also authors `newton:selfCollisionEnabled`, so these sites emit
`NewtonArticulationCfg` next to `PhysxArticulationCfg`.
- **`disable_gravity` goes to `PhysxRigidBodyCfg`**, including on
Newton-flavoured cfgs.
- **`define_*` writer calls become `apply_*(...,
create_if_missing=True)`**, which preserves creation.

## Verification

**USD-attribute parity at every site, with negative controls.** Legacy
and fragment forms are authored through the real spawners on sibling
prims, and the harness diffs `GetPrimTypeInfo().GetAppliedAPISchemas()`,
every authored attribute, and relationships.
- `scripts/`: 64 groups. 60 are identical. The other 4 differ only in
that legacy authored `physics:approximation="none"` explicitly, while
the fragment leaves it unset and it resolves to the same `"none"`. 8 of
8 negative controls are flagged.
- `source/`: every site is identical, and every negative control is
flagged.

**Task configs** are also checked end to end. Each task is loaded
through its gym `env_cfg_entry_point` on both `develop` and this branch,
across presets. All 22 affected spawned entities author identical USD,
including the nist Franka on the real asset. A task-level negative
control produces a diff.

**Execution:** 13 scripts ran headless for 100–300 steps with no schema
deprecations: the tutorials, bin_packing, multi_asset, the sensor demos,
and tacsl. `convert_mesh` was run end to end for 6 approximations. All
29 scripts compile. The migrated test files pass.

**Not runnable in the dev environment, so covered by parity only:** the
Newton-physics script paths, including the MPM demos, which need a newer
`newton` than was installed locally. Also the `omni.replicator`, ovrtx,
and Haply scripts. CI covers the rest.

## Deliberately left on the legacy API

- **Spawner, converter, and schema routing internals.** They *are* the
legacy path, which must keep working until 3.2.
- **Tests that exercise or compare the legacy path**, such as
`test_schemas*`, the parity tests, and the legacy arms of the fragment
tests.
- **`integration_scene_cfgs.py`.** It is a backend-neutral core module,
and its `disable_gravity` has no non-PhysX fragment home.
- **Everything deformable.** The deformable deprecation PR, stacked on
#6673, handles it.
- **4 of the 5 `contrib/nist` sites.** They nest a mesh-collision cfg
inside `collision_props`. The deprecation messages point users to a
spawner `mesh_collision_props` slot, but that slot exists only on
`MeshConverterCfg`, not on `UsdFileCfg` or the shape and mesh spawners.
There is no supported fragment path for these sites yet. That gap needs
its own fix before 3.2.

## Found along the way, not changed here

- `RigidBodyMaterialCfg` is deprecated too, and 8 scripts still use it.
- `convert_instanceable.py`'s mesh branch is already broken on
`develop`: it passes `collision_approximation=` to `MeshConverterCfg`,
which raises `TypeError`.
- `docs/source/how-to/write_articulation_cfg.rst` still describes the
legacy names.

## Type of change

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

## Checklist

- [x] I have read and understood the contribution guidelines
- [x] I have run the `pre-commit` checks with `./isaaclab.sh --format`
- [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
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset New asset feature or request documentation Improvements or additions to documentation isaac-mimic Related to Isaac Mimic team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants