【ROS】dynamic_reconfigure配置详细说明

2023-05-16

文章目录

文章目录

前言

一、编写.cfg文件

二、为节点配置dynamic_reconfigure

总结


前言

dynamic_reconfigure配置是ROS中为了方便用户对程序中的参数进行实时调整而推出的工具,配置好自己的dynamic_reconfigure文件后,可以很方便的使用ROS提供的rqt_reconfigure工具对程序的参数进行合理调整,以获得最优的性能。

例如:move_base中就针对costmap、planner等设置了很多动态调整的参数,可以方便用户在使用过程中调整得到合适的参数。

又例如:如果我们开发了一个PID控制器程序,如果这时能通过rqt_reconfigure工具,对PID参数进行合理的调整,然后直接将获得的参数写进程序,就能使工作更加高效。

一、编写.cfg文件

1.在功能包文件夹下,创建一个config文件夹(其他名字也行,比如cfg)

在其中创建一个后缀为.cfg的文件

2.在其中写入内容

#!/usr/bin/env python

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()

type_enum = gen.enum([gen.const("centroid", str_t, "centroid", "Use Centroid"),
                      gen.const("initial",  str_t, "initial",  "Use Initial"),
                      gen.const("middle",   str_t, "middle",   "Use Middle")],
                      "An enum to set frontier type")
gen.add("timeout",           double_t, 0, "Explore Timeout(s)", 30.0, 10.0, 100.0)
gen.add("min_frontier_size", double_t, 0, "Min Frontier Size(m)",  0.75,  0.5,   2)
gen.add("visualize",         bool_t,   0, "Is Visualize?",   True)
gen.add("frontier_type",     str_t,    0, "Select Frontier Type",   "centroid", edit_method=type_enum)
gen.add("potential_scale",   double_t, 0, "Distance Weight", 3.0)
gen.add("gain_scale",        double_t, 0, "Gain Weight",     1.0)
gen.add("information_scale", double_t, 0, "Information Weight",     1.2)
gen.add("information_r",     double_t, 0, "Information Radius",     3.0)

exit(gen.generate("explore_server", "explore_server", "Explore"))

进行逐行解析:

#!/usr/bin/env python

from dynamic_reconfigure.parameter_generator_catkin import *

说明这是一个python文件,使用/usr/bin/env下的python解析,并引入dynamic_reconfigure头文件

gen = ParameterGenerator()

创建一个参数生成器,然后可以使用add函数添加动态配置的参数,add函数的参数如下:

  • name - 一个字符串,指定应存储此参数的名称

  • paramtype - 定义存储值的类型,可以是 int_t、double_t、str_t 或 bool_t 中的任何一个

  • level - 稍后将传递给动态重新配置回调的位掩码。当回调被调用时,所有已更改参数的级别值将被或运算在一起,并将结果值传递给回调。

  • description - 描述参数的字符串

  • default - 指定默认值

  • min - 指定最小值(可选,不适用于字符串和布尔值)

  • max - 指定最大值(可选,不适用于字符串和布尔值)

例如:

gen.add("timeout",           double_t, 0, "Explore Timeout(s)", 30.0, 10.0, 100.0)

我想动态设置程序超时时间(timeout),该变量为double类型,位掩码为0,描述是"Explore Timeout(s)",默认值为30.0,最小值为:10.0,最大值为:100.0,这个配置在rqt_reconfigure中的显示如下:

 布尔类型的值没有最大最小值,它在程序中的显示如下:

type_enum = gen.enum([gen.const("centroid", str_t, "centroid", "Use Centroid"),
                      gen.const("initial",  str_t, "initial",  "Use Initial"),
                      gen.const("middle",   str_t, "middle",   "Use Middle")],
                      "An enum to set frontier type")

这里我们可以使用gen.num创建一个枚举类型的变量,让用户可以通过下拉列表选择值,gen.num中有两个参数,一个是gen.const组成的列表,gen.const参数结构和gen.add一样,第二个参数就是枚举类型的描述。

gen.add("frontier_type",     str_t,    0, "Select Frontier Type",   "centroid", edit_method=type_enum)

然后可以通过edit_method=type_enum参数将枚举类型添加进去,最后的显示效果如下:

最后,使用gen.generate生成config文件,并使用exit退出

exit(gen.generate("explore_server", "explore_server", "Explore"))

 gen.generate第一个参数是config的“命名空间”(功能包名),第二个参数是可以在其中运行的节点的名称(仅用于生成文档),第三个参数是生成的文件将获得的名称前缀。

