Articulation Reordering Part 1/8: Extract rigid object interface test utilities#6334
Conversation
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 SummaryThis PR extracts the backend factory functions and simulator bootstrap logic from
Confidence Score: 4/5Safe 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
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
%%{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
|
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>
# 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
# 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
# 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
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
developsync (Kamino Core, Newton bump, OVPhysX 0.5.1).Stack
Type of change
Checklist
pre-commitchecks with./isaaclab.sh --formatsource/<pkg>/changelog.d/for every touched packageCONTRIBUTORS.mdTest 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 ondevelopin 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 thedevelopbaseline./isaaclab.sh -f-> all hooks pass