Unable to publish joint states isaac sim 4.0.0: Prim is not an articulation

Hi,
I have been using isaac sim for a while now and I am transitioning from Isaac Sim 2022.2.1 to 4.0.0. I am trying to get the publish joint state action graph node and articulation controller to work.
Here are 2 scenarios that I face:

  • If I import the robot through the urdf importer and with the action graph below, then my robot arms move but I get the error 2024-07-02 17:51:40 [93,722ms] [Error] [omni.graph.core.plugin] /adam/ros_interface_controller/PublishJointState: [/adam/ros_interface_controller] Prim is not an articulation

  • If I follow what was done in the moveit example where the default prim path (/adam) is the articulation root. The arms start going in circles like a random number generator is constantly setting the joint position. (this is with no joint commands being published)

The URDF works in Isaac sim 2022.2.1 unchanged.
Here is what I got so far:

def setup_robot_action_graph(self, robot_prim_path):
        robot_controller_path = f"{robot_prim_path}/ros_interface_controller"
        og.Controller.edit(
            {"graph_path": robot_controller_path, "evaluator_name": "execution"},
            {
                og.Controller.Keys.CREATE_NODES: [
                    ("OnPlaybackTick", "omni.graph.action.OnPlaybackTick"),
                    ("ReadSimTime", "omni.isaac.core_nodes.IsaacReadSimulationTime"),
                    ("Context", "omni.isaac.ros2_bridge.ROS2Context"),
                    ("PublishJointState", "omni.isaac.ros2_bridge.ROS2PublishJointState"),
                    ("SubscribeJointState", "omni.isaac.ros2_bridge.ROS2SubscribeJointState"),
                    ("ArticulationController", "omni.isaac.core_nodes.IsaacArticulationController"),
                ],
                og.Controller.Keys.SET_VALUES: [
                    ("PublishJointState.inputs:topicName", "isaac_joint_states"),
                    ("SubscribeJointState.inputs:topicName", "isaac_joint_commands"),
                    ("ArticulationController.inputs:robotPath", f"{robot_prim_path}"),
                    ("PublishJointState.inputs:targetPrim", f"{robot_prim_path}"),
                    # ("ArticulationController.inputs:usePath", False),
                ],
                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"),
                    ("Context.outputs:context", "PublishJointState.inputs:context"),
                    ("Context.outputs:context", "SubscribeJointState.inputs:context"),
                    ("SubscribeJointState.outputs:jointNames", "ArticulationController.inputs:jointNames"),
                    ("SubscribeJointState.outputs:positionCommand", "ArticulationController.inputs:positionCommand"),

                ],
            }
        )
# set_target_prims(primPath=f"{robot_controller_path}/ArticulationController", targetPrimPaths=[robot_prim_path])
 set_target_prims(primPath=f"{robot_controller_path}/PublishJointState", targetPrimPaths=[robot_prim_path])

I am following these examples:
https://docs-prod.omniverse.nvidia.com/isaacsim/latest/ros2_tutorials/tutorial_ros2_manipulation.html

Steps to reproduce similar behavior:

  1. Open a new scene in isaac sim 4.0.0
  2. git clone https://github.com/unitreerobotics/unitree_ros.git
  3. Isaac Utils → Workflows → URDF Importer
    a) Set the input directory to unitree_ros/robots/h1_description/urdf/h1_with_hand.urdf
  4. Create-> physics ->ground plane
  5. Create the following action graph from ROS2 Joint Control: Extension Python Scripting — Omniverse IsaacSim latest documentation

Scenario 1 (robot moves but no joint states published)
a) Click on ROS2 Publish Joint State and set target prim to /World/h1
b) Click on Articulation Controller and set robot path to /World/h1

Scenario 2 (robot arms start flailing around but stop after a bit)
a) In the stage tab /World/h1/root joint, remove the articulation root
b) /World/h1 add the articulation root
c) Click on ROS2 Publish Joint State and set target prim to /World/h1
b) Click on Articulation Controller and set robot path to /World/h1

Result:

EDIT: If you follow the same step except if you import the PX5 (Create->Isaac->Robots->Xiao Peng) similar behavior happens
Instead, if you import Franka (Create->Isaac->Robots->Franka-> Franka) It works as intended
I am guessing it is something wrong with 2 armed robots.

Hello, I’m facing the same problem as you. In my case, I imported a URDF file with a dual arm setup and can reproduce the two scenarios that you described. In the second scenario, the robots’ base links cannot be fixed on the desk. If you solve the problem, could you give me some suggestions to fix this problem? Much appreciated!

I am yet to find a solution for my problem. For you make sure that the links in the arms have inertial elements and a mass. If you can share the URDF and meshes I will be more than happy to help debug it with you.

I think I fixed my issue, but I am not entirely sure why I was getting the behavior that I was seeing.
For starter the fact that the articulation root has to be the same as the robot prim path (E.g /franka not /franka/root_joint) in order to use the Joint State publisher is the root cause of the problem. Hopefully that is fixed in future releases. When I move the articulation root from the root joint to the robot prim path it seems like self-collisions gets enabled somehow. The only way I could fix this was moving away from simpler meshes to the robot meshes that do not collide. If you are facing similar issue, feel free to message me or reply to this post and I will help you out.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.