Ask Your Question

Programatically load yaml config file to the Parameter Server

asked 2013-03-21 01:26:41 -0500

How should I do that? I've looked up along the roslaunch and dynamic reconfigure code but I don't find it. Do you know any standard function to do it?

By the momment I've done this (but I understand that should exist another way):

config = yaml.load(open(custom_configuration_file))

def recursive_set_param(self, config, key_path=""):
        for k in config.keys():
            data = config[k]

            full_qualified_key = key_path + "/" + k
            if data.__class__ == dict:
                self.recursive_set_param(data, full_qualified_key)
                rospy.set_param(full_qualified_key, config[k])
                rospy.loginfo("SETTING PARAM %s -> %s", full_qualified_key, data)
edit retag flag offensive close merge delete


Any reason why you want to do that? There might be simpler ways to achieve your goal.

dornhege gravatar imagedornhege ( 2013-03-21 01:48:58 -0500 )edit

For sure! and that is what I was looking for!

Pablo Iñigo Blasco gravatar imagePablo Iñigo Blasco ( 2013-03-27 09:48:15 -0500 )edit

3 Answers

Sort by » oldest newest most voted

answered 2013-03-27 09:54:00 -0500

Following the guidelines of dornhege, this looks the code that it is needed to load a yaml file dynamically (tested in Fuerte).

I firstly expected to be able to use the rosparam.yamlmain method. But it is not possible because it is programed using as argument sys.args.

The below for loop looks like it could be avoided using some method, but if such method exist I haven't found it.

import roslib
import rosparam

for params, ns in paramlist:
edit flag offensive delete link more

answered 2013-03-21 01:48:09 -0500

dornhege gravatar image

If you are doing python, you could just use rosparam and reuse its load functionality.

Just check out the basic script in your distro. You should be able to import the function in your script and thus do exactly the same as rosparam load does.

edit flag offensive delete link more


I've followed your guidelines and I found how to do it with the rosparam API. I've added another response to this answer with the code. I expected to find a simple method to import the yaml file, but at the end a few lines of code where needed. Thanks! +1

Pablo Iñigo Blasco gravatar imagePablo Iñigo Blasco ( 2013-03-27 09:56:35 -0500 )edit

By the way. One of the problems of using this dynamic loading approach is that the nodes which uses the dynamic reconfigure server don't notice the change. This is related with this question:

Pablo Iñigo Blasco gravatar imagePablo Iñigo Blasco ( 2013-03-27 09:58:26 -0500 )edit

answered 2013-03-21 02:12:20 -0500

Miquel Massot gravatar image

You can load the yaml file in a launchfile and then, in the node, get the needed params. No parsing needed.

Add to your launchfile a

<rosparam file="path/to/your/file.yaml" />

and in that yamlfile, structure it like this:

  param_name1: value
  param_name2: value

  param_name1: value
  param_name2: value
edit flag offensive delete link more


yeah but that forces you to load the configuration file through a launch file. In my case, my node wants to load at runtime and proactively a configuration file (without the human intervention).

Pablo Iñigo Blasco gravatar imagePablo Iñigo Blasco ( 2013-03-27 09:17:17 -0500 )edit

but how can we get the param_name1's value in cpp files?

neil gravatar imageneil ( 2017-08-02 01:25:57 -0500 )edit
knxa gravatar imageknxa ( 2017-09-04 09:06:20 -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: 2013-03-21 01:26:41 -0500

Seen: 4,951 times

Last updated: Mar 27 '13