1、什么是动态参数调节

  ROS中的参数服务器无法在线动态更新,也就是说如果Listener不主动查询参数值,就无法获知Talker是否已经修改了参数。这就对ROS参数服务器的使用造成了很大的局限,很多场景下我们还是需要动态更新参数的机制,例如参数调试、功能切换等,所以ROS提供了另外一个非常有用的功能包 —— dynamic_reconfigure,实现这种动态配置参数的机制。
  动态重配置的重点是提供一种标准的方法,将节点的一个子集参数公开给外部重配置。使用客户端程序,例如gui,可以向节点查询一组可动态配置的参数,包括它们的名称、类型、范围,并向用户提供一个自定义接口。

2、动态参数配置GUI(rqt_reconfigure)

  rqt_reconfigure工具可以在不重启系统的情况下,动态配置ROS系统中的参数,但该功能的使用需到在代码中设置参数的相关属性,来支持参数的动态配置。使用如下命令启动该工具:

$ rosrun rqt_reconfigure rqt_reconfigure

例如下图是启动机器人仿真环境时,不同节点所能提供的可动态配置参数的可视化:

3、实现自定义参数的动态调节

3.1、创建配置文件(.cfg)

  首先通过以下命令创建一个功能包——dynamic_tutorials:

$ catkin_create_pkg dynamic_tutorials rospy roscpp dynamic_reconfigure

  实现动态参数配置需要编写一个配置文件,在功能包中创建一个放置配置文件的cfg文件夹,然后在其中创建一个配置文件dynamic_tutorials/cfg/Tutorials.cfg,代码如下:

#!/usr/bin/env python
PACKAGE = "dynamic_tutorials"
#初始化ROS,并导入参数生成器
from dynamic_reconfigure.parameter_generator_catkin import *
#初始化参数生成器
gen = ParameterGenerator()
#定义需动态配置的参数,格式为
#gen.add(name , type, level, description, default, min, max)
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, "dynamic_tutorials", "Tutorials"))

详细解读
一、gen.add()

gen.add(name , type, level, description, default, min, max)

name:参数名,使用字符串描述;
type:定义参数的类型,可以是int_t, double_t, str_t, 或者bool_t;
level:需要传入参数动态配置回调函数中的掩码,在回调函数中会修改所有参数的掩码,表示参数已经进行修改;
description:描述参数作用的字符串;
default:设置参数的默认值;
min:可选,设置参数的最小值,对于字符串和布尔类型值不生效;
max:可选,设置参数的较大值,对于字符串和布尔类型值不生效;

二、枚举类型

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)

  这里定义了一个int_t类型得到参数“size”,该参数的值可以通过一个枚举列出来。枚举的定义使用enum方法进行定义,其中使用const方法定义每一个枚举值的名称、类型、值、描述字符串。

三、生成TutorialsConfig.h文件

exit(gen.generate(PACKAGE, "dynamic_tutorials", "Tutorials"))

第二个参数为运行时的节点名,第三个参数为生成文件所使用的前缀,需要与配置文件名相同。

3.2、配置文件

  两种方法:
一、手动添加权限
  使用如下命令添加配置文件的可执行权限:

$ chmod a+x cfg/Tutorials.cfg

  类似于消息的定义,这里也需要生成代码文件,所以在CMakeLists.txt中添加如下编译规则:

#add dynamic reconfigure api
generate_dynamic_reconfigure_options(  cfg/Tutorials.cfg  #...)
# make sure configure headers are built before any node using them
add_dependencies(dynamic_reconfigure_node ${PROJECT_NAME}_gencfg)

二、自动添加
  适用于代码移植,直接自动由.cfg文件编译生成。

set (DYNAMIC_RECONFIGURE_PATH cfg/Tutorials.cfg)
execute_process(COMMAND chmod a+x ${DYNAMIC_RECONFIGURE_PATH}WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}RESULT_VARIABLE cmd_resultOUTPUT_VARIABLE cmd_ver)
message(STATUS "Chmod a+x the dynamic_reconfigure file")generate_dynamic_reconfigure_options(${DYNAMIC_RECONFIGURE_PATH}
)

3.3、创建服务器节点

  dynamic_reconfigure_node节点的代码实现server.cpp如下,代码解析在代码注释中

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
//TutorialsConfig.h为 #3.2 编译过程中自动生成头文件
#include <dynamic_tutorials/TutorialsConfig.h>//定义回调函数,当客户端请求修改参数时,服务端即可跳转到回调函数中进行处理。
//传入值有两个,一个是参数更新的配置值,一个是表示参数修改的掩码
void callback(dynamic_tutorials::TutorialsConfig &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节点ros::init(argc, argv, "dynamic_tutorials");//创建了一个参数动态配置的服务端实例,参数配置的类型就是配置文件中描述的类型//该服务端实例会监听客户端的参数配置请求。dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig> server;    dynamic_reconfigure::Server<dynamic_tutorials::TutorialsConfig>::CallbackType f;    //并将回调函数和服务端绑定f = boost::bind(&callback, _1, _2);    server.setCallback(f);    ROS_INFO("Spinning node");    ros::spin();    return 0;
}

  在 CmakeLists.txt 中加入以下编译规则:

# for dynamic reconfigure
add_executable(dynamic_reconfigure_node src/server.cpp)
# make sure configure headers are built before any node using them
add_dependencies(dynamic_reconfigure_node ${PROJECT_NAME}_gencfg)
# for dynamic  reconfigure
target_link_libraries(dynamic_reconfigure_node ${catkin_LIBRARIES})

  然后使用catkin_make命令编译dynamic_tutorials功能包。

3.4、实现参数动态配置

  编译成功后使用如下命令将roscore和dynamic_reconfigure_node运行起来:

$ roscore
$ rosrun dynamic_tutorials dynamic_reconfigure_node

  这个时候参数动态配置的服务端就运行起来了,使用ROS提供的可视化参数配置工具来修改参数:

$ rosrun rqt_reconfigure rqt_reconfigure

  在打开的如下图所示的可视化界面中,可以通过输入、拖动、下拉选择的方式动态修改参数,输入方式的不同和配置文件中的参数设置有关,例如设置了参数的较大最小值,就会有拖动条;设置为枚举类型,就会是下拉选项。

  修改后可以在服务端的终端中看到修改成功的打印信息,如下图所示:
参考文献:

  1. ROS机器人开发实践 第十二章 (P409–12.4)
  2. ROS dynamic reconfigure
  3. ROS_Dynamic Reconfig 动态参数调节

ROS:Dynamic Reconfigure 动态参数调节相关推荐

  1. ROS中动态坐标变换(动态参数调节+动态坐标变换)

    目录 坐标变换详解 静态坐标变换与动态坐标变换的区别 项目文件解析 CMakelist文件的配置 Package.xml文件配置 动态参数调节:frame_change.cfg 动态参数调用+坐标系数 ...

  2. C++编写Config类ROS动态参数总结

    文章目录 1.C++编写Config类 1.1Config的头文件 1.2Config的cpp文件 1.3调用Config的类读取txt 2.ROS中的Config动态参数 2.1动态参数编写 2.2 ...

  3. ROS机器人程序设计(原书第2版)3.4 设置动态参数

    3.4 设置动态参数 如果一个节点配置了一个动态重配置参数服务器,在工作中就可以使用rqt_reconfigure进行修改.运行下面的代码启动一个带有几个参数动态重配置的服务器(见功能包cfg文件夹中 ...

  4. ros中move_group的参数动态设置

    为什么80%的码农都做不了架构师?>>>    1.写一个配置文件 cfg/ElfinBasicAPIDynamicReconfigure.cfg #!/usr/bin/env py ...

  5. 游戏里常见的动态难度调节机制(DDA, dynamic difficulty adjustment)

    原作者:Caleb Compton 有一类隐藏机制相比之下更加多样化且普遍--调整游戏难度和平衡的机制.这些机制被总称为动态难度调节(dynamic difficulty adjustment,下文简 ...

  6. [ROS]动态参数设置-可视化调试-创建cfg文件

    用途:调试时(尤其在导航和建图应用中)需要经常修改程序中的参数值,这时无论时修改命令行,还是编写固定修改参数的可执行文件,都无法满足要求.ROS为我们提供了动态参数设置机制. 一.创建cfg文件 创建 ...

  7. 无失真压缩法可以减少冗余_混音笔记(七)——压缩器(2)压缩器参数调节方法...

    上一篇总结了压缩器的基本参数概念,这篇总结压缩器的参数调节思路与使用方法. 一.门限如何设置 设置门限的一个关键思路就是你的压缩目的是什么,比如我只想把峰值压一压,或者我想让细节更突出一点,亦或者我是 ...

  8. 深度神经网络调参数技巧,神经网络参数调节方法

    1.神经网络算法中,参数的设置或者调整,有什么方法可以采用 若果对你有帮助,请点赞. 神经网络的结构(例如2输入3隐节点1输出)建好后,一般就要求神经网络里的权值和阈值.现在一般求解权值和阈值,都是采 ...

  9. cpufreq动态频率调节(Sofia3GR)浅析及应用层APK实现

    cpufreq动态频率调节浅析 cpufreq核心部分的代码都在:/drivers/cpufreq/cpufreq.c中,本文章是基于SOFIA3GR 6.0的代码进行解析,linux内核版本3.14 ...

最新文章

  1. struts1 几种Action父类的比较
  2. bash mysql 循环输出_Bash实用技巧:同时循环两个列表
  3. 转)SQL 优化原则
  4. java css路径_java web开发中CSS路径有问题吗,运行jsp文件为什么找不到css文件?...
  5. 乐高科技系列搭建指南 pdf_玩转乐高创意亲子搭建系列(4)小颗粒作品
  6. PyTorch深度学习:60分钟入门(Translation)
  7. access两位小数不进位_人教版小学数学三年级下册笔算乘法(不进位)公开课优质课课件教案视频...
  8. ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX
  9. 《CCNA学习指南:Cisco网络设备互连(ICND2)(第4版)》——本章小结
  10. CSS盒模型完整介绍
  11. 地球轨道计算方法,开普勒三大定律的证明,补充-解析几何之椭圆
  12. Python和FFmpeg将语音记录转换成可共享的视频,非常炫酷。
  13. 活动倒计时的一些想法
  14. TensorFlow RunTime(TFRT) 小试
  15. 盘点软件可以解决哪些固定资产盘点问题
  16. 【绝对干货】kafka偏移量设置
  17. DAYTIME(daytime可数吗)
  18. 训练SSD时,viz报错
  19. qt中制作添加 .ts 翻译文件
  20. google search

热门文章

  1. 希拉里“邮件门”调查暂停
  2. 基金评价专题1:绩效指标
  3. 解决文件下载输出流中文件名称不显示中文问题
  4. 阿里云服务器spring boot 发送QQ邮件25端口被封怎么办
  5. Vector - CAPL - CANoe硬件配置函数 - 05
  6. MP4文件太大怎么变小?简单的方法是什么?
  7. 微信爬爬猫---公众号文章抓取代码分析
  8. sympybotics机器人工具箱安装
  9. android 软件盘未弹出如何获取高度,Android 软键盘的那些坑,一招搞定!
  10. 导出/导入DataPump参数TRACE - 如何诊断Oracle数据泵(文档 ID 286496.1)