mcpField
U
usd-articulation

usd-articulation

github.com/isaac-simOther4.4k43 installsUpdated 5d ago
Repository

About usd-articulation

usd-articulation is a skill for assembling and validating multi-link robot articulations in USD, aimed at Isaac Sim robot and asset workflows. It provides scripts for fixed-joint assembly, Robot Schema overlays, and structural validation before deployment.

Key features

  1. 01Assemble multi-arm USD robots
  2. 02Create FixedJoint attachments
  3. 03Apply Isaac Robot Schema overlays
  4. 04Validate articulation roots and joint graphs
  5. 05Check semantic links, joints, and frames

Use cases

  1. 01Attaching robot arms to a chassis
  2. 02Retrofitting Robot Schema onto hand-authored USD
  3. 03Checking articulation connectivity before deployment

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/isaac-sim/isaacsim --skill usd-articulation

After installing, type/usd-articulationin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

scripts/
apply_robot_schema.py
multi_arm_assembly.py
validate_articulation.py

Details

From the project README

USD Articulation — Multi-Arm Robots

Purpose

Assemble and validate multi-link robot articulations with ArticulationRootAPI, fixed joints, and Isaac robot schema overlays before deployment.

Prerequisites

  • For standalone schema authoring: matching OpenUSD and isaacsim-robot-schema library artifacts.
  • For live articulation interaction, extension commands, or rendering: built Isaac Sim and the environment from isaac-sim-orchestrator.

Limitations

  • Targets Isaac Sim 6 / Kit 110 unless a section states otherwise.
  • Does not replace official NVIDIA documentation for unsupported edge cases.

Troubleshooting

Error / symptomCauseSolution
Black or empty framesMissing lights or non-RTX render modeAdd dome/key light; confirm RTX / PathTracing settings
Hang on stage load or first renderMDL compile or oversized stageFollow isolation steps in isaac-sim-troubleshooting

Schema authoring versus runtime interaction

The robot schema is generated and packaged from source/libraries/isaacsim_usd_schemas/robot/; use that distribution for standalone schema application and validation with OpenUSD. For robot-motion schema metadata, use the separate isaacsim.robot_motion.schema module. These schema packages do not require a Kit extension registry merely to import.

Kit commands, live timeline interaction, UI, and rendering stay on the Kit route.

Two layers stack on a robot USD:

  1. Physics: UsdPhysics.ArticulationRootAPI, UsdPhysics.Joint, UsdPhysics.RigidBodyAPI, PhysxSchema.PhysxArticulationAPI.
  2. Robot Schema (usd.schema.isaac.robot_schema): semantic overlay used by isaacsim.robot.poser, the importers, manipulators examples, and any tool that walks "this robot's links / joints / named poses".

Rule: visual plausibility is not mechanical correctness. If it doesn't articulate, it doesn't exist.

Available Scripts

ScriptPurposeArguments
scripts/apply_robot_schema.pyApply Isaac Robot Schema overlay to an existing USD articulationsee script --help
scripts/multi_arm_assembly.pyAssemble a multi-arm robot in USD using FixedJointssee script --help
scripts/validate_articulation.pyValidate multi-arm robot USD articulation structureCLI args via sys.argv (see script --help)

Running scripts

From agent runtimes that expose skill execution helpers, invoke helpers with run_script():

run_script("scripts/apply_robot_schema.py", args=["--help"])

