小猫

版主
  • 主题:39
  • 回复:39
  • 金钱:132
  • 积分:181
本帖最后由 Crazy_GF 于 2014-8-7 10:01 编辑

本教程假设从前一教程启动的turtlesim_node仍在运行,现在我们来看看turtlesim提供了什么服务:
ROS Services
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)
使用rosservice
rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。rosservice提供了很多可以在topic上使用的命令,如下所示:
使用方法:
  1. rosservice list         输出可用服务的信息
  2. rosservice call         调用带参数的服务
  3. rosservice type         输出服务类型
  4. rosservice find         依据类型寻找服务find services by service type
  5. rosservice uri          输出服务的ROSRPC uri
复制代码

rosservicelist
  1. $ rosservice list
复制代码

list 命令显示turtlesim节点提供了9个服务:重置(reset), 清除(clear), 再生(spawn), 终止(kill),turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, andturtlesim/set_logger_level.同时还有另外两个rosout节点提供的服务: /rosout/get_loggers and/rosout/set_logger_level.
  1. •        /clear
  2. •        /kill
  3. •        /reset
  4. •        /rosout/get_loggers
  5. •        /rosout/set_logger_level
  6. •        /spawn
  7. •        /teleop_turtle/get_loggers
  8. •        /teleop_turtle/set_logger_level
  9. •        /turtle1/set_pen
  10. •        /turtle1/teleport_absolute
  11. •        /turtle1/teleport_relative
  12. •        /turtlesim/get_loggers
  13. •        /turtlesim/set_logger_level
复制代码
我们使用rosservice type命令更进一步查看clear服务:
rosservicetype
使用方法:
  1. rosservice type [service]
复制代码

我们来看看clear服务的类型:
  1. $ rosservice type clear
  2. std_srvs/Empty
复制代码

服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)。下面我们使用rosservice call命令调用服务:
rosservice call
使用方法:
  1. rosservice call [service] [args]
复制代码

因为服务类型是空,所以进行无参数调用:
  1. $ rosservice call clear
复制代码

正如我们所期待的,服务清除了turtlesim_node的背景上的轨迹。
图片11.png
通过查看再生(spawn)服务的信息,我们来了解带参数的服务:
  1. $ rosservice type spawn| rossrv show
复制代码
  1. •        float32 x
  2. •        float32 y
  3. •        float32 theta
  4. •        string name
  5. •        ---
  6. •        string name
复制代码

这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。名字参数是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。
  1. $ rosservice call spawn 2 2 0.2 ""
复制代码

服务返回了新产生的乌龟的名字:
  1. •        name: turtle2
复制代码

现在我们的乌龟看起来应该是像这样的:
图片12.png
Using rosparam
rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1 是整型, 1.0是浮点型, one是字符串, true是布尔, [1, 2, 3]是整型列表, {a: b, c: d}是字典. rosparam有很多指令可以用来操作参数,如下所示:

使用方法:
  1. rosparam set            设置参数
  2. rosparam get            获取参数
  3. rosparam load           从文件读取参数
  4. rosparam dump           向文件中写入参数
  5. rosparam delete         删除参数
  6. rosparam list           列出参数名
复制代码

我们来看看现在参数服务器上都有哪些参数:
rosparam list
  1. $ rosparam list
复制代码

我们可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色:
  1. <span style="font-size: 13.5pt; line-height: 15pt; text-indent: 27pt;">•        /background_b</span>
复制代码

Let's change one of theparameter values using rosparam set:
rosparam set and rosparam get
Usage:
  1. rosparam set [param_name]
  2. rosparam get [param_name]
复制代码

现在我们修改背景颜色的红色通道:
  1. $ rosparam set background_r 150
复制代码

上述指令修改了参数的值,现在我们调用清除服务使得修改后的参数生效:
  1. $ rosservice call clear
复制代码
现在 我们的小乌龟看起来应该是像这样:
图片13.png
现在我们来查看参数服务器上的参数值——获取背景的绿色通道的值:
  1. $ rosparam get background_g
复制代码
我们可以使用rosparam get /来显示参数服务器上的所有内容:
  1. $ rosparam get /
复制代码
  1. •        background_b: 255
复制代码
你可能希望存储这些信息以备今后重新读取。这通过rosparam很容易就可以实现:
rosparam dump and rosparam load
使用方法:
  1. rosparam dump [file_name]
  2. rosparam load [file_name] [namespace]
复制代码

现在我们将所有的参数写入params.yaml文件:
  1. $ rosparam dump params.yaml
复制代码
你甚至可以将yaml文件重载入新的命名空间,比如说copy空间:
$ rosparam load params.yaml copy$ rosparam get copy/background_b
  1. •        255
复制代码