Differences
This shows you the differences between two versions of the page.
— |
dynamic_reconfigure [2019/03/31 14:49] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Dynamic Reconfigure ====== | ||
+ | |||
+ | The dynamic_reconfigure package provides a means to change node parameters at any | ||
+ | time without having to restart the node. | ||
+ | |||
+ | To create parameters that can be dynamically reconfigured do the following: | ||
+ | |||
+ | ===== Setup the package dependencies ===== | ||
+ | If starting a new package do: | ||
+ | <code bash> | ||
+ | catkin_create_pkg package_name ropsy roscpp dynamic_reconfigure | ||
+ | </code> | ||
+ | |||
+ | If modifying existing package: | ||
+ | <code xml> | ||
+ | <build_depend>dynamic_reconfigure</build_depend> | ||
+ | <build_depend>roscpp</build_depend> | ||
+ | <build_depend>rospy</build_depend> | ||
+ | |||
+ | <build_export_depend>dynamic_reconfigure</build_export_depend> | ||
+ | <build_export_depend>roscpp</build_export_depend> | ||
+ | <build_export_depend>rospy</build_export_depend> | ||
+ | |||
+ | <exec_depend>dynamic_reconfigure</exec_depend> | ||
+ | <exec_depend>roscpp</exec_depend> | ||
+ | <exec_depend>rospy</exec_depend> | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== Make a .cfg file. ===== | ||
+ | |||
+ | Add a config file and call it Something.cfg. Place it in package/cfg directory. | ||
+ | |||
+ | <code python> | ||
+ | #!/usr/bin/env python | ||
+ | PACKAGE = "dynamic_tutorials" | ||
+ | |||
+ | from dynamic_reconfigure.parameter_generator_catkin import * | ||
+ | |||
+ | gen = ParameterGenerator() | ||
+ | |||
+ | gen.add("int_param", int_t, 0, "An Integer parameter", 50, 0, 100) | ||
+ | gen.add("double_param", double_t, 0, "A double parameter", .5, 0, 1) | ||
+ | gen.add("str_param", str_t, 0, "A string parameter", "Hello World") | ||
+ | gen.add("bool_param", bool_t, 0, "A Boolean parameter", True) | ||
+ | |||
+ | size_enum = gen.enum([ gen.const("Small", int_t, 0, "A small constant"), | ||
+ | gen.const("Medium", int_t, 1, "A medium constant"), | ||
+ | gen.const("Large", int_t, 2, "A large constant"), | ||
+ | gen.const("ExtraLarge", int_t, 3, "An extra large constant")], | ||
+ | "An enum to set size") | ||
+ | |||
+ | gen.add("size", int_t, 0, "A size parameter which is edited via an enum", 1, 0, 3, edit_method=size_enum) | ||
+ | |||
+ | # This is important. The second parameter should be the name of the pacakge | ||
+ | # and the third parameter is the prefix of the generated libaries | ||
+ | exit(gen.generate(PACKAGE, "dynamic_tutorials", "Tutorials")) | ||
+ | </code> | ||
+ | |||
+ | Set the config file to be exectutable: | ||
+ | <code bash> | ||
+ | chmod a+x cfg/Tutorials.cfg | ||
+ | </code> | ||
+ | |||
+ | Add the following to the CmakeLists.txt: | ||
+ | <code cmake> | ||
+ | # add dynamic reconfigure api | ||
+ | #find_package(catkin REQUIRED dynamic_reconfigure) | ||
+ | generate_dynamic_reconfigure_options( | ||
+ | cfg/Tutorials.cfg | ||
+ | ) | ||
+ | |||
+ | # If using a c++ node, make sure that you add this dependency so that | ||
+ | # the library gets generated before building the node | ||
+ | # add_dependencies(example_node ${PROJECT_NAME}_gencfg) | ||
+ | </code> | ||
+ | |||
+ | ===== Using the .cfg library in your node ===== | ||
+ | |||
+ | You can do this in python or c++. Import the generated Config library and attach a | ||
+ | callback function to get the parameter updates. Then do whatever you want with the | ||
+ | parameters! Yay! Follow these tutorials: | ||
+ | |||
+ | [[http://wiki.ros.org/dynamic_reconfigure/Tutorials/SettingUpDynamicReconfigureForANode%28python%29|Python]] | ||
+ | [[http://wiki.ros.org/dynamic_reconfigure/Tutorials/SettingUpDynamicReconfigureForANode%28cpp%29|C++]] | ||
+ | |||