From a built Isaac Sim tree, run the same file with ./python.sh (Linux) or python.bat (Windows) from _build/*/release, or execute shell helpers directly when they do not require the simulator.

Multi-arm assembly (correct pattern)

assemble_multi_arm_robot(stage, chassis_usd, arm_usd, robot_root, arm_offset, chassis_body_path, arm_base_path) — spawn chassis + arm, create a FixedJoint, remove ArticulationRootAPI from the arm.

See scripts/multi_arm_assembly.py.

What does not work
  • Referencing the same arm USD twice via sublayer composition.
  • Using over "Geometry" to add arms in a parts layer.
  • Assuming visual presence equals physical attachment.

Robot Schema overlay (Kit 110)

Apply the modern Isaac Robot Schema on top of the physics layer. The URDF/MJCF importers do this automatically; for hand-authored or retrofitted USDs apply it manually.

apply_robot_schema(stage, robot_prim, link_prims, joint_prims, site_prims, robot_type) — apply IsaacRobotAPI on root, IsaacLinkAPI on each link, IsaacJointAPI on each joint, IsaacSiteAPI on grasp/mount frames, then call PopulateRobotSchemaFromArticulation to fill ROBOT_LINKS/ROBOT_JOINTS. Valid robot_type tokens: Default, End Effector, Manipulator, Humanoid, Wheeled, Holonomic, Quadruped, Mobile Manipulators, Aerial.

See scripts/apply_robot_schema.py.

SchemaApplied toRole
IsaacRobotAPI (Classes.ROBOT_API)robot rootrobot_type, ordered link/joint relations, named-pose container
IsaacLinkAPI (Classes.LINK_API)each rigid linkmass/visual aux for tools that walk the chain
IsaacJointAPI (Classes.JOINT_API)each jointsemantic joint metadata
IsaacSiteAPI (Classes.SITE_API)grasp / mount / reference framesnamed frames for IK targets, mounts, sensors
IsaacNamedPose (Classes.NAMED_POSE)pose container primsstored joint configurations (see manipulation-ik)
Classes.SURFACE_GRIPPERend-effector siteauthor surface gripper via CreateSurfaceGripper
Classes.ATTACHMENT_POINT_APIsite or linkattachment points used by accessory tooling

Validation checklist

Before trusting any multi-arm robot:

  1. Exactly 1 UsdPhysics.ArticulationRootAPI on the chassis, nowhere else.
  2. At least one chassis/root-branch FixedJoint anchors each top-level attached subsystem before flatten-before-deploy.
  3. Every joint body is reachable from the single articulation root through one connected joint hierarchy.
  4. IsaacRobotAPI present on the root; robot_type set to a valid token.
  5. ROBOT_LINKS / ROBOT_JOINTS relations populated (call PopulateRobotSchemaFromArticulation if not).
  6. Each grasp frame carries IsaacSiteAPI (not deprecated IsaacReferencePointAPI).
  7. Render from four angles (front, side, 3/4, top).
  8. Send to a vision LLM with a binary question ("Arms attached? PASS/FAIL").

Validation snippet (self-contained)

Run via $ISAAC_SIM_DIR/python.sh. Enforces exactly one ArticulationRootAPI, verifies the entire joint graph is connected to that root, checks for at least one root-branch FixedJoint attachment before flatten-before-deploy, and reports the Robot Schema state.

validate_articulation(usd_path) — assert exactly 1 ArticulationRootAPI, verify hierarchy connectivity, and print root-attached children plus Robot Schema state.

See scripts/validate_articulation.py.

Extend with whatever subsystem path patterns your asset uses. Binary goal: exactly one root, one connected articulated hierarchy, at least one root-branch FixedJoint anchor before flattening, and the Robot Schema overlay present.

Common failures

SymptomCauseFix
Arms render but floatNo FixedJoint to chassisadd FixedJoint
Multiple articulation rootsArm USD has its own rootRemoveAPI(UsdPhysics.ArticulationRootAPI) from arms
Training works but arms independentSeparate articulation treessingle root + FixedJoints
RobotPoser.solve_ik() errors outmissing IsaacRobotAPI / link relationsApplyRobotAPI + PopulateRobotSchemaFromArticulation
Importer applied IsaacReferencePointAPIolder assetre-import with current Isaac Sim, or migrate to IsaacSiteAPI (deprecation warning)
robot_type attribute value rejectedtypo or stale tokenpick from get_allowed_tokens(Attributes.ROBOT_TYPE)

Comments

Markdown supported