Ask Your Question

How to change the robot_description paramter for the joint_trajectory_controller

asked 2017-07-25 08:12:55 -0500

Panda1638 gravatar image

Dear ROS community,

i am simulating a ABB IRB2400 robot arm in gazebo controlling it with MoveIt. This is working so far. My goal is to simulate two arms. So i moved them in different namespaces and give their descriptions different names. The Problem that now is occurring that the joint_trajectory_controllercant find the 'robot_description' parameter on the parameter server.

The errors i get are:

[ERROR] [1500973451.323217096, 0.454000000]: Could not find parameter robot_description on parameter server
[ERROR] [1500973451.323364757, 0.454000000]: Failed to parse URDF contained in 'robot_description' parameter
[ERROR] [1500973451.323468398, 0.454000000]: Failed to initialize the controller
[ERROR] [1500973451.323531930, 0.454000000]: Initializing controller 'arm_controller' failed
[ERROR] [WallTime: 1500973452.325133] [1.452000] Failed to load arm_controller

I looked up in the Wiki and the code and as far as i know there is no way to tell the joint_trajectory_controller to look for the robot description under a different name than 'robot_description'. Am i wrong? Is there a simple way i am overseeing?

If there is no way implemented i would like to do so. But i could use some enlightening on how to do that a good way. Entering the robot description in the yaml file describing the controller would be the way i would choose. But i have not yet found the part of the code wich parses the arguments from the yaml to the actual controller.

edit retag flag offensive close merge delete


I managed to implement the use of a different robot description. It was quite easy after i understood how everything works. I copied the joint_trajectory_controller package and renamed it. Than you need to register it under that name. To get a different description i added a parameter to the server.

Panda1638 gravatar image Panda1638  ( 2017-08-01 05:18:52 -0500 )edit

Could you please elaborate on what was required to "register it under that name"?

drcra gravatar image drcra  ( 2018-05-24 16:37:53 -0500 )edit

3 Answers

Sort by ยป oldest newest most voted

answered 2017-08-24 04:09:42 -0500

Panda1638 gravatar image

updated 2017-08-29 03:46:43 -0500

As my own comment said i managed to change the joint trajectory controller to get a parameter from the parameter server. If anyone is interested in details let me know.

Details: I basically just changed one line of code in the joint_trajectory_controller_impl.h from:

urdf::ModelSharedPtr urdf = getUrdf(root_nh, "robot_description");


std::string robot_description = "robot_description";
controller_nh_.getParam("robot_description", robot_description);
boost::shared_ptr<urdf::Model> urdf = getUrdf(root_nh, robot_description);

Now i can add robot_description : my_robot_description to the yaml file and the controller will look it up.

edit flag offensive delete link more


Yes, you should post the details here please.

jayess gravatar image jayess  ( 2017-08-24 11:13:06 -0500 )edit

I added them to my answer.

Panda1638 gravatar image Panda1638  ( 2017-08-29 03:50:23 -0500 )edit

answered 2017-08-28 04:35:25 -0500

You can remap parameter just like topics, so for instance this works:

  <node pkg="robot_self_filter" type="self_filter" name="self_filter">
    <remap from="robot_description" to="robot_description_self_filter" />

For ros_control, things might be a little more complicated as the remapping has to be performed for the node, which is the controller_manager that loads a joint_trajectory_controller.

edit flag offensive delete link more


Thanks for your Answer. I was aware of that :) I solved the problem already myself, but i can't accept my own answer haha.

Panda1638 gravatar image Panda1638  ( 2017-08-29 03:48:46 -0500 )edit

answered 2020-05-10 17:07:17 -0500

INSA gravatar image

Dear Panda1638

I changed the line of code that you suggest in the joint_trajectory_controller_impl.h file from

urdf::ModelSharedPtr urdf = getUrdf(root_nh, "robot_description");


std::string robot_description = "robot_description";
controller_nh_.getParam("robot_description", robot_description);
boost::shared_ptr<urdf::Model> urdf = getUrdf(root_nh, robot_description);

and i specified the robot_description in my controllers .yaml file as so :

  robot_description: robot_description
  type: position_controllers/JointTrajectoryController

I recompiled the joint_trajectory_controller pkg and when i try to choose the controller manage ns i get the following error :

Traceback (most recent call last):
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_joint_trajectory_controller/", line 271, in _on_cm_change
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_joint_trajectory_controller/", line 243, in _update_jtc_list
    self._robot_joint_limits = get_joint_limits()  # Lazy evaluation
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_joint_trajectory_controller/", line 21, in get_joint_limits
    description = rospy.get_param(key)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/", line 465, in get_param
    return _param_server[param_name] #MasterProxy does all the magic for us
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/", line 123, in __getitem__
    raise KeyError(key)
KeyError: 'robot_description'

This is my robot group namespace in my launch file :

  <group ns="/boom_robot_arm_gazebo">

  <param name="tf_prefix" 
         value="boom_robot_arm_gazebo" />

  <!--   <rosparam file="$(find robot_description)/config/control.yaml" command="load" ns="/robot1" /> -->
  <param name="robot_description" 
         command="$(find xacro)/xacro --inorder $(find boom_robot_gazebo)/urdf/boom_robot_arm_gazebo.xacro"/>

  <!-- Spawning the robot arm initial joint poses don't work because of gazebo_ros_control, maybe in gazebo 11 -->
      <node name="boom_robot_arm_gazebo_spawn" 
            args="-urdf -param robot_description  -model boom_robot_arm_gazebo -x 19 -y 0 -z 0.0 -R 0.0 -P 0.0 -Y -1.57079632679 Turret_Joint 0 -J Boom_Joint 0 -J Boom_telesc1_Joint 0 -J Boom_telesc2_Joint 0 -J Rotary_hydraulic_cylinder_Joint 0 -J Basket_Joint 0 -J Chariot_Joint 0 -J Frame_Joint 0 -J Slider_Joint 0 -J Effector_Joint 0">

  <!-- convert joint states to TF transforms for rviz, etc -->
  <node name="robot_state_publisher_2" pkg="robot_state_publisher" type="robot_state_publisher"

  <!-- init and start Gazebo ros_control interface for boom_robot_arm_gazebo -->
  <include file="$(find boom_robot_gazebo)/launch/boom_robot_arm_gazebo_control.launch"/> 


Can you please help me with this problem. I also tried "robot_description: /boom_robot_arm_gazebo_control/robot_description" in the controllers yaml file.

Thank you

edit flag offensive delete link more


I actually solved the problem. For people having the same problem, just launch rqt in the right namespace like so : rqt robot_description:=/boom_robot_arm_gazebo/robot_description

You don't have to do anything else. Like this, the joint controller wil look for the robot_description in the right namespace. No
raise KeyError(key) KeyError: 'robot_description'

error anymore !

INSA gravatar image INSA  ( 2020-05-11 03:58:28 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools



Asked: 2017-07-25 08:12:55 -0500

Seen: 1,749 times

Last updated: May 10 '20