Repository navigation
Migrate in-repo call sites to physics schema fragments - #7838
Merged
ooctipus merged 14 commits intoSep 19, 2026
Merged
Conversation
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
requested review from
AntoineRichard,
StafaH,
aserifi,
david-cao-mueller,
fatimaanes,
huidongc,
hujc7,
kellyguo11,
marcodiiga,
ooctipus,
pbarejko,
peterd-NV,
rilei-nvidia and
rubengrandia
as code owners
September 15, 2026 23:31
7 tasks done
This was referenced 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)
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)
Collaborator
|
run-ci |
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.
Collaborator
|
run-ci |
4 tasks done
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>
4 tasks done
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>
7 tasks done
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
DeprecationWarningon import.Mapping applied, with each field placed in the fragment whose USD namespace actually owns it:
RigidBodyPropertiesCfgUsdPhysicsRigidBodyCfg+PhysxRigidBodyCfgCollisionPropertiesCfgUsdPhysicsCollisionCfg+PhysxCollisionCfgMassPropertiesCfgMassCfgArticulationRootPropertiesCfgPhysxArticulationCfg+NewtonArticulationCfgJointDrivePropertiesCfgUsdPhysicsDriveCfg+PhysxJointCfg*MeshCollisionPropertiesCfgPhysx*Cfgcooking fragmentsfix_root_link,ensure_drives_existWhy 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_assetsconfigs 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:All 35 in-repo sites are updated here. The
isaaclab_assetschangelog fragment carries the migration guidance.A behavior trap worth reviewing carefully
The legacy
modify_articulation_root_propertiesdoes not only write the PhysX namespace — it also mirrorsenabled_self_collisionsontonewton:selfCollisionEnabledand appliesNewtonArticulationRootAPI(schemas.py:612-619).PhysxArticulationCfgwrites 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
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 (maxJointVelocity3.0 → 171.887 on revolute, unconverted on prismatic) and theDriveAPI:angularvs:linearinstance 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(), sinceGetAppliedSchemas()drops token-authored schemas such asNewtonArticulationRootAPI.Green: parity 7,
test_schema_fragments14,test_articulation_fragments29,test_collision_fragments19,test_mass_fragments9,test_joint_drive_fragments22,test_tendon_fragments18,test_material_fragments21,test_schema_writer_nested_targets16,test_schemas_shim142,test_spawn_shapes12,test_spawn_meshes19,test_spawn_wrappers6.Whole-repo smokes, identical to clean
develop: all 29isaaclab_assets.robotsmodules import, gym registry holds 206 entries, and 48/48 registeredenv_cfg_entry_pointconfigs 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:
cuda:1run passed all 15 selected limit/gravity tests.Full CI will rerun on the pushed commit.
Checklist
pre-commitchecks with./isaaclab.sh --formatsource/<pkg>/changelog.d/for every touched packageCONTRIBUTORS.mdor my name already exists there