【ROS】dynamic_reconfigure配置详细说明

news2024/12/22 20:10:59

文章目录

文章目录

前言

一、编写.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工具,实时的动态调节程序的参数,帮助我们高效便捷的获得最优程序参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022-12-18 网工进阶(三十八)MPLS LDP---LDP基础、工作原理(会话、标签的发布和管理、特性)、配置举例

LDP概述 LDP是MPLS的一种控制协议&#xff0c;相当于传统网络中的信令协议&#xff0c;负责FEC的分类、标签的分配以及LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程。 LDP的工作过程主要分为两部分&#xff1a;LSR之间建立LDP会话&#xff1b;…

一种小型项目的超时机制方案

设计背景 在小型项目中&#xff0c;状态机的跳转往往依赖于某个事件的状态&#xff0c;因此监控某个事件是否处于超时状态就至关重要&#xff1b; 注意事项 超时机制应该能够准确的判断出事件是否真正超时&#xff0c;并预留出设置自定义超时处理的接口&#xff1b;超时机制…

什么是大数?大数有什么用?如何使用大数?

0 什么是大数 如果基本的整数和浮点数精度不能够满足需求&#xff0c;那么可以使用 javamath 包中两个很有用的类:BigInteger和 BiDecimal。 这两个类可以处理包含任意长度数字序列的数值。 BigInteger类实现任意精度的整数运算&#xff0c;BigDecimal实现任意精度的浮点数运算…

Android | Fragment

Android Fragment Fragment 概念 Fragment 表示应用界面中可重复的一部分&#xff0c;Fragment 定义和管理自己的布局&#xff0c;具有自己的生命周期&#xff0c;并且可以处理自己的输入事件。fragment 不能独立存在&#xff0c;而是必须由 Activity 或另一个 fragment 托管…

麦克纳姆轮(麦轮)原理

一、麦轮原理 麦克纳姆轮&#xff1a;简称麦轮&#xff0c;由轮毂和围绕轮毂的辊子组成。 辊子&#xff1a;没有动力的从动小滚轮。 麦克纳姆轮辊子轴线和轮毂轴线夹角是45度。 A轮&#xff08;左旋&#xff09;与B轮&#xff08;右旋&#xff09;互为镜像关系 麦轮在车上的…

Go语言开发小技巧易错点100例(五)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09;Go语言开发小技巧&易错点100例&#xff08;四&#xff09; …

打工人必学的法律知识(五)——《女职工劳动保护特别规定》

女职工劳动保护特别规定https://flk.npc.gov.cn/detail2.html?ZmY4MDgwODE2ZjNjYmIzYzAxNmY0MTBmMWVkNTE0NTE &#xff08;2012年4月18日国务院第200次常务会议通过 2012年4月28日中华人民共和国国务院令第619号公布 自公布之日起施行&#xff09;第一条 为了减少和解决女职工…

如何减少频繁创建数据库连接的性能损耗?

为极速开发出一套某垂直领域电商系统&#xff0c;采用最简架构&#xff1a; 前端一台Web服务器运行业务代码后端一台DB服务器存储业务数据 大多系统初生时就是这样&#xff0c;只是随业务不但发展变得复杂&#xff0c;架构迭代。系统上线后&#xff0c;虽用户量不大&#xf…

第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移

【问题描述】 小蓝有一个长度为 N 的数组&#xff0c;初始时从左到右依次是 1, 2, 3, . . . N。 之后小蓝对这个数组进行了 M 次操作&#xff0c;每次操作可能是以下 2 种之一&#xff1a; 左移 x&#xff0c;即把 x 移动到最左边。右移 x&#xff0c;即把 x 移动到最右边。 …

数字信号处理音频FIR去噪滤波器(基于MATLAB GUI的开发完整代码+报告+课设)

1、内容简介利用MATLAB GUI设计平台&#xff0c;用窗函数法设计FIR数字滤波器&#xff0c;对所给出的含有噪声的声音信号进行数字滤波处理&#xff0c;得到降噪的声音信号&#xff0c;进行时域频域分析&#xff0c;同时分析不同窗函数的效果。将文件解压至一个目录下&#xff0…

