Bootstrap

ROS使用动态参数

 在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

 运行结果如下所示



;