关键术语
动态重配置参数:就是动态地调整、设置正在运行的节点的参数值,通过动态重配置,可以更加高效地开发和测试节点,特别是机器人硬件调试的时候,使用动态重配置参数是一个很不错的选择.
创建工作空间(workspace)
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ..
catkin_make
创建功能包(package)
cd ~/catkin_ws/src
catkin_create_pkg custom_dynamic_reconfigure roscpp dynamic_reconfigure
cd ..
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
向功能包添加动态重配置文件(.cfg)
roscd custom_dynamic_reconfigure
mkdir cfg && cd cfg
gedit Tutorials.cfg
向custom_dynamic_reconfigure.cfg文件输入如下的内容:
#!/usr/bin/env python
PACKAGE = "dynamic_reconfigure"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator() #创建一个参数生成器对象
#gen.add(参数名称, 参数类型, 位掩码, 参数描述, 默认值, 最小值, 最大值)
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, "custom_dynamic", "Tutorials"))
#first parameter is namespace's name
#second parameter is node's name
#third parameter is the current file's name
修改CMakeLists.txt文件
将CMakeLists.txt文件的内容修改为如下所示:
cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
cfg/Tutorials.cfg
)
catkin_package(
LIBRARIES custom_dynamic_reconfigure
CATKIN_DEPENDS roscpp std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})
构建功能包,生成相关头文件
cd ~/catkin_ws
catkin_make
向功能包添加动态重配置节点
server.cpp
这里写代码片
#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include "custom_dynamic_reconfigure/TutorialsConfig.h"
void callback(dynamic_reconfigure::TutorialsConfig &config)
{
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, "custom_dynamic_server");
dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig> server;
dynamic_reconfigure::Server<dynamic_reconfigure::TutorialsConfig>::CallbackType f;
f = boost::bind(&callback, _1); //绑定回调函数
server.setCallback(f); //为服务器设置回调函数, 节点程序运行时会调用一次回调函数来输出当前的参数配置情况
ROS_INFO("Spinning node");
ros::spin(); //服务器循环监听重配置请求,当服务器收到重配置请求的时候,就会自动调用回调函数
return 0;
}
修改CMakeLists.txt文件
将CMakeLists.txt文件的内容修改为如下:
cmake_minimum_required(VERSION 2.8.3)
project(custom_dynamic_reconfigure)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
cfg/Tutorials.cfg
)
catkin_package(
LIBRARIES custom_dynamic_reconfigure
CATKIN_DEPENDS roscpp std_msgs dynamic_reconfigure
)
include_directories(${catkin_INCLUDE_DIRS})
add_executable(custom_dynamic_server src/server.cpp)
add_dependencies(custom_dynamic_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(custom_dynamic_server ${catkin_LIBRARIES})
构建功能包,运行动态重配置服务器节点程序
打开终端,输入:
rosrun custom_dynamic_reconfigure custom_dynamic_server
打开另一个终端,输入:
rosrun rqt_reconfigure rqt_reconfigure
至此,编写动态重配置节点的完成了.
Enjoy It!