在这一节里面,我们将介绍ROS服务,参数以及使用rosservicerosparam

首先,我们需要理解什么是ROS服务,它是节点之间相互通信的另外一种方式,如果你学习了上一节的内容,那么你应该知道节点之间是可以通过基于话题的消息来进行节点之间的通信的。而服务的通信机制是允许节点发送请求和响应请求。服务和基于话题的消息通信的本质区别是:

  • 话题的通信机制是:多对多的;
  • 服务的通信机制是:一对一的。

现在,让我们开看一下turtlesim功能包提供了什么服务。

使用rosservice

rosservice有很多可以用在话题上的命令:

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

首先我们使用rosservice list命令:

rosservice list

输出结果为:

liuqiang@liuqiang-pc:~$ rosservice list
/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

可以看出,turtlesim节点提供了9个服务,而rosout节点提供了2个服务。

接着我们使用rosservice type命令。

rosservice type命令的格式如下:

roservice type [service]

例如:

rosservice type /clear

输出结果为:

liuqiang@liuqiang-pc:~$ rosservice type /clear
std_srvs/Empty

可以看出,输出的服务数据类型是空的,表示当它发送请求的时候,没有发送数据,接收响应的时候,也没有接收到数据。

下一步,我们使用rosservice call命令

该命令的语法格式为:

rosservice call [service]

例如:

rosservice call /clear

输出结果是,我们发现小海龟的运动轨迹被清除了。

现在我们来运行一下这样的一条命令:

rosservice type /spawn | rossrv show

输出的结果为:

liuqiang@liuqiang-pc:~$ rosservice type /spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name

其实这条命令可以分解为rosservice typerossrv show两条命令:

liuqiang@liuqiang-pc:~$ rosservice type /spawn
turtlesim/Spawn
liuqiang@liuqiang-pc:~$ rossrv show turtlesim/Spawn
float32 x
float32 y
float32 theta
string name
---
string name

看到这里,是不是发现很像之前那条查看基于话题的消息的命令?

liuqiang@liuqiang-pc:~$ rostopic type /turtle1/cmd_vel | rosmsg show
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

现在,我们使用/spawn服务来孵化除一只新的小海龟:

liuqiang@liuqiang-pc:~$ rosservice call /spawn 2 2 0.2 "turtle2"
name: turtle2

输出结果为:

使用rosparam

rosparam允许你在ROS参数服务器上存储和操纵数据。参数服务可以存储整型、浮点型、布尔型、字典和列表等类型的数据。rosparam使用YAML标记语言作为语法,在简单的情况下,YAML看起来非常的自然:1是整型,1.0是浮点型,one是字符串,true是布尔型,[1, 2, 3]是元素为整型的列表,{a:b, c:d}是一个字典,rosparam有很多命令可以用于参数,比如:

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

首先,我们来看一下有哪些参数存储在参数服务器上?

rosparam list

输出的结果为:

liuqiang@liuqiang-pc:~$ rosparam list
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_liuqiang_pc__36444
/rosversion
/run_id

可以看出,turtlesim节点有3个参数在参数服务器上用于设置窗口的背景色,现在我们使用rosparam set来改变一个参数的值看一下有什么变化。

rosparam set /background_r 150

上面的命令改变了参数的值,现在我们还需要调用/clear服务来使更改的参数值生效。

rosservice call /clear

现在的结果是:

我们还可以获取参数服务器上的某个特定参数的参数值:

rosparam get /background_g

输出结果为:

liuqiang@liuqiang-pc:~$ rosparam get /background_g
86

当然了,我们也可以获取参数服务器上的所有参数及其对应的参数值:

rosparam get /

输出的结果为:

liuqiang@liuqiang-pc:~$ rosparam get /
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo

  '
roslaunch:
  uris: {host_liuqiang_pc__36444: 'http://liuqiang-pc:36444/'}
rosversion: '1.11.21

  '
run_id: 32a8e6c2-b25d-11e7-8bbe-30b49e59a135

比如说,我们想要查看自己ros的版本号:

rosparam get /rosdistro

输出结果为:

liuqiang@liuqiang-pc:~$ rosparam get /rosdistro
'indigo

  '

再比如说,我们还想查看ros的详细版本信息:

rosparam get /rosversion

输出结果为:

liuqiang@liuqiang-pc:~$ rosparam get /rosversion
'1.11.21

  '

我们还可以将参数服务器上的所有内容转储到自命名的文件中:

rosparam dump params.yaml

params.yaml文件中的内容为:

background_b: 255
background_g: 86
background_r: 150
rosdistro: 'indigo

  '
roslaunch:
  uris: {host_liuqiang_pc__36444: 'http://liuqiang-pc:36444/'}
rosversion: '1.11.21

  '
run_id: 32a8e6c2-b25d-11e7-8bbe-30b49e59a13

当然了,我们还可以将params.yaml文件的内容加载到新的命名空间:

roaparam load params.yaml copy

接着,我们来获取新的命名空间中的参数的值:

rosparam get /copy/background_b

输出结果为:

liuqiang@liuqiang-pc:~$ rosparam get /copy/background_g
86