Skip to content

feat(schemas): articulation-root schema-fragment API (additive)#7

Draft
vidurv-nvidia wants to merge 6 commits into
vidurv/schema-frag-frameworkfrom
vidurv/schema-frag-articulation
Draft

feat(schemas): articulation-root schema-fragment API (additive)#7
vidurv-nvidia wants to merge 6 commits into
vidurv/schema-frag-frameworkfrom
vidurv/schema-frag-articulation

Conversation

@vidurv-nvidia

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

Copy link
Copy Markdown
Owner

Description

Additive articulation-root fragment family

  • physx: PhysxArticulationCfg (physxArticulation:*: solver iters, sleep/stabilization, enabled_self_collisions, articulation_enabled)
  • newton: NewtonArticulationCfg (newton:selfCollisionEnabled)
  • apply_articulation_root_properties(...): anchor ArticulationRootAPI presence-gated; fix_root_link is a spawner-level flag (not a fragment field).

⚠️ Review focus: fix_root_link fixed-joint logic was copied from the legacy writer; the create-new-joint branch is not unit-tested (needs Isaac Sim). New path is single-prim (not @apply_nested like legacy). Status: authored, ruff clean, sim verification pending.

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

Type of change

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

Screenshots

N/A — no user-facing visual changes.

Checklist

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

apply_articulation_root_properties applied UsdPhysics.ArticulationRootAPI
unconditionally on the input prim. USD assets author the root on a child
prim (the root link / fixed joint), so this stamped a SECOND root on the
top prim and wrote the fragment properties + fix_root_link logic to the
wrong prim -- a duplicate root that also violates the single-root asset
requirement.

Descend the subtree to the existing root and tune it in place (matching
the legacy @apply_nested modify_articulation_root_properties writer); only
define a fresh root on the input prim when the subtree has none (primitive
or programmatic spawns). Fragments and the fix_root_link reparent logic
now target the resolved root. Also guard an invalid input prim path.

Add a regression test covering the child-root case (verified to fail
before the fix).
Replace the hand-rolled subtree BFS with the existing
get_first_matching_child_prim query helper (predicate =
HasAPI(ArticulationRootAPI)). Same find-or-define behavior; the helper
also validates the path, so the bespoke helper and the separate IsValid
guard are dropped. Pass traverse_instance_prims=False to keep parity with
the legacy @apply_nested writer, which does not author through instances.
The function docstring already explains the find-or-define rationale, so
collapse the inline comments to terse intent. The fix_root_link block is
left untouched -- it is reproduced verbatim from the legacy writer.
The create-new-joint branch of apply_articulation_root_properties was
sim-unexercised (only the toggle-existing-joint case was tested). Add two
tests: (1) fix_root_link=True with no existing joint creates a fixed joint
and reparents the articulation root from the rigid-body root link to its
parent; (2) fix_root_link=True on a non-rigid-body root raises
NotImplementedError.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant