ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Load Parameters using roslaunch saved as .yaml from RQT Dynamic Reconfigure

asked 2017-11-20 18:00:38 -0500

surajmshanbhag gravatar image

updated 2017-11-20 18:04:21 -0500

Hello All,

I have a motor controller board which is tuned using a ros node. The parameters of this board need to be tuned only once and then use the tuning parameters at each launch. Currently I have two parts to this node. Part A launches the node with parameters in a config.yaml file. The contents of which i manually typed in. Part B launches the dynamic reconfiguration tool and helps me figure out the values of these parameters ( which i manually type into config.yaml) . I can then save the current configuration from dyn reconfigure using the save icon in rqt (top left) ( let say this file is dynConfig.yaml ).

I want to launch Part A of the node using rosparam load with dynConfig.yaml as the file instead of config.yaml. If i directly use the dynConfig.yaml file in launch file i get the following error

error loading <rosparam> tag: 
    'param' attribute must be set for non-dictionary values
XML is <rosparam command="load" file="$(find drive_control)/cfg/dynConfig.yaml"/>
The traceback for the exception was written to the log file

My understanding is that this is because dynamic reconfigure adds some additional lines in the dynConfig.yaml which the rosparam is not expecting. these are the first few lines of the file when saved from rqt.

  groups: !!python/object/new:dynamic_reconfigure.encoding.Config
      groups: !!python/object/new:dynamic_reconfigure.encoding.Config
          PORT_1: !!python/object/new:dynamic_reconfigure.encoding.Config

I want to know if there is a way that i can either convert dynConfig.yaml formatting to the .yaml that roslaunch expects or a way to directly save it in the right formatting. OR if i am doing it entirely the wrong way.

Thank you

edit retag flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted

answered 2019-11-30 04:26:38 -0500

artemiialessandrini gravatar image

updated 2019-12-01 20:53:10 -0500

jayess gravatar image

I completely agree, dynamic_reconfigure tutorials explanation is quite misleading, especially nodes implementation. Answering your question, you need to accomplish 5 steps:

1) Run dynamic reconfiguration tool and tweak your parameters until it's well calibrated;

2) Parameters are automatically stored into Parameter Server, you can find them, using:

rosparam list | grep node


rosparam get /node

3) To store your parameters for further calibration, use dynamic_reconfigure tool:

rosrun dynamic_reconfigure dynparam dump /node config_raw.yaml

4) To store your parameters .yaml file in type of dictionary, use standard rosparam tools:

rosparam dump /node config.yaml

5) Since your parameters are stored in the "right" format, you can use your parameters, e.g. by .xacro format feature

<xacro:property name="props" value="${load_yaml('props.yaml')}"/>

as explained here , or using .launch format

<node name="dynamic_reconfigure_load" pkg="dynamic_reconfigure" type="dynparam" args="load /camera_node_name $(find my_package)/params/camera.yaml" />

for details see here.

edit flag offensive delete link more



Thanks! Note: at least for ROS 1 Noetic, rosparam dump should be used as rosparam dump config.yaml /node . See rosparam dump --help

aguadopd gravatar image aguadopd  ( 2021-07-17 17:19:48 -0500 )edit

Your last code snippet with load from launch file doesn't work for me. I suggest it is related to this issue, which is not yet resolved since 2015...

Divelix gravatar image Divelix  ( 2021-12-28 03:23:20 -0500 )edit

answered 2018-06-20 08:09:06 -0500

knxa gravatar image

I have faced the same problem. The root cause is that rqt_reconfigure dumps not just the dict containing the parameters, but a Config object where the parameters live.

This happens in the rqt_configure source, file

def save_param(self, filename):
    configuration = self.reconf.get_configuration()
    if configuration is not None:
        with file(filename, 'w') as f:
            yaml.dump(configuration, f)

I don't think there is an easy solution for you, except if you are willing to modify the rqt_configure source code you can find the file and modify the second line to:

    configuration = dict(self.reconf.get_configuration())
edit flag offensive delete link more



I know it's not an answer to the question by the OP, but I believe this is what dynparam dump and dynparam load were created for.

gvdhoorn gravatar image gvdhoorn  ( 2018-06-20 08:29:34 -0500 )edit

Is there a way for dynparam dump to dump all the nodes?

Hakaishin gravatar image Hakaishin  ( 2019-08-06 02:52:00 -0500 )edit

Question Tools



Asked: 2017-11-20 18:00:38 -0500

Seen: 4,476 times

Last updated: Dec 01 '19