ithewei的2022年度总结

窗外的雨&#xff0c;顺着晒衣架汇聚成豆大的珠&#xff0c;落到一楼庭院顶棚上&#xff0c;嘀嗒不停&#xff1b; 路上的车&#xff0c;由远及近&#xff0c;又由近及远&#xff0c;疾驰而过&#xff1b; 床边的猫&#xff0c;也已入睡&#xff0c;时不时发出一两声细微的鼾声…

面试问:@Resource 和@Autowired 的区别是什么?该怎么回答

Resource 和 Autowired 这两个注解的作用都是Spring生态里面去实现 Bean 的依赖注入 Autowired注解的作用 Autowired是Spring里面提供的一个注解&#xff0c;它默认是根据类型来实现Bean的依赖注入。 Autowired注解里面有一个required属性&#xff0c;它的默认值是true&#…

人大金仓数据库安装篇

图形化安装 规划安装路径与修改目录属主 先用root账户挂载金仓镜像包 mount -o loop /install/KingbaseES_V008R006C005B0023_Lin64_single_install.iso /mnt 切换kingbase用户来安装金仓数据库 进入挂载目录/mnt执行./setup.sh 将金仓注册为系统服务 /KingbaseES/V8/Scrip…

1592_AURIX_TC275_PMU_部分安全措施

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) UCB的几种状态通过寄存器的数值可以直接获取到。启动代码会识别到UCB的错误&#xff0c;如果识别到后悔停止继续&#xff0c;因此不会启动MCU。启动代码也会检查HSM是否存在以及是否需要启…

基于TensorFlow2搭建神经网络实现鸢尾花iris.txt分类

分三步&#xff1a;本地读取鸢尾花数据集搭建神经网络优化本地读取鸢尾花数据集读取本地数据集的两种方法读取本地数据集有两种方法&#xff1a;&#xff08;1&#xff09;利用pandas中的函数读取&#xff0c;并处理成神经网络需要的数据结构pd.read_csv(文件名, header第几行作…

使用码云Gitee创建代码仓库并提交代码

目录 1. 登录Gitee官网 2. 创建代码仓库 3. 克隆仓库到本地 4. 提交代码到Gitee仓库 官方文档&#xff1a;创建你的第一个仓库 - Gitee.com 1. 登录Gitee官网 官网地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 2. 创建代码仓库 点击图中加号创建仓库&am…

String的不可变性

1.什么是不可变对象 如果一个对象在创建之后就不能再改变它的状态&#xff0c;那么这个对象是不可变的&#xff08;Immutable&#xff09;。不能改变状态的意思是&#xff0c;不能改变对象内的成员变量&#xff0c;包括基本数据类型变量的值不能改变&#xff0c;引用类型的变量…

数据库面试题

数据库基础知识 什么是MySQL&#xff1f; MySQL是一个数据库管理系统。 数据库是数据的结构化集合。 MySQL数据库是关系型的。 关系数据库将数据存储在单独的表中&#xff0c;而不是将所有数据放在一个大仓库中。数据库结构被组织成针对速度进行了优化的物理文件。具有对象&a…

第五届字节跳动青训营 前端进阶学习笔记(一)前端和HTML

文章目录1.前言2.什么是前端3.前端需要关注哪些问题4.HTML语法5.HTML标签6.HTML中的内容划分7.总结这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天 1.前言 本次课程主要介绍了&#xff1a; 前端要解决的基本问题HTML的基本定义和语法为什么要语义化和怎么做的语义化 …

深度学习——梯度

一、初识梯度 import torch x torch.arange(4.0) print(x) x.requires_grad_(True) y 2 * torch.dot(x, x) #torch.matmul(x, x) print(y) y.backward() print(x.grad) print(x.grad 4*x)输出&#xff1a; tensor([0., 1., 2., 3.]) tensor(28., grad_fn<MulBackward0&g…