Ask Your Question
1

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.

!!python/object/new:dynamic_reconfigure.encoding.Config
dictitems:
  UPLOAD_VALUES_PORT_1: false
  UPLOAD_VALUES_PORT_2: false
  groups: !!python/object/new:dynamic_reconfigure.encoding.Config
    dictitems:
      groups: !!python/object/new:dynamic_reconfigure.encoding.Config
        dictitems:
          PORT_1: !!python/object/new:dynamic_reconfigure.encoding.Config
            dictitems:

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

1 Answer

Sort by ยป oldest newest most voted
1

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 dyn_reconf_client_widget.py:

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 dyn_reconf_client_widget.py and modify the second line to:

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

Comments

1

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 imagegvdhoorn ( 2018-06-20 08:29:34 -0500 )edit

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

Hakaishin gravatar imageHakaishin ( 2019-08-06 02:52:00 -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

2 followers

Stats

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

Seen: 1,077 times

Last updated: Jun 20 '18