Skip to content

Cable attachments to rigid bodies via Newton fixed joints#5731

Draft
mmichelis wants to merge 78 commits into
isaac-sim:developfrom
mmichelis:mym/cable_attachment
Draft

Cable attachments to rigid bodies via Newton fixed joints#5731
mmichelis wants to merge 78 commits into
isaac-sim:developfrom
mmichelis:mym/cable_attachment

Conversation

@mmichelis
Copy link
Copy Markdown
Collaborator

Description

Adds a declarative way to weld a CableObject endpoint ("head" or "tail") to a rigid body on another spawned asset, realized as a Newton-native fixed joint at model-build time. No per-step Python synchronization is required — VBD (and other cross-articulation-aware solvers like XPBD) enforce the constraint natively each step.

Continues on PR #5641.

New public API (isaaclab_contrib.cable)

  • CableAttachmentCfg — dataclass describing one weld: target_prim_path, cable_anchor ("head"/"tail"), and cable_local_{pos,quat} / target_local_{pos,quat} for the parent/child joint frames.
  • CableObjectCfg.attachments: list[CableAttachmentCfg] — zero or more attachments declared per cable.

Cable builder hook (cable_object.py)

  • New per-world hook apply_cable_attachments_to_builder runs after add_registered_cables_to_builder, resolves head/tail body indices recorded on each CableRegistryEntry, looks up the target body in builder.body_label (filtering by body_world so cloning binds to the correct env), and calls add_joint_fixed.
  • Cable articulation labels are now pre-expanded (env_.*env_{world_idx}) at hook time so they match the form of USD-imported sibling bodies under InteractiveScene cloning.
  • CableRegistryEntry gained head_segment_body_indices and tail_segment_body_indices lists (one entry per world).
  • Removed the per-cable CableObject.reset override (replaced by a unified VBD-wide soft reset, see below).

VBD manager (deformable/vbd_manager.py)

  • Generalized the eval_fk skip mask from "non-cable articulations" to _fk_mask covering both JointType.CABLE and JointType.FREE joints — needed because rigid bodies welded to cables share the cable's articulation graph and VBD owns their body_q directly.
  • New NewtonVBDManager.reset(soft=...) override snaps every body (cable segments + rigid bodies) back to its rest-pose Model.body_q and clears body_q_prev, body_qd, body_inertia_q for soft resets, replacing the previous cable-only reset.

Demo

  • scripts/demos/cable_pendulum.py — spawns N cables, each with its tail welded to a rigid plug, optionally equally spaced; supports a wildcard-cloned variant.

New tests

  • All under source/isaaclab_contrib/test/cable/test_cable_attachment.py

Type of change

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

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 updated the changelog and the corresponding version in the extension's config/extension.toml file
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

mmichelis added 30 commits May 20, 2026 17:34
…BasisCurve in USD. Currently only supported in Newton backend as add_rod_graph
@mmichelis mmichelis force-pushed the mym/cable_attachment branch from 70acfd0 to 4e01db5 Compare May 22, 2026 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

2 participants