Note: This tutorial assumes that you have completed the previous tutorials: 理解ROS话题. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
理解ROS服务和参数
Description: 本教程介绍了ROS服务和参数的知识,以及命令行工具rosservice和rosparam的使用方法。Tutorial Level: BEGINNER
Next Tutorial: 使用rqt_console和roslaunch
Contents
本教程假设上一教程启动的turtlesim_node仍在运行,现在我们来看看turtlesim提供了什么服务:
ROS服务
服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)。
使用rosservice
rosservice可以很容易地通过服务附加到ROS客户端/服务器框架上。rosservice有许多可用于服务的命令,如下所示:
用法:
rosservice list 输出活跃服务的信息 rosservice call 用给定的参数调用服务 rosservice type 输出服务的类型 rosservice find 按服务的类型查找服务 rosservice uri 输出服务的ROSRPC uri
rosservice list
$ rosservice list
list命令显示turtlesim节点提供了9个服务:reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, turtlesim/set_logger_level。同时还有两个与rosout节点有关的服务:/rosout/get_loggers和/rosout/set_logger_level。
/clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /teleop_turtle/get_loggers /teleop_turtle/set_logger_level /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level
我们使用rosservice type命令进一步查看clear(清除)服务:
rosservice type
用法:
rosservice type [service]
来看看clear服务的类型:
$ rosservice type /clear
std_srvs/Empty
服务的类型为empty(空),这表明调用这个服务时不需要参数(即,它在发出请求时不发送数据,在接收响应时也不接收数据)。下面我们使用rosservice call命令调用此服务:
rosservice call
用法:
rosservice call [service] [args]
因为服务的类型为empty,所以进行无参数调用:
$ rosservice call /clear
跟想象的一样,它清除了turtlesim_node背景上的轨迹。
再让我们看看服务具有参数的情况。查看spawn(产卵)服务的信息:
$ rosservice type /spawn | rossrv show
float32 x float32 y float32 theta string name --- string name
这个服务能让我们可以在给定的位置和角度生成一只新的乌龟。name字段是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。
$ rosservice call /spawn 2 2 0.2 ""
该调用返回了新产生的乌龟的名字:
name: turtle2
现在我们的turtlesim应该看起来像这样:
使用rosparam
rosparam能让我们在ROS参数服务器(Parameter Server)上存储和操作数据。参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1是整型,1.0是浮点型,one是字符串,true是布尔型,[1, 2, 3]是整型组成的列表,{a: b, c: d}是字典。rosparam有很多命令可以用来操作参数,如下所示:
用法:
rosparam set 设置参数 rosparam get 获取参数 rosparam load 从文件中加载参数 rosparam dump 向文件中转储参数 rosparam delete 删除参数 rosparam list 列出参数名
我们来看看现在参数服务器上都有哪些参数:
rosparam list
$ rosparam list
可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色:
/rosdistro /roslaunch/uris/host_nxt__43407 /rosversion /run_id /turtlesim/background_b /turtlesim/background_g /turtlesim/background_r
让我们使用rosparam set来试着改变一个参数值:
rosparam set和rosparam get
用法:
rosparam set [param_name] rosparam get [param_name]
现在我们修改背景颜色的红色通道值:
$ rosparam set /turtlesim/background_r 150
上述指令修改了参数的值,现在我们需要调用clear服务使得参数的修改能生效:
$ rosservice call /clear
现在我们的turtlesim看起来应该像这样:
然后我们来查看参数服务器上其他参数的值。获取背景的绿色通道的值:
$ rosparam get /turtlesim/background_g
86
也可以用rosparam get /来显示参数服务器上的所有内容:
$ rosparam get /
rosdistro: 'noetic ' roslaunch: uris: host_nxt__43407: http://nxt:43407/ rosversion: '1.15.5 ' run_id: 7ef687d8-9ab7-11ea-b692-fcaa1494dbf9 turtlesim: background_b: 255 background_g: 86 background_r: 69
你可能希望将其存储在一个文件中,以便下次可以重新加载它。这通过rosparam很容易就可以实现:
rosparam dump和rosparam load
用法:
rosparam dump [file_name] [namespace] rosparam load [file_name] [namespace]
在这里,我们将所有的参数写入params.yaml文件:
$ rosparam dump params.yaml
你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle:
$ rosparam load params.yaml copy_turtle $ rosparam get /copy_turtle/turtlesim/background_b
255
至此,我们已经了解了ROS服务和参数的工作原理。接下来,我们一同试试使用rqt_console和roslaunch。