具体来说,第一个参数是我们使用生成的Config文件的命名空间(功能包名)

第二个参数是运行时的节点名

第三个参数是生成配置头文件的前缀,我们需要包含我们生成的配置头文件

 Explore就是头文件的前缀,可以在devel/include/功能包名 看到这个生成的头文件(这和msgs生成类似)

3.CmakeLists.txt和package.xml文件修改 

首先需要在find_package和catkin_package函数中添加dynamic_reconfigure包的依赖

然后在generate_dynamic_reconfigure_options函数中添加.cfg文件,这与生成.msg类似,config/是你定义的文件夹名

最后需要在add_dependencies中添加依赖项${PROJECT_NAME}_gencfg

 在package.xml文件中添加dynamic_reconfigure的依赖

二、为节点配置dynamic_reconfigure

配置好.cfg文件后,就可以在我们自己编写的节点中使用生成的配置文件了。

首先引入头文件:

第一个是dynamic_reconfigure服务器的头文件,用于创建服务器,第二个是我们自己写的.cfg文件生成的头文件,用于使用我们定义的参数。

  dynamic_reconfigure::Server<ExploreConfig> configServer;
  dynamic_reconfigure::Server<ExploreConfig>::CallbackType cb;

然后,我们可以创建两个变量,第一个是动态配置参数服务器,第二个是回调函数,也就是我们使用rqt_reconfigure调参时进入的函数,需要我们自己编写。

void Explore_Server::configCb(ExploreConfig& config, uint32_t level)
{
  ROS_INFO("Dynamic Config Start");
  timeout = config.timeout;
  min_frontier_size_ = config.min_frontier_size;
  visualize_ = config.visualize;
  frontier_type_ = config.frontier_type;
  potential_scale_ = config.potential_scale;
  gain_scale_ = config.gain_scale;
  information_scale_ = config.information_scale;
  information_r_ = config.information_r;
}

然后可以在程序中编写自己的回调函数,我这里进行了赋值操作,当然也可以进行其他操作,这里configCb之前的Explore_Server::是我程序中的命名空间,非必需,大家根据自己程序编写。

cb = boost::bind(&Explore_Server::configCb, this, _1, _2);
configServer.setCallback(cb);

然后使用bind函数将回调函数绑定后赋值给cb变量,然后使用setCallback函数为服务器设置回调函数。

当然,这些修改的参数要在其他类中的方法使用,还应该提供一个参数更新的接口:

search_.configUpdate(min_frontier_size_, potential_scale_, gain_scale_, information_scale_, information_r_);

 最后,可以使用dynparam dump将调好的参数写到文件中:

rosrun dynamic_reconfigure dynparam dump /your_node dump.yaml

也可以使用dynparam load将参数文件再次加载:

rosrun dynamic_reconfigure dynparam load /node dump.yaml

 


总结

到此为止就实现了一个动态参数配置的节点和我们自定义个.cfg文件,在运行程序时,我们就可以使用rqt_configure工具,实时的动态调节程序的参数,帮助我们高效便捷的获得最优程序参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ROS】dynamic_reconfigure配置详细说明 的相关文章

