在ROS系统中实现某个功能时,时常需要外部动态调整参数。例如控制中PID参数的调节,或者需要查看机器人在不同参数下
的性能表现,此时外部参数的动态调节显得极其便利。在ROS中可以通过动态参数功能来实现。接下讲解ROS中动态参数的应用。
1. 创建cfg文件
roscd ROS_Test1
mkdir cfg
vim ROS_Test1_cfg.cfg
编辑内容如下所示:
#!/usr/bin/env python
PACKAGE = "ROS_Test1"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("int_param", int_t, 0, "int parameter", 1, 0, 10);
gen.add("double_param", double_t, 0, "double parameter", .1, 0.0, 1.0);
gen.add("bool_param", bool_t, 0, "bool parameter", True);
gen.add("str_param", str_t, 0, "string parameter", "ROS_Test1");
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, "Hight is 2")],
"Select from the list")
gen.add("size", int_t, 0, "Select from the list", 1, 0, 3, edit_method=size_enum)
exit(gen.generate(PACKAGE, "ROS_Test1", "Test1_"))
代码解释:
#!/usr/bin/env python
PACKAGE = "ROS_Test1"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
以上代码初始化ROS并导入参数生成器。
gen.add("int_param", int_t, 0, "int parameter", 1, 0, 10);
gen.add("double_param", double_t, 0, "double parameter", .1, 0.0, 1.0);
gen.add("bool_param", bool_t, 0, "bool parameter", True);
gen.add("str_param", str_t, 0, "string parameter", "ROS_Test1");
以上代码为加入不同的参数。其中gen.add(...)格式如下:
gen.add(name, type, level, description, default, min, max)
name: 参数的名称
type: 参数类型
level:一个传递给回调的位掩码
description: 一个描述参数
default: 节点启动的初始值
min: 参数最小值
max: 参数最大值
exit(gen.generate(PACKAGE, "ROS_Test1", "Test1_"))
生成必要的文件并退出。上述的cfg中的代码为python代码。
修改cfg文件的权限
chmod a+x ROS_Test1_cfg.cfg(或 chmod 777 ROS_Test1_cfg.cfg)
2. 编辑CMakeLists.txt文件
加入以下代码
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
dynamic_reconfigure
)
generate_dynamic_reconfigure_options(
cfg/ROS_Test1_cfg.cfg
)
3. 编辑cpp文件
roscd ROS_Test1
vim node_e.cpp
编辑内容如下所示
#include "ros/ros.h"
#include <dynamic_reconfigure/server.h>
#include <ROS_Test1/Test1_Config.h>
void callback(ROS_Test1::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, "node_e_dynamic_reconfigure");
dynamic_reconfigure::Server<ROS_Test1::Test1_Config> server;
dynamic_reconfigure::Server<ROS_Test1::Test1_Config>::CallbackType f;
f = boost::bind(&callback, _1, _2);
server.setCallback(f);
ros::spin();
return 0;
}
4. 编译运行
cd ~/catkin_ws
catkin_make
roscore
新开终端执行:
cd ~/catkin_ws
source devel/setup.bash
roslaunch ROS_Test1 Test1_node_e
新开终端执行:
rosrun rqt_console rqt_console
运行结果如下所示