[ROS]动态参数设置-可视化调试-创建cfg文件
用途:调试时(尤其在导航和建图应用中)需要经常修改程序中的参数值,这时无论时修改命令行,还是编写固定修改参数的可执行文件,都无法满足要求。ROS为我们提供了动态参数设置机制。一、创建cfg文件创建动态参数ROS包(名字:book_dynamic_param),在创建ros包的时候注意加入依赖项roscpp, rospy, dynamic_reconfigure。在功能包下新建cfg文件夹,并创建D
用途:调试时(尤其在导航和建图应用中)需要经常修改程序中的参数值,这时无论时修改命令行,还是编写固定修改参数的可执行文件,都无法满足要求。ROS为我们提供了动态参数设置机制。
一、创建cfg文件
创建动态参数ROS包(名字:book_dynamic_param),在创建ros包的时候注意加入依赖项roscpp, rospy, dynamic_reconfigure。在功能包下新建cfg文件夹,并创建DynamicParam.cfg文件,内容如下:
#!/usr/bin/env python
PACKAGE = "book_dynamic_param"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("IntDyParam",int_t,0,"An Int Parameter",0,0,9)
gen.add("DouDyParam",double_t,0,"A Double Parameter",1.5,0,9)
gen.add("StrDyParam",str_t,0,"A String Parameter","Hello,I'm Robot!")
gen.add("BoolDyParam",bool_t,0,"A Bool Parameter",True)
student_info = gen.enum([gen.const("Name",str_t,"LiLei","Name Information"),
gen.const("Sex",str_t,"Man","Sex Information"),
gen.const("Age",str_t,"18","Age Information")],
"A set contain a student information")
gen.add("StudentInfo",str_t,0,"A studenet information set","LiLei",edit_method=student_info)
exit(gen.generate(PACKAGE,"node_DynamicParam","DynamicParam"))
该配置文件使用Python语言实现,首先需要导入dynamic_reconfigure功能包提供参数生成器,通过gen = ParameterGenerator()创建生成器。这里定义了四个不同类型的参数:int_t、double_t、str_t、bool_t。使用参数生成器的add(name, type, level, description, default, min, max) 方法生成参数,具体用法如下:
(1)name : 参数名,使用字符串描述
(2)type: 定义参数类型,可以是int_t, double_t, str_t, bool_t。
(3)level: 需要传入参数动态配置回调函数中的掩码,在回调函数中会修改所有参数的掩码,表示参数已经进行修改。
(4)description: 描述参数作用的字符串。
(5)default: 设置参数的默认值。
(6)min: 可选,设置参数的最小值,对于字符串和布尔类型值不生效。
(7)max: 可选,设置参数的最大值,对于字符串和布尔类型值不生效。
然后利用gen.enum方法生成一个枚举类型值,最后通过exit生成所有与C++和python相关的文件并推出程序。
exit(gen.generate(PACKAGE,"node_DynamicParam","DynamicParam")) 中,第二个参数表示动态参数运行的节点名,第三个参数是生成文件所使用的前缀,需要和配置文件DynamicParam.cfg名称相同。
配置文件创建完成后,需要为配置文件添加可执行权限,通过执行如下命令实现:
chmod a+x cfg/DynamicParam.cfg
在CMakeLists.txt文件添加以下内容:
generate_dynamic_reconfigure_options(
cfg/DynamicParam.cfg
)
add_dependencies(PubForBeginner ${PROJECT_NAME}_gencfg)
//注意:PubForBeginner 是工作空间已经编译好的可执行节点,我们可以根据自己
//工作空间中的节点任意替换
在....../devel/include/book_dynamic_param文件夹可以看到自动生成的DynamicParamConfig.h
二、创建动态参数设置可执行文件
book_dyparam.cpp
#include "ros/ros.h"
#include "dynamic_reconfigure/server.h"
#include "book_dynamic_param/DynamicParamConfig.h"
//define call back function
void paramCallback(book_dynamic_param::DynamicParamConfig& config,uint32_t level)
{
ROS_INFO("Request: %d %f %s %s %s",
config.IntDyParam,config.DouDyParam,
config.StrDyParam.c_str(),
config.BoolDyParam?"True":"False",
config.StudentInfo.c_str());
}
int main(int argc, char** argv)
{
//initial and name node
ros::init(argc,argv,"node_DynamicParam");
//create node handle
dynamic_reconfigure::Server<book_dynamic_param::DynamicParamConfig> server;
dynamic_reconfigure::Server<book_dynamic_param::DynamicParamConfig>::CallbackType f;
f = boost::bind(¶mCallback,_1,_2);
server.setCallback(f);
ros::spin();
return 0;
}
注解:
(1)dynamic_reconfigure::Server<book_dynamic_param::DynamicParamConfig> server:创建一个参数动态配置服务端实例,参数配置的类型就是配置文件中描述的类型。该服务端实例会监听客户端的参数配置请求。
(2)dynamic_reconfigure::Server<book_dynamic_param::DynamicParamConfig>::CallbackType f:定义回调函数,并将回调函数和服务端绑定,当客户端请求修改参数时,服务端即可跳转到回调函数中进行处理。回调函数有两个传入参数,一个是新的参数配置值,另一个是表示参数修改的掩码。
三、我的CMakeList.txt文件
cmake_minimum_required(VERSION 2.8.3)
project(book_dynamic_param)
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs dynamic_reconfigure)
generate_dynamic_reconfigure_options(
cfg/DynamicParam.cfg
)
catkin_package(
)
include_directories(
include ${catkin_INCLUDE_DIRS}
)
add_executable(book_dyparam
src/book_dyparam.cpp
)
add_dependencies(book_dyparam ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(book_dyparam
${catkin_LIBRARIES}
)
测试:
nanorobot@ubuntu:~/catkin_test$ rosrun book_dynamic_param book_dyparam
启动可视化界面:
rosrun rqt_reconfigure rqt_reconfigure
界面如下:
如图在可视化界面滑动滑柄并勾选不同参数,可以看到如下信息打印:
[ INFO] [1630324846.122919483]: Request: 2 2.700000 Hello,I'm Robot! True Man
[ INFO] [1630324856.262749374]: Request: 4 2.700000 Hello,I'm Robot! True Man
[ INFO] [1630324857.365995972]: Request: 4 5.400000 Hello,I'm Robot! True Man
[ INFO] [1630324860.309818882]: Request: 4 5.400000 Hello,I'm Robot! False Man
[ INFO] [1630324861.333899967]: Request: 4 5.400000 Hello,I'm Robot! True Man
[ INFO] [1630324862.863199146]: Request: 4 5.400000 Hello,I'm Robot! True 18
refenence:本文参考《ROS机器人编程与SLAM算法解析指南》书中例程实现。
更多推荐
所有评论(0)