随机推荐

  • Altium Designer(AD)的简易使用

    一 绘制原理图 原理图库 首先来说明原理图的概念 根据百度百科 xff0c 原理图 xff0c 顾名思义就是表示电路板上各器件之间连接原理的图表 也就是表示芯片上的引脚连接什么元件 xff0c 各个元件谁和谁相连 xff0c 电源电压的大小
  • STM32CubeIDE---HAL库PWM使用速记

    一 如何计算 理论分析 xff1a HAL库函数之呼吸灯 PWM波 简书 jianshu com 预分频系数 PSC 自动重装载值 ARR 捕获 比较寄存器值 CCR 频率计算 xff1a 定时器频率 PSC 43 1 ARR 43 1 占
  • mac常用命令

    mac清除电脑DNS缓存 sudo dscacheutil flushcache
  • IMU初介绍及里程计相关补充

    IMU原理 xff1a 以牛顿力学定律为基础 xff0c 通过测量载体在惯性参考系的加速度 xff0c 将它对时间进行积分 xff0c 且把它变换到导航坐标系中 xff0c 就能够得到在导航坐标系中的速度 偏航角和位置等信息 IMU xff
  • C语言变量的定义与声明,为什么全局变量不能赋值

    文章目录 一 对C语言程序的一些补充二 定义域声明2 1 什么是变量2 2 如何定义变量2 3 为什么要定义变量2 4 定义变量的本质2 5 变量声明的本质2 6 定义和声明的区别 三 全局变量无法赋值 一 对C语言程序的一些补充 对于一个
  • 野火PID上位机通信移植

    野火PID上位机通信移植 一 简介 在调试pid参数的时候 xff0c 需要用到上位机 xff0c 这里选用 野火多功能调试助手 使用调试助手 xff0c 需要下位机与上位机之间的通信协议 xff0c 下载野火关于电机的相关例程 xff0c
  • 实验报告数字图像的基本操作

    一 实验目的 了解Matlab的基本功能及操作方法练习图像读写和显示函数的使用方法掌握如何利用MATLAB来获取图像的大小 颜色 高度 宽度等等相关信息熟悉常用的图像文件格式与格式转换 xff1b 二 实验环境 PC计算机MatLab软件
  • 【meArm机械臂】第二篇·Arduino控制程序

    系列文章目录 meArm机械臂 第一篇 结构设计及搭建 meArm机械臂 第二篇 Arduino控制程序 文章目录 系列文章目录前言一 测试程序1 单个电机测试程序2 四舵机控制测试程序3 极限位置测量 二 基本控制程序三 最终控制程序总结
  • 【树莓派4B】安装Ubuntu Mate20.04+ROS Noetic+使用电脑自带的xrdp和VNC进行PC端远程控制

    目录 前言 一 烧录Ubuntu Mate20 04 1 下载Ubuntu Mate 20 04 2 格式化SD卡并烧录系统 3 打开SSH功能 二 配置Ubuntu环境 1 初次开机进行简单的配置 2 更换国内源 3 更新软件列表和软件
  • 【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【ROS】ROS上位机使用Serial库和boost::asio库与STM32进行USART通讯

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【STM32】STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【STM32】STM32F103C8T6实现直流电机速度PID控制

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • Linux配置Supervisor 配置遇到的坑

    在linux中web 应用部署到线上后之后发现退出终端后网站就无法访问了 所以需要用Supervisor来守护进程 xff0c 它可以保证应用一直处于运行状态 xff0c 在遇到程序异常 报错等情况 xff0c 导致 web 应用终止时 x
  • 【基于MATLAB的数字图像处理】第四章·图像增强

    系列文章 基于MATLAB的数字图像处理 第一章 绪论 基于MATLAB的数字图像处理 第二章 视觉系统与图像处理系统 基于MATLAB的数字图像处理 第三章 基本图像变换 基于MATLAB的数字图像处理 第四章 图像增强 基于MATLAB
  • 【ROS】学习路线与方法-个人感悟篇

    文章目录 目录 文章目录 前言 视频学习 书籍学习 个人建议 前言 前前后后 xff0c 对于ROS的学习已经很多遍了 xff0c 可以说走的弯路有点多 xff0c 导致浪费了很多时间 xff0c 其实ROS不应该是一个专门需要去学习的东西
  • 【基于FreeRTOS的STM32F103系统】Heap_4内存管理机制程序详解

    系列文章目录 基于FreeRTOS的STM32F103系统 简介及官方文件移植 基于FreeRTOS的STM32F103系统 编写FreeRTOS程序 基于FreeRTOS的STM32F103系统 内存管理及任务调度 基于FreeRTOS的
  • 【问题解决】虚拟机打开gazebo黑屏、闪退、模型加载不出来

    1 缺少模型库 可以在github上下载模型库 xff0c 但是速度极慢 xff0c 因为服务器在国外 此处提供快速下载方法 xff0c 通过码云快速git clone cd gazebo git clone https gitee com
  • 【ROS】package.xml文件解析

    文章目录 文章目录 前言 一 基本格式 1 基本结构 2 必要标签 3 依赖关系 二 Metapackage包 总结 前言 ros每个功能包中都有一个包清单 xff0c 它是一个名为package xml的XML 文件 xff0c 它必须包
  • 【ROS】dynamic_reconfigure配置详细说明

    文章目录 文章目录 前言 一 编写 cfg文件 二 为节点配置dynamic reconfigure 总结 前言 dynamic reconfigure配置是ROS中为了方便用户对程序中的参数进行实时调整而推出的工具 xff0c 配置好自己