首页
学习
活动
专区
工具
TVP
发布

ROS技术点滴——参数动态配置

ROS有一个参数服务器,可以提供全局的参数存储和查询服务。不过参数服务器有一个很大的问题:无法在线动态更新,如果Listener不主动查询参数值,就无法获知Talker是否已经修改了参数,这就导致ROS参数服务器有了很大局限。

很多场景下我们需要动态更新参数,例如参数调试、功能切换等,所以ROS提供了另外一个非常有用的功能包——dynamic_reconfigure,可以实现这种动态配置参数的机制。

例如下图是启动Kinect后,OpenNI功能包提供的参数动态配置的可视化界面。

ROS中的动态参数修改采用C/S架构,在运行过程中,用户在客户端修改参数后不需要重新启动,而是向服务端发送请求;服务端通过回调函数确认,即可完成参数的动态重配置。

接下来我们就来探索ROS中参数动态配置的具体实现方法。

— 创建配置文件—

通过以下命令创建功能包dynamic_tutorials:

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

配置文件使用python实现,详细分析其中的内容:

首先导入dynamic_reconfigure功能包提供的参数生成器(parameter generator)。

然后创建一个参数生成器,接下来就可以定义需要动态配置的参数了:

参数可以使用生成器的add(name, type, level, description, default, min, max)方法生成,这里定义了四个不同类型的参数,传入参数的意义如下:

name:参数名,使用字符串描述;

type:定义参数的类型,可以是int_t,double_t,str_t,或者bool_t;

level:参数动态配置回调函数中的掩码,在回调函数中会修改所有参数的掩码,表示参数已经被修改;

description:描述参数作用的字符串;

default:设置参数的默认值;

min:可选,设置参数的最小值,对于字符串和布尔类型值不生效;

max:可选,设置参数的最大值,对于字符串和布尔类型值不生效;

也可以使用如下方法生成一个枚举类型的值:

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

最后一行代码用于生成所有C++和Python相关的文件,并且退出程序。第二个参数表示运行时的节点名,第三个参数是生成文件所使用的前缀,需要和配置文件名相同。

配置文件创建完成后,需要使用如下命令添加可执行权限:

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

配置文件相关的工作就到此为止,接下来需要创建一个dynamic_reconfigure_node节点,调用参数的动态配置。

— 创建服务端节点—

dynamic_reconfigure_node节点的代码实现dynamic_tutorials/src/server.cpp如下:

代码的内容不多,分析其实现过程:

包含必要的头文件,其中TutorialsConfig.h就是配置文件在编译过程中生成的头文件。

先来看main函数的内容。首先初始化ROS节点,然后创建了一个参数动态配置的服务端实例,参数配置的类型与配置文件中描述的类型相同。该服务端实例会监听客户端的参数配置请求。

还需要定义回调函数,并将回调函数和服务端绑定。当客户端请求修改参数时,服务端即可跳转到回调函数进行处理。

对于本例程来说,回调函数并不复杂,仅将修改后的参数值打印出来。回调函数的传入参数有两个,一个是参数更新的配置值,另外一个表示参数修改的掩码。

代码编辑完成后,在CmakeLists.txt中加入以下编译规则:

现在就可以使用catkin_make命令编译dynamic_tutorials功能包了。

— 参数动态配置—

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

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

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

修改后可以在服务端中看到修改成功的打印信息,如下图所示。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180716G1SX7O00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券