Multiple Joint Drive Types for TurtleBot3 with Open Manipulator

Hi,
TL;DR Is it possible to declare different joint drive types for different links in the same robot model?

I’ve successfully loaded the TurtleBot3 with OpenManipulator into Isaac Sim via URDF Importer.

I also added ROS_JointState and ROS_DifferentialBase and connected them to the model as shown in the pictures below. They seem to work on their own as described beneath the pictures.

To the problem: when I’m using Joint Drive Type Position in the Parser Settings of the URDF Importer, I can control the OpenManipulator via ROS_JointState, but not the ROS_DifferentialBase module connected to the waffle_pi-base of the TurtleBot3. The same problem occurs, vice versa, when I’m selecting Velocity for the “Joint Drive Type”.
I tried to solve the problem by changing Stiffness and Damping Parameters in the Raw USD Properties of the single links according to the information in Robot Properties - URDF Importer Documentation . This does not work as expected. Is there another way to set different Joint Drive Types?

Hi,

Did you import the two robots separately using two different urdf files or was it a single urdf? Can you either attach the urdf you used if it was a custom urdf, or the usd file of the imported robot. (please make sure to use the collect asset method from here if attaching the usd).

Thanks!

Hi qwan,
thanks for your fast response!
I uploaded one urdf-file (pasted below) into issac-sim, which linkes two separate xacro files together. One xacro for the base of the robot (including the differential drive) and another one for the arm (with 5 DOF) on top of the base.

I create the urdf file by using the command

rosrun xacro xacro turtlebot_maniuplation_robot.urdf.xacro > turtebot_manipulation_robot.urdf

The file turtlebot_manipulation_robot.urdf.xacro looks like this:

<?xml version="1.0"?>
<robot name="turtlebot3_manipulation" xmlns:xacro="http://ros.org/wiki/xacro">

  <!-- Include TurtleBot3 Waffle URDF -->
  <xacro:include filename="$(find turtlebot3_description)/urdf/turtlebot3_waffle_pi_for_open_manipulator.urdf.xacro"/>

  <!-- Include OpenMANIPULATOR URDF -->
  <xacro:include filename="$(find turtlebot3_manipulation_description)/urdf/open_manipulator_x.urdf.xacro"/>

  <!-- Base fixed joint -->
  <joint name="base_fixed" type="fixed">
    <origin xyz="-0.092 0.0 0.091" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="link1"/>
  </joint>

</robot>

I hope this helps to clarify my probem. I would like to know if it is possible to link the separate xacro-files (converted to urdfs and loaded into isaac) inside isaac-sim like the above urdf-file does beforehand. Or, alternatively, if it is possible to import the joined urdf as described in the main question and add two different drive types?

Thanks again for your help!

Your import should be okay.
Have you tried to use the joint drive specifically only for the arm joints? something like this:

pub = rospy.Publisher("/joint_command", JointState, queue_size=10)

joint_state_position = JointState()
# joint_state_velocity = JointState()

joint_state_position.name = ["joint1","joint2","joint3","joint4","gripper","gripper_sub"]
# joint_state_velocity.name = ["wheel_left_joint", "wheel_right_joint"]

rate = rospy.Rate(0.5)
joint_state_position.position = np.array([0.4,0.2,0.2,0.2,0,0])
# joint_state_velocity.velocity = np.array([20, -20])

while not rospy.is_shutdown():
  pub.publish(joint_state_position)
  # pub.publish(joint_state_velocity)
  rate.sleep()

Then the differential base topic will take commands on the /cmd_vel topic for the left and right wheels. Or if you comment in the velocity controlled joints, you should also be able to control the wheels using the same command topic.

If that doesn’t work, let us know what behavior you observe. The arm+base combination I was experimenting with was a little lopsided, so you’ll need to change the mass of the base or the friction of the wheels to make sure the wheels make good contact with the ground to move.