Issue of adding an articulation root in an existing USD file

5.1.0
Ubuntu 22.04

GPU Information:

  • Model: RTX 3060 Ti
  • Driver Version: 580.126.09

Topic Description

Issue of adding an articulation root in an existing USD file.

Detailed Description

At the beginning, I wanted to set up a ROS2 bridge between Isaac Sim and MoveIt2 to control the Piper robotic arm. While building the action graph, Isaac Sim reported:
“The provided pattern list did not match any articulation.”

I investigated and noticed that the robot USD already had an articulation root applied to the root joint of the arm. Because of this:

I could not add another articulation root at a higher-level prim (like the parent folder or the camera mount).

This limitation is expected in Isaac Sim — a robot can only have one articulation root.

I then removed the existing articulation root and attempted to add one to the Piper camera parent, but after doing so:

The components became disordered, and the arm no longer behaved correctly.

It seemed like links and joints were not properly connected, and physics behavior was broken.

I suspect the problem may be related to how primitives are defined as References versus Payloads in my current USD layer?

The robot arm USD file is provided by the manufacturer. I don’t know if there is anything I could do to achieve the simulation with ros2 bridge.

Hi, the issue you’re experiencing is fundamental to USD’s articulation system: you cannot have nested articulation roots, and removing an articulation root disrupts the carefully constructed joint hierarchy.

When you removed the existing articulation root from the arm’s base joint:

  1. Joint solver chain broke - PhysX lost the reference point for computing joint constraints
  2. Drive stiffness/damping lost - Joint controller parameters were reset
  3. Parent-child rigid body relationships broke - Links became independent bodies instead of a connected chain

Isaac Sim provides a utility function specifically for this move_articulation_root(). Here’s an example how to use it:

from isaacsim.core.utils.articulations import move_articulation_root
from pxr import Usd

stage = omni.usd.get_context().get_stage()

#Get the current articulation root (arm_ base joint)
current_root = stage.GetPrimAtPath("/World/Piper/arm_base_link")

#Get the desired new_ root (parent prim - camera mount or folder)
new_root = stage.GetPrimAtPath("/World/Piper")

#Move articulation root safely
move_articulation_root(current_root, new_root)

This function:

  • Safely removes the ArticulationRootAPI from the old location
  • Applies it to the new location
  • Preserves joint configurations and relationships

Thank you so much for answering this question. But it still not working.

My objective is to achieve visualization of MoveIt2 trajectory planning inside Isaac Sim. My MoveIt2 is working completely fine and executes successfully. When connecting to Isaac Sim, I modified my ros2_control.xacro by changing <plugin>mock_components/GenericSystem</plugin> to <plugin>topic_based_ros2_control/TopicBasedSystem</plugin> and added <param name="joint_commands_topic">/isaac_joint_commands</param> and <param name="joint_states_topic">/isaac_joint_states</param>, which match the ROS2 topics from Isaac Sim. After starting the simulation, I get a notification/error.

My main question is about the articulation root. In Isaac Sim, the current articulation root is at /piper_camera/root_joint, and I was considering moving the articulation root to /piper_camera. Do I have to move the articulation root in order for MoveIt trajectory visualization to work in Isaac Sim? I saw that some people were able to achieve MoveIt2 integration without moving the articulation root (WHAT OTHER PEOPLE DO) so I’m confused whether moving the root is actually required, or if the issue is unrelated to the articulation root and instead caused by my ros2_control configuration. I would really appreciate any clarification. Thank you.

Since MoveIt2 is already executing successfully, your joint hierarchy is correct. You do not need to move the articulation root for MoveIt2 trajectory visualization to work in Isaac Sim. The visualization should work with your current setup.

Verify Your Action Graph:

Ensure your ROS2 bridge is configured correctly:

#In your action graph setup_
og.Controller.Keys.SET_VALUES: [
    ("ArticulationController.inputs:robotPath", "/piper_camera/root_joint"),
    ("PublishJointState.inputs:targetPrim", [usdrt.Sdf.Path("/piper_camera/root_joint")]),
    ("PublishJointState.inputs:topicName", "joint_states"),
    ("SubscribeJointState.inputs:topicName", "joint_commands"),
]

If visualization still doesn’t work, check:

  • ROS2 topic names match between MoveIt2 and Isaac Sim
  • Joint names in USD match URDF/SRDF joint names