URDF Importer Problem cause ROS1Publish Failed. Prim is not an articulation

Isaac Sim Version

☑ 4.2.0

Operating System

☑ Ubuntu 20.04

Detailed Description

We found that when we import URDF, the articulation root is different from the official USD assets. This causes issues when I use the ROS1 publisher.

Steps to Reproduce

The usd, if you want to run directly.
ur5_joint_control.usd.zip (4.2 KB)
To make it easier to reproduce the issue, we used the URDF of the UR5 robot.
ur5_description.zip (3.4 MB)

  1. Creat USD


    Move the ur5 in the stage to be at the same hierarchy level as World.
    And set ur5 as Default Prim

    Save as ur5.usd
    3.Open ur5.usd.

    Add Graph by Script Editor.
import omni.graph.core as og
GRAPH_PATH = "/ActionGraph"
try:
    og.Controller.delete(GRAPH_PATH)
except:
    pass

og.Controller.edit(
    {"graph_path": "/ActionGraph", "evaluator_name": "execution"},
    {
        og.Controller.Keys.CREATE_NODES: [
            ("OnPlaybackTick", "omni.graph.action.OnPlaybackTick"),
            ("PublishJointState", "omni.isaac.ros_bridge.ROS1PublishJointState"),
            ("SubscribeJointState", "omni.isaac.ros_bridge.ROS1SubscribeJointState"),
            ("ArticulationController", "omni.isaac.core_nodes.IsaacArticulationController"),
            ("ReadSimTime", "omni.isaac.core_nodes.IsaacReadSimulationTime"),
        ],
        og.Controller.Keys.CONNECT: [
            ("OnPlaybackTick.outputs:tick", "PublishJointState.inputs:execIn"),
            ("OnPlaybackTick.outputs:tick", "SubscribeJointState.inputs:execIn"),
            ("OnPlaybackTick.outputs:tick", "ArticulationController.inputs:execIn"),

            ("ReadSimTime.outputs:simulationTime", "PublishJointState.inputs:timeStamp"),

            ("SubscribeJointState.outputs:jointNames", "ArticulationController.inputs:jointNames"),
            ("SubscribeJointState.outputs:positionCommand", "ArticulationController.inputs:positionCommand"),
            ("SubscribeJointState.outputs:velocityCommand", "ArticulationController.inputs:velocityCommand"),
            ("SubscribeJointState.outputs:effortCommand", "ArticulationController.inputs:effortCommand"),
        ],
        og.Controller.Keys.SET_VALUES: [
        
            ("ArticulationController.inputs:robotPath", "/ur5/root_joint"),
            ("PublishJointState.inputs:targetPrim", "/ur5/root_joint"),
        ],
    },
)

Then we get Graph like this.


4. Play it, And Error INFO

 2025-05-07 08:40:24 [3,654,157ms] [Error] [omni.graph.core.plugin] 
/ActionGraph/PublishJointState: [/ActionGraph] Prim is not an articulation

Additional Information

Use Offical USD Assets

We found the official USD assets (Isaac/Robots/UniversalRobots/ur5e/ur5e.usd). Although they also have a root_joint, their Articulation Root is bound to the root prim. And they do not have a World or Environment Prim.


We did the same steps as before except urdf import, and it succeeded when using the official assets.

Is this issue caused by the URDF importer? If want to import own URDF and control it using the ROS1 Bridge, how to solve this problem?

We remove the Articulation Root of ‘root_joint’, and add Articulation Root to ‘base_link’.

The ROS1Bridge works successfully, but joint1 is not following well。

I solved this problem by importing the STL files of the robot and then creating the joints to assemble it, instead of using the URDF Importer.


But I couldn’t find the PhysicsJoint type, so I copied it from the Official USD Assets.