Robotics StackExchange | Archived questions

Combining URDF-files with tf (static_transform)

Hello, I'm struggling with combining different urdf files (robots). I had some problems when I added everything in one urdf file ( http://answers.gazebosim.org/question/22179/combining-gazebo-plugins-different-ros-controller/ ) so I tried another attempt. I split it up in two different urdf files and made a static transform between the two links.

This is my launch file

    <?xml version="1.0" ?>
<launch>
  <!-- LAUNCH INTERFACE -->

  <!-- The robot name is required for gazebo to spawn a model. -->
  <arg name="robot_name" default="kuka-lwr-gripper"/>

  <!-- The recommended way of specifying the URDF file is to pass it in
       directly. -->
  <arg name="robot_path" default="$(find kuka-lwr-gripper)/robot"/> 
  <arg name="robot_urdf_file" default="$(arg robot_path)/$(arg robot_name)_standalone.urdf.xacro" />
  <arg name="gripper_urdf_file" default="$(arg robot_path)/simple_gripper/simple_gripper_model.urdf.xacro" />

  <!-- <arg name="controllers" default="joint_controllers"/> -->
  <arg name="controllers" default="joint_controllers"/>
  <arg name="t1_limits" default="false"/>

  <arg name="rviz_config" default="$(find lwr_launch)/launch/rviz/rviz_config.rviz"/>
  <arg name="rviz_bringup" default="true"/> <!--If false, do not launch rviz-->

  <arg name="hw_interface_file" default="$(find kuka-lwr-gripper)/config/hw_interface.yaml"/>
  <arg name="controller_config_file" default="$(find kuka-lwr-gripper)/config/controllers.yaml"/>
  <arg name="gazebo_world_file" default="$(find kuka-lwr-gripper)/worlds/simple_environment.world"/>
  <arg name="t1_limits_file" default="$(find kuka-lwr-gripper)/config/t1_joint_limits.yaml"/>
  <arg name="GAZEBO_GUI" default="true"/>

  <!-- gripper parameters -->
  <arg name="gripper_controller_config_file" default="$(find kuka-lwr-gripper)/config/gripper_controllers.yaml"/>

  <!-- ROBOT -->
  <group ns="lwr">
    <param name="robot_description" command="$(find xacro)/xacro $(arg robot_urdf_file)"/>
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
  </group> 


  <!-- GRIPPER -->
  <group ns="my_gripper">
    <param name="robot_description" command="$(find xacro)/xacro $(arg gripper_urdf_file)"/>

    <node name="my_tp_lwr" pkg="tf" type="static_transform_publisher" args="0 0 0.01 0 0 0 lwr_7_link base_link 100"/>

    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
  </group> 


  <!-- GAZEBO -->
  <node name="spawn_urdf1" pkg="gazebo_ros" type="spawn_model" args="-param /lwr/robot_description -urdf -model $(arg robot_name)" respawn="false" output="screen" />
  <node name="spawn_urdf2" pkg="gazebo_ros" type="spawn_model" args="-param /my_gripper/robot_description -urdf -model my_gripper1" respawn="false" output="screen" />

  <!-- enable/disable gui at will, the rviz listens to the simulation -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(arg gazebo_world_file)"/>
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="$(arg GAZEBO_GUI)"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>

  <!-- Load updated joint limits (override information from single_lwr_moveit) to respect T1 mode limits -->
  <group if="$(arg t1_limits)" ns="robot_description_planning">
    <rosparam command="load" file="$(arg t1_limits_file)"/>
  </group>

  <!-- load robotHW configurations to rosparam server -->
  <rosparam command="load" file="$(arg hw_interface_file)"/> 

  <!-- load all controller configurations to rosparam server -->
  <rosparam command="load" file="$(arg controller_config_file)" /> 

  <!-- load the gripper controller configuration to rosparam server -->
  <rosparam command="load" file="$(arg gripper_controller_config_file)"/> 

  <!-- real robot and controllers -->
  <group ns="lwr">
     <!-- spawn only desired controllers in current namespace --> 
     <node name="controller_spawner_js" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="kuka_joint_state_controller"/>
     <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="$(arg controllers)"/>  
  </group>

  <group ns="my_gripper">
     <!-- <param name="robot_description" command="$(find xacro)/xacro.py $(arg robot_urdf_file)"/> -->
     <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="left_finger_joint_position_controller right_finger_joint_position_controller joint_state_controller"/> 
  </group>

  <!-- LAUNCH RVIZ -->

  <node name="lwr_rviz" pkg="rviz" type="rviz" respawn="false" args="-d $(arg rviz_config)"
        output="screen"
        if="$(arg rviz_bringup)"/>

