目录
编程平台和ROS版本:
Ubuntu16.04 ROS-Kinetic
1.为什么进行动态参数设置?
动态参数设置相当于在运行的ROS节点中添加了一个服务端,使用者可以通过客户端动态的对服务端进行请求,从而修改ROS节点中相关变量的参数值。
2.如何进行动态参数设置
2.1前期配置
ROS的动态配置脚本是用python编写的,因此在新建功能包的时候需要依赖rospy包。即在package的CmakeLists.txt中添加如下代码:
find_package(catkin REQUIRED COMPONENTS
…
rospy
)
catkin_package(
…
CATKIN_DEPENDS ro
同时在XML中添加如下代码:
<build_depend>rospy</build_depend>
<build_export_depend>rospy</build_export_depend>
<exec_depend>rospy</exec_depend>
接下来需要编写配置文件脚本,配置文件负责确定需要动态设置参数的数量、类型以及取值范围。
2.2编写脚本
在ROS的package包中新建一个文件夹命名为cfg,该文件用于放置配置文件脚本。配置文件以.cfg为扩展名。下面以名为car_param.cfg的配置文件进行介绍说明,文件源码如下:
#!/usr/bin/env python
PACKAGE = "internet_test"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("double_param",double_t,0,"A double parameter",0.1,0,1)
gen.add("str_param",str_t,0,"A string parameter","internet_test")
gen.add("int_param",int_t,0,"An int parameter",1,0,100)
gen.add("bool_param",bool_t,0,"A bool parameter",True)
size_enum = gen.enum([gen.const("Low",int_t,0,"Low is 0"), gen.const(" Medium ", int_t,1 , " Medium is 1 "), gen.const("High",int_t,2,"High is 2")],"Select from the list")
gen.add("size",int_t,0,"Select from the list",1,0,2,edit_method=size_enum)
exit(gen.generate(PACKAGE,"internet_test","Test1_"))
修改cfg文件的权限
chmod a+x car_param.cfg(或 chmod 777 car_param.cfg)
下面对代码进行分段说明:
#!/usr/bin/env python
该行代码表明该配置文件是用python编写的脚本
PACKAGE = “internet_test”
该行代码表示该动态配置文件所属的包的名称.
from dynamic_reconfigure.parameter_generator_catkin import *
该行代码用来引入动态参数配置的功能包
gen = ParameterGenerator()
定义参数生成器
gen.add("double_param",double_t,0,"A double parameter",0.1,0,1)
gen.add("str_param",str_t,0,"A string parameter","internet_test")
gen.add("int_param",int_t,0,"An int parameter",1,0,100)
gen.add("bool_param",bool_t,0,"A bool parameter",True)
size_enum = gen.enum([gen.const("Low",int_t,0,"Low is 0"), gen.const(" Medium ", int_t,1 , " Medium is 1 "), gen.const("High",int_t,2,"High is 2")],"Select from the list")
gen.add("size",int_t,0,"Select from the list",1,0,2,edit_method=size_enum)
该段代码定义了double,str,int,bool,enum类型动态变量的添加方法。下面对add函数的原型进行介绍:
gen.add(name, type, level, description, default, min, max)
- name: 表示变量的名称
- type: 表示变量的类型
- level:在回调函数中的掩码,用于区别不同的变量,默认写0
- description: 对变量的简短描述
- default: 变量的默认取值
- min: 变量的最小值
- max: 变量的最大值
需要注意的是字符串类型和bool类型的变量没有最大值和最小值这一项。同时在添加枚举变量的时候,需要在最后添加edit_method=size_enum这一项,size_enum表示枚举变量的名称。
exit(gen.generate(PACKAGE,”internet_test”,”Test1_”))
该行代码表示退出动态参数配置脚本,第三个参数Test1_表示生成的头文件的前缀。
2.3文件预编译
脚本编写完成之后需要对CmakeLists.txt进行配置
在功能包中添加对应依赖项:
find_package(catkin REQUIRED COMPONENTS
....
dynamic_reconfigure
)
配置动态参数文件的位置:
generate_dynamic_reconfigure_options(
cfg/car_param.cfg
)
通过过上述配置之后进行catkin_make编译,参数配置文件会生成对应的头文件:
Test1_Config.h
2.4编写节点程序
节点文件名称为:dynamic.cpp
#include <ros/ros.h>
#include <internet_test/Test1_Config.h>
#include <dynamic_reconfigure/server.h>
void callback(internet_test::Test1_Config &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, "reconfigure_test");
dynamic_reconfigure::Server<internet_test::Test1_Config> server;
dynamic_reconfigure::Server<internet_test::Test1_Config>::CallbackType f;
f = boost::bind(&callback,_1,_2);
server.setCallback(f);
ros::spin();
return 0;
}
节点文件的原理就是通过给动态参数的服务器绑定对应的回调函数,从而实现对参数的动态设置。(动态参数的服务器端,及回调函数的参数意义有待进一步深入研究。)
2.5节点文件的配置及运行
在CmakeLists.txt中添加对应的节点配置:
add_executable(dynamic src/dynamic.cpp)
add_dependencies(dynamic internet_test_gencfg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(dynamic
${catkin_LIBRARIES}
)
运行动态配置节点,首先运行roscore,然后运行rosrun internet_test dynamic
最后运行rqt 或者rosrun rqt_console rqt_console
动态配置参数的rqt界面如下图所示。
文章出处登录后可见!