2.4.14 动态参数
ROS的另一个功能是动态重配置应用。通常情况下,当你正在编写一个新节点,你只能以数据初始化节点内的变量。如果你想从外部节点动态地改变这些值,你可以使用参数服务器、服务或主题。如果你使用一个PID节点来控制一个电动机,则应该使用动态重配置
应用。
在本节中,你将学习如何配置一个包含此功能的基本节点。添加必要的内容到CMakeLists.txt和package.xml文件。
为了使用动态重配置,你需要写一个配置文件并保存在你功能包的cfg文件夹中,创建一个文件夹和新文件如下:
在chapter2.cfg文件中添加如下代码:
代码解释:
以上代码初始化ROS并导入参数生成器:
以上代码初始化参数生成器,通过它我们可以开始用下面的代码行添加参数:
以上代码加入不同的参数类型并设置默认值、描述、范围等,参数有如下内容:
name 参数的名称
type 参数值的类型
level 一个传递给回调的位掩码
description 一个描述参数
default 节点启动的初始值
min 参数最小值
max 参数最大值
参数的名称必须唯一,参数值必须在最小和最大的范围内:
最后一行生成必要的文件并退出程序。注意.cfg文件是用Python写的。本书的实例代码主要使用C++编写,但有时会使用Python代码片段。
因为文件将由ROS执行,所以需要改变文件的权限,我们将使用chmod a + x使文件可由任何用户执行和运行,如下所示:
打开CMakeList.txt,加入下面代码:
现在,我们要写具有动态重配置支持的新节点。在src文件夹中创建一个新文件如下:
在文件中写入如下代码段:
这里进行代码解释,注意一些重要的行:
这些行包括ROS头文件、参数服务器以及我们先前创建的config文件。
回调函数将输出参数的新值。这是参数访问的方式,例如config.int_param。参数的名称必须与example2.cfg配置文件相同:
初始化服务器,忽略chapter2_Config配置文件:
现在,我们向服务器发送回调函数。当服务器得到重新配置请求,它会调用回调函数。
一旦我们完成以上讲解的步骤,我们需要在CMakeLists.txt文件中添加如下代码:
现在,你必须编译并运行节点和动态重配置界面(Dynamic Reconfigure GUI),如下:
在你执行最后一行命令后,你会看到一个新窗口,通过它你可以动态重配置节点的参数,如下图所示:
每当你通过滑块、文本框等调整参数时,你可以在命令行看到正在运行的节点的这些改变,如下图所示:
通过动态重配置,你可以更高效地开发和测试节点。与硬件一起配合使用这个程序是不错的选择。你将在接下来的章节中学习到更多内容。