</launch>

When I start this launch file, gazebo and RViz are opening up but and it seems, that the controllers are working with this attempt but I get the following problems: 1) In RViz, the gripper isn't shown as object (only the coordinate systems are visible) and the two fingers of the gripper are about 0.8m away from the base (I have no clue why). 2) In Gazebo, the gripper looks broken and lays on the floor instead on the top of the robot, one finger is oscillating on the base and the other finger is, as in RViz, far far away from the base.

What am I doing wrong?

Asked by steradiant on 2019-03-30 14:21:32 UTC

Comments

Are there any error messages? Are you sure the gripper files are being found? Are they in a different package than your new URDF file?

Asked by fvd on 2019-04-01 00:31:50 UTC

Yes, they are in different packages (the URDF for the robot and the URDF for the gripper; in the same catkin ws though) but that shouldn't be a problem in my opinion. And no, I don't get any errors, that was one reason to post here because I don't know where to search for the problem now. I'm pretty sure, that the gripper files are found, firstly there are no errors and secondly I can see the separate parts in Gazebo (not in RViz).

Asked by steradiant on 2019-04-01 02:21:32 UTC

Can you post a link to a minimal version of your project workspace? Have you tried using a different package for the gripper?

Asked by fvd on 2019-04-01 06:12:42 UTC

I made a github project (I hope everything runs; it's my first time I pushed a project myself). https://github.com/steradiant/minimal_kuka_lwr_gripper

Asked by steradiant on 2019-04-01 07:00:04 UTC

The project doesn't build because 'ncurses.h' is missing and other dependencies cannot be found. After blacklisting the offending packages, Gazebo gives ERROR: cannot launch node of type [controller_manager/spawner]: controller_manager for me. Can you confirm?

Asked by fvd on 2019-04-03 05:59:22 UTC

No, I don't get this error. The launch file starts without errors for me. Have you installed ros_control? If not, pleas run rosrun apt-get install ros-kinetic-ros-control

Asked by steradiant on 2019-04-04 00:29:06 UTC

I think the dependencies of the package were not installed automatically and I didn't use a full ROS image for the test last time.

Asked by fvd on 2019-04-04 05:12:24 UTC

Answers

It looks like there are two robot_state_publisher nodes and controllers publishing in their own namespaces, but Rviz and Gazebo are not getting the data. When I start up your package, the LWR (and gripper; essentially a second robot) are just limp on the floor in Gazebo. In Rviz, no joint states are received for the LWR.

image description

image description

The gripper can be added as a second RobotModel in Rviz if the robot_description is set to /my_gripper/robot_description, but it also receives no joint states. This is because your controllers are publishing to /lwr/joint_states and /my_gripper/joint_states, but Rviz and Gazebo are listening to /joint_states.

I would try this:

  • Combine your URDF by attaching the gripper to the tip of your robot, as described in your other question.
  • Start up your gripper+LWR and their controllers in the same namespace as Gazebo and Rviz

It might be possible to remap both your namespaces to the global /joint_states, but I don't know how to do it. I couldn't find anything on this, except a related post, where someone came to the same conclusion about the single URDF file.

Asked by fvd on 2019-04-04 05:12:28 UTC

Comments

Thanks for the answer! I've already tried one single URDF-model and I also know this post (related post) but I run into the same problem as described there, that every ros control gazebo plugin initialize all joints and therefore I have problems with using the lwr custom controllers and the standard effort controller at the same time (described in the related post an here ). I thought with different URDF files and different namespaces I would probably get rid of this problem.

Asked by steradiant on 2019-04-07 11:54:18 UTC