【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配置详细说明 的相关文章

  • Nest Elastic - 构建动态嵌套查询

    我必须使用 Nest 查询嵌套对象 但是查询是以动态方式构建的 下面的代码演示了以静态方式对嵌套 书籍 进行查询 QueryContainer qry qry new QueryStringQuery DefaultField name D
  • javascript - 动态变量

    您好 我正在尝试创建动态变量 但它说 变量 v0 到 v5 未定义 td each function i eval var v i this html 任何帮助将不胜感激 这听起来是个坏主意 你有什么理由不能这样做吗 var tdHtml
  • C# WPF 如何动态设置属性设置方法?

    我一直在四处寻找 但似乎找不到我要找的东西 所以我会在这里尝试一下 情况 我有 MainWindow 和 MainWindowData 类 MainWindowData 中只有使用 UpdateGUI 属性定义的公共属性 public cl
  • 如何从网站中抓取动态内容?

    所以我使用 scrapy 从亚马逊图书部分抓取数据 但不知何故我知道它有一些动态数据 我想知道如何从网站中提取动态数据 到目前为止我已经尝试过以下方法 import scrapy from items import AmazonsItem
  • 在 Swift 中将动态 Int 变量从一个类传递到另一个类

    我是 swift 2 的新手 我陷入了将变量从一个类传递到另一个类的过程中 我有一个类 GameScene 我有一个公共变量score并且在更新功能中不断更新 我想发送score两个节点相互碰撞时的值 一旦它发生碰撞 我就会使用 mainv
  • D 动态数组初始化、stride和索引操作

    抱歉 这成为了有关数组的三重问题 我认为 动态 数组在 D 中确实很强大 但以下问题已经困扰我一段时间了 在 C 中 我可以轻松地分配具有指定值的数组 但在 D 中 我还没有找到这样做的方法 当然下面的内容是没有问题的 int a new
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS
  • 通过 jQuery 选择动态 HTML 元素

    我正在构建一个 ASP NET MVC 应用程序 并且正在使用jQuery Blueimp https github com blueimp jQuery File Upload动态添加到页面的 PartialView 上的插件 根据插件的
  • 每页都包含菜单

    假设我有一个简单的 CSS 布局 我的菜单是侧面的一列 此菜单将出现在每个网页上 大约 10 个网页 如果我在这个菜单上有链接等形式的项目 我怎样才能做到这样 如果我在一页上添加链接 它会将其添加到所有页面 你能把它做成一个 PHP 页面吗
  • 让浏览器缓存我的动态 PHP 样式表

    我想在 PHP 文件 styles php 中创建一个样式表 以便样式表变得动态 具体取决于请求的用户 对于每个单独的用户来说 样式表是不变的 因此应该缓存在他的客户端浏览器上 我读过 您可以通过设置内容类型和缓存控制等标头来实现此目的 但
  • 在VB.net中动态添加用户控件

    我在 Vb net Windows 应用程序 中制作了自定义 UserControl 如何将其动态添加到表单中 UserControl 本质上只是另一个类 它继承自 Control 因此您可以使用控件执行各种操作 但除此之外它只是一个类 因
  • AJAX VS PHP 动态网页?

    当您只能使用 php 来实现动态网页时 为什么要使用 AJAX 呢 使用 AJAX 的主要原因是用户体验 UX 现在 AJAX 不一定会改善每个实例的用户体验 所以在很多地方坚持使用纯 PHP 完全没问题 但想象一下这样的情况 网站上有一个
  • JQuery 设置动态最大宽度

    我不太擅长 jQuery 因此完整的代码解决方案将是理想的选择 该函数将 获取浏览器屏幕的 70 宽度 将该宽度转换为其相应的 px 值 设置最大宽度 mainContainer使用从转换 计算中获得的值 这是我要设置的容器的 CSS 样式
  • 设置动态创建的 iframe 的基本标签

    我正在尝试动态创建 iframe 并在创建之前设置它的基本标记 ifrm document createElement IFRAME ifrm setAttribute src test html ifrm style width 400
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • Selenium 网页抓取与动态内容和隐藏数据表上的美丽汤

    真的需要这个社区的帮助 我正在使用 Selenium 和 Beautiful Soup 对 Python 中的动态内容进行网页抓取 问题是定价数据表无法解析为 Python 即使使用以下代码 html browser execute scr
  • 在 Actionscript-3 中优化 2D Flash 游戏的动态背景引擎

    编辑2 根据缺乏回复来判断 我开始怀疑我的问题是否足够清楚 请告诉我是否需要详细说明 注意 请参阅底部以获取代码更新 简短介绍 我正在用 ActionScript 编写一个二维 Flash 空间游戏 宇宙无限大 由于这个特性 背景必须动态渲
  • 动态添加字段到数据类对象

    我正在编写一个库来访问 REST API 它返回带有用户对象的 json 我将其转换为 dict 然后将其转换为数据类对象 问题是并非所有字段都是固定的 我想动态添加其他字段 未在我的数据类中指定 我可以简单地为我的对象分配值 但它们不会出
  • 在 Primefaces 中以编程方式创建命令按钮

    我正在尝试创建一个带有输入文本和命令按钮的动态表单 一切正常 但是当我单击命令按钮时 永远不会调用操作侦听器 请提出我做错了什么或者这是否是 PF 或 Mojarra 的错误 代码如下 panel new Panel panel setHe
  • 动态调整大小的 boost::asio::buffer

    我正在阅读boost asio ip udp socket像这样 using boost asio ip udp char recv buf 128 udp endpoint sender endpoint size t len socke

随机推荐

  • 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 配置好自己