Skip to content

Articulation Reordering Part 1/8: Extract rigid object interface test utilities#6334

Merged
AntoineRichard merged 3 commits into
isaac-sim:developfrom
AntoineRichard:antoiner/articulation-reordering-p1
Jul 7, 2026
Merged

Articulation Reordering Part 1/8: Extract rigid object interface test utilities#6334
AntoineRichard merged 3 commits into
isaac-sim:developfrom
AntoineRichard:antoiner/articulation-reordering-p1

Conversation

@AntoineRichard

@AntoineRichard AntoineRichard commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Description

Moves the rigid object and rigid object collection interface test factories into shared underscore-prefixed utility modules so later parts can reuse them. Pure code movement with no behavior change and no ordering content.

Part 1/8 of the series splitting #6248 into independently reviewable units. #6248 remains open, untouched, as the reference implementation; this stack was cut from its final tree after a develop sync (Kamino Core, Newton bump, OVPhysX 0.5.1).

Stack

Type of change

  • Test/documentation/refactor change

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • 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
  • My name exists in CONTRIBUTORS.md

Test Plan

  • ./isaaclab.sh -p -m pytest source/isaaclab/test/assets/test_rigid_object_iface.py -> 1478 passed, 12 xfailed
  • ./isaaclab.sh -p -m pytest source/isaaclab/test/assets/test_rigid_object_collection_iface.py -> 1902 passed; the 7 failures + 636 errors are pre-existing on develop in the local environment (OVPhysX 0.4.13 wheel vs the 0.5.x binding API from Fetch OVPhysX wheelhouse CI through NGC + 0.5.1 bump #6314) — fail-set identical to the develop baseline
  • ./isaaclab.sh -f -> all hooks pass

Move the rigid object and rigid object collection interface test
factories into shared underscore-prefixed utility modules so other
interface test files can reuse them. Pure code movement with no
behavior change; part 1 of the articulation reordering series.
@greptile-apps

greptile-apps Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR extracts the backend factory functions and simulator bootstrap logic from test_rigid_object_iface.py and test_rigid_object_collection_iface.py into two new underscore-prefixed utility modules (_rigid_object_iface_test_utils.py and _rigid_object_collection_iface_test_utils.py), so they can be reused by later parts of the articulation-reordering stack. The test files themselves are reduced to pure pytest logic, importing only BACKENDS and the dispatcher function from the new utilities.

  • Two new utility modules are added containing all factory/mock-setup logic; the test files now delegate to them via a bare-name import that relies on pytest inserting the test/assets/ directory into sys.path.
  • Backend detection is refactored from try/except ImportError blocks to importlib.util.find_spec() guards — a subtle behavioral change where a partially-installed backend (package findable but submodule import fails) would now raise at collection time instead of silently skipping that backend.
  • import torch is carried into both utility files but is unused within them.

Confidence Score: 4/5

Safe to merge; the test logic itself is unchanged and all existing tests continue to pass.

The extraction is clean and the test bodies are untouched. The two utility files introduce a minor but real difference in how broken backend installs are handled (find_spec without a surrounding try/except), and carry an unused torch import — neither affects the passing test suite in practice, but they are worth cleaning up before the pattern is copy-pasted into Parts 5–8.

Both new utility files (_rigid_object_iface_test_utils.py and _rigid_object_collection_iface_test_utils.py) deserve a second look for the find_spec import-guard pattern and the unused torch import.

Important Files Changed

Filename Overview
source/isaaclab/test/assets/_rigid_object_iface_test_utils.py New utility module extracted from test_rigid_object_iface.py; uses importlib.util.find_spec() instead of try/except ImportError for backend detection, and imports torch without using it.
source/isaaclab/test/assets/_rigid_object_collection_iface_test_utils.py New utility module extracted from test_rigid_object_collection_iface.py; same find_spec pattern change and unused torch import as the sibling utility file.
source/isaaclab/test/assets/test_rigid_object_iface.py Factory functions and bootstrap removed; now imports BACKENDS and get_rigid_object from the new utility module. Test logic is unchanged.
source/isaaclab/test/assets/test_rigid_object_collection_iface.py Factory functions and bootstrap removed; imports delegated to the new collection utility module. Test logic is unchanged.
source/isaaclab/changelog.d/articulation-reordering-p1.skip Empty .skip file suppressing changelog requirement for this internal refactor PR.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    subgraph Before["Before (monolithic test files)"]
        TRI["test_rigid_object_iface.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object()\n- pytest tests"]
        TRCI["test_rigid_object_collection_iface.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object_collection()\n- pytest tests"]
    end
    subgraph After["After (extracted utilities)"]
        UTIL1["_rigid_object_iface_test_utils.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object()"]
        UTIL2["_rigid_object_collection_iface_test_utils.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object_collection()"]
        TRI2["test_rigid_object_iface.py\n- pytest tests only"]
        TRCI2["test_rigid_object_collection_iface.py\n- pytest tests only"]
        UTIL1 -->|imported by| TRI2
        UTIL2 -->|imported by| TRCI2
        UTIL1 -.->|future reuse| FUT["Part 5-8 articulation tests"]
        UTIL2 -.->|future reuse| FUT
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    subgraph Before["Before (monolithic test files)"]
        TRI["test_rigid_object_iface.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object()\n- pytest tests"]
        TRCI["test_rigid_object_collection_iface.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object_collection()\n- pytest tests"]
    end
    subgraph After["After (extracted utilities)"]
        UTIL1["_rigid_object_iface_test_utils.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object()"]
        UTIL2["_rigid_object_collection_iface_test_utils.py\n- _kitless / AppLauncher init\n- BACKENDS detection\n- create_*() factories\n- get_rigid_object_collection()"]
        TRI2["test_rigid_object_iface.py\n- pytest tests only"]
        TRCI2["test_rigid_object_collection_iface.py\n- pytest tests only"]
        UTIL1 -->|imported by| TRI2
        UTIL2 -->|imported by| TRCI2
        UTIL1 -.->|future reuse| FUT["Part 5-8 articulation tests"]
        UTIL2 -.->|future reuse| FUT
    end
Loading

Comments Outside Diff (1)

  1. source/isaaclab/test/assets/_rigid_object_iface_test_utils.py, line 403-415 (link)

    P2 find_spec without import-level exception handling changes error semantics

    The original test files used try/except ImportError (and AttributeError for ovphysx) around each backend import block, so a partially-broken install would silently skip that backend. The utility files replace this with if importlib.util.find_spec("isaaclab_physx") is not None: — but the naked import inside the if block has no exception handler. If the package is discoverable but a specific submodule fails to load (e.g. a missing C extension in isaaclab_physx.assets.rigid_object.rigid_object), the exception now propagates to the top level and kills the entire test module at collection time rather than just omitting that backend. The same pattern is repeated for the newton and ovphysx blocks, and in _rigid_object_collection_iface_test_utils.py. The original except (ImportError, AttributeError) guard for the ovphysx block is also missing here.

Reviews (1): Last reviewed commit: "Extract rigid object interface test util..." | Re-trigger Greptile

Comment thread source/isaaclab/test/assets/_rigid_object_iface_test_utils.py
AntoineRichard and others added 2 commits July 6, 2026 16:17
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Signed-off-by: Antoine RICHARD <antoiner@nvidia.com>
…t_utils.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Signed-off-by: Antoine RICHARD <antoiner@nvidia.com>
@AntoineRichard
AntoineRichard merged commit 569fcaa into isaac-sim:develop Jul 7, 2026
37 checks passed
AntoineRichard added a commit that referenced this pull request Jul 14, 2026
# Description

Introduces the public joint/body ordering machinery in `isaaclab` core:
the `ArticulationNameMap` type and builder, the ordering preset helper,
the Warp reorder kernels with an explicit visibility contract, the
symbolic convention resolvers (`physx`, `mjwarp`, `robot_schema`), the
`ArticulationCfg.joint_ordering`/`body_ordering` fields, the
`BaseArticulation`/`BaseArticulationData` plumbing that backends wire
into, and the API reference entries.

**Transitional semantics:** no backend consumes the machinery yet, so
configuring an ordering in this intermediate state is a silent no-op
until Parts 3/4/6 land. This is called out in the cfg field docstrings
and resolves quickly as the stack merges.

Part 2/8 of the series splitting #6248 into independently reviewable
units. #6248 remains open, untouched, as the reference implementation;
this stack was cut from its final tree after a `develop` sync (Kamino
Core, Newton bump, OVPhysX 0.5.1).

## Stack

- Part 1/8: #6334 — Extract rigid object interface test utilities
- **Part 2/8 (this PR)**: #6335 — Core ordering foundation
- Part 3/8: #6336 — Newton backend
- Part 4/8: #6337 — PhysX backend
- Part 5/8: #6338 — Extract articulation interface test utilities
- Part 6/8: #6339 — OVPhysX backend
- Part 7/8: #6340 — Cross-backend ordering interface tests
- Part 8/8: #6341 — Events, consumers, and documentation

> [!NOTE]
> All parts target `develop`, so until the preceding parts merge this
PR's diff includes them. The true delta of this part is [this
compare](AntoineRichard/IsaacLab@antoiner/articulation-reordering-p1...antoiner/articulation-reordering-p2).

## Type of change

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

## Checklist

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

## Test Plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab/test/assets/test_articulation_ordering.py` -> 67 passed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab/test/assets/test_articulation_ordering_kernels.py` -> 24
passed
- [x] `./isaaclab.sh -f` -> all hooks pass
AntoineRichard added a commit that referenced this pull request Jul 15, 2026
# Description

Wires ordering into the Newton backend read/write paths. Non-identity
orderings register an unconditional post-step publish that reorders the
core state buffers inside the stepped (and CUDA-graph-captured) region,
keeping the documented Tier-1 capture-safety contract without Python
read guards; `NewtonManager` gains the matching
`register`/`unregister_post_step_callback` API. Actuator torque
telemetry reads live backend state through the ordering map. Also
carries the shared branching USD test fixture used by cross-backend
convention tests here and in later parts.

Part 3/8 of the series splitting #6248 into independently reviewable
units. #6248 remains open, untouched, as the reference implementation;
this stack was cut from its final tree after a `develop` sync (Kamino
Core, Newton bump, OVPhysX 0.5.1).

## Stack

- Part 1/8: #6334 — Extract rigid object interface test utilities
- Part 2/8: #6335 — Core ordering foundation
- **Part 3/8 (this PR)**: #6336 — Newton backend
- Part 4/8: #6337 — PhysX backend
- Part 5/8: #6338 — Extract articulation interface test utilities
- Part 6/8: #6339 — OVPhysX backend
- Part 7/8: #6340 — Cross-backend ordering interface tests
- Part 8/8: #6341 — Events, consumers, and documentation

> [!NOTE]
> All parts target `develop`, so until the preceding parts merge this
PR's diff includes them. The true delta of this part is [this
compare](AntoineRichard/IsaacLab@antoiner/articulation-reordering-p2...antoiner/articulation-reordering-p3).

## Type of change

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

## Checklist

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

## Test Plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_newton/test/assets/test_articulation_ordering_kernels.py`
-> 2 passed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_newton/test/assets/test_newton_actuators_newton.py` ->
76 passed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_newton/test/assets/test_articulation.py` -> 257 passed,
8 skipped, 1 xfailed
- [x] `./isaaclab.sh -f` -> all hooks pass
AntoineRichard added a commit that referenced this pull request Jul 17, 2026
# Description

Wires ordering into the PhysX backend read/write paths using the shared
kernels: fused user-and-backend target writes, lazily refreshed
timestamped `body_mass`/`body_inertia` (see the changelog `Changed`
entry for the semantics change vs develop), and ordering maps resolved
at initialization.

Part 4/8 of the series splitting #6248 into independently reviewable
units. #6248 remains open, untouched, as the reference implementation;
this stack was cut from its final tree after a `develop` sync (Kamino
Core, Newton bump, OVPhysX 0.5.1).

## Stack

- Part 1/8: #6334 — Extract rigid object interface test utilities
- Part 2/8: #6335 — Core ordering foundation
- Part 3/8: #6336 — Newton backend
- **Part 4/8 (this PR)**: #6337 — PhysX backend
- Part 5/8: #6338 — Extract articulation interface test utilities
- Part 6/8: #6339 — OVPhysX backend
- Part 7/8: #6340 — Cross-backend ordering interface tests
- Part 8/8: #6341 — Events, consumers, and documentation

> [!NOTE]
> All parts target `develop`, so until the preceding parts merge this
PR's diff includes them. The true delta of this part is [this
compare](AntoineRichard/IsaacLab@antoiner/articulation-reordering-p3...antoiner/articulation-reordering-p4).

## Type of change

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

## Checklist

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

## Test Plan

- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_physx/test/assets/test_articulation.py` -> 239 passed
- [x] `./isaaclab.sh -p -m pytest
source/isaaclab_physx/test/assets/test_newton_actuators_physx.py` -> 44
passed
- [x] `./isaaclab.sh -f` -> all hooks pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants