功能簡介
動態配置文件 (dynamic_reconfigure) 提供了一種將 ros 節點內的參數暴露出來的方式。該接口可以讓用戶在節點運行時通過客戶端動態的調整參數,實時的觀察特定參數參數對節點內算法的影響。
常用命令
rqt_reconfigure
rosrun rqt_reconfigure rqt_reconfigure
命令行工具
$ rosrun dynamic_reconfigure dynparam list # list configureable nodes
$ rosrun dynamic_reconfigure dynparam get # get node configuration
$ rosrun dynamic_reconfigure dynparam set # configure node
$ rosrun dynamic_reconfigure dynparam set_from_parameters # copy configuration from parameter server
$ rosrun dynamic_reconfigure dynparam sdynparam dump # dump configuration to file
$ rosrun dynamic_reconfigure dynparam sdynparam load # load configuration from file
詳細介紹可以參考:【鏈接】【教程 tutorial】
code 實現
創建 .cfg 文件
catkin_create_pkg --rosdistro ROSDISTRO dynamic_tutorials rospy roscpp dynamic_reconfigure
mkdir cfg
#!/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)
exit(gen.generate(PACKAGE, "dynamic_tutorials", "Tutorials"))
增加可執行權限
chmod a+x cfg/Tutorials.cfg
修改 cmakelist.txt
#add dynamic reconfigure api
#find_package(catkin REQUIRED dynamic_reconfigure)
generate_dynamic_reconfigure_options(
cfg/Tutorials.cfg
#...
)
# make sure configure headers are built before any node using them
add_dependencies(example_node ${PROJECT_NAME}_gencfg)
【原文鏈接】
c++ node 調用
#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <dynamic_tutorials/TutorialsConfig.h>
void callback(dynamic_tutorials::TutorialsConfig &config, uint32_t level) {
ROS_INFO("Reconfigure Request: %d %f %s %s %d",
config.int_param, config.double_param,
config.str_param.c_str(),
config.bool_param?"True":"False",
config.size);
}
int main(int argc, char **argv) {
ros::init(argc, argv, "dynamic_tutorials");
dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig> server;
dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig>::CallbackType f;
// bind 是一組重載的函數模板.用來向一個函數(或函數對象)綁定某些參數.bind的返回值是一個函數對象.
f = boost::bind(&callback, _1, _2);
server.setCallback(f);
ROS_INFO("Spinning node");
ros::spin();
return 0;
}
【boost::bind用法】
【原文鏈接】