5、理解ros服务

Posted by pzque on 2016-04-14     

一、ros服务

ros服务(service)是节点间交流的另外一种方式,服务类似于web中的服务端与客户端的概念,节点类似一个客户端,可以发出一个请求(request),然后接受一个响应(response)。

二、使用rosservice命令

此命令的用法如下:

1
2
3
4
5
rosservice list         print information about active services
rosservice call call the service with the provided args
rosservice type print service type
rosservice find find services by service type
rosservice uri print service ROSRPC uri

1、rosservice list

首先启动一个小海龟:

1
roscore

1
rosrun turtlesim turtle_teleop_key

然后使用rosservice list命令,我们将得到:

1
2
3
4
5
6
7
8
9
10
11
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

这条命令说明我们小海龟节点提供如上9种服务。
可以进一步使用rosservice type查看服务的详细信息。

2、rosservice type

用法:

1
rosservice type [service]

示例:

1
rosservice type clear

得到:

1
std_srvs/Empty

服务为空,这表明在调用这个服务的时候不需要任何参数(它在生成请求时不发送任何数据和接受响应的时候也不接收任何数据)。
我们可以使用rosservice call来调用服务。

3、rosservice call

用法:

1
rosservice call [service] [args]

示例:

1
rosservice call /clear

调用此服务会清除小海龟的轨迹线条。

接下来我们通过spawn服务认识一下有参数的服务:

1
rosservice type spawn| rossrv show

会得到:

1
2
3
4
5
6
float32 x
float32 y
float32 theta
string name
---
string name

使用这个服务,给定位置参数和角度参数我们可以创建一个新海龟,其中name参数是可选的,现在我们就利用此命令创建一个新海龟:

1
rosservice call spawn 2 2 0.2 ""

它将返回新海龟的名字:

1
name: turtle2

同时我们也可以看到在海龟窗口中多了一只不同颜色的海龟。

三、使用rosparam命令

使用rosparam命令可以在ROS的 Parameter Server上存储和操作数据。Parameter Server可以存储integers, floats, boolean, dictionaries, and lists类型的数据。而rosparam命令使用YAML的语法,YAML的语法非常简单,但是要求比较严格,就不细讲了。rosparam命令的用法如下:

1
2
3
4
5
6
rosparam set            set parameter
rosparam get get parameter
rosparam load load parameters from file
rosparam dump dump parameters to file
rosparam delete delete parameter
rosparam list list parameter names

1、rosparam list命令

终端下调用此命令:

1
rosparam list

得到:

1
2
3
4
5
6
7
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_192_168_31_101__46779
/rosversion
/run_id

让我们尝试用rosparam set命令改变参数的值:

2、rosparam set和rosparam get命令

用法:

1
2
rosparam set [param_name]
rosparam get [param_name]

例如我们可以改变一下小海龟窗口的背景色——
首先设定参数:

1
rosparam set background_r 150

然后需要调用clear服务才可以使参数生效:

1
rosservice call clear

执行完这一步,发现海龟窗口的背景色变紫了。

然后我们可以查看一下在参数服务器上的其他参数,例如背景色绿通道的值:

1
rosparam get background_g

会得到:

1
86

使用/获取参数服务器上的所有内容:

1
rosparam get /

输出类似于:

1
2
3
4
5
6
7
8
9
10
11
12
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'jade

'
roslaunch:
uris: {host_192_168_31_101__46779: 'http://192.168.31.101:46779/'}
rosversion: '1.11.16

'
run_id: bd3a4832-0230-11e6-80ee-c0188582eefb

你可以把这些参数存储到文件里以方便再次使用:

3、rosparam dump和rosparam load命令

用法:

1
2
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]

现在我们把参数服务器的内容存到params.yaml中:

1
rosparam dump params.yaml

你可以将这个yaml文件加载到新的命名空间里,例如'copy'

1
2
rosparam load params.yaml copy
rosparam get copy/background_b

得到:

1
255