【ROS读书笔记】--- 8-1.服务service基础


长安初雪,希望疫情早日退去。
本章我们来看看服务(service)以及用命令行来对服务进行操作。以为开启一个小乌龟界面(turtlesim_node)为切入点学习。

服务

I 、基础概念

服务是一种一对一的通信,客户端(client)发送申请(request),服务段(server)收到后再发送回复(response)给客户端。申请和回复和消息类似,分为两部分,被封装在一个文件中,格式如下:

request......
---
response...

II、服务和话题的区别

  • (rostopic)相对本章的(rosservice)
    (rosmsg)相对本章的(rossrv)
  • 服务是双向的,消息发布后有响应/回复。
  • 服务调用实现一个节点对一个节点通信。

从命令行操作

作者执行了rosrun turtlesim turtlesim_node。

– 查看服务列表

$ rosservice list 
/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
  • 每一行表示一个当前可以调用的服务名。该命令列出的是所有服务的全局名称;
  • 这里的服务大致分为两类:1. get_logger和set。。。是用来为特定节点使用的,通常用节点名作为命名空间防止命名冲突,允许节点通过私有名称访问; 2. 其他服务不针对特定节点服务,例如/spawn只关心是否有新的海龟出现,不关心哪个节点作用。


– 查看某个节点上的服务类型

rosnode info 节点名

会列出与节点相关的话题发布,订阅和服务。如下可以看到前文大多数服务由turtle节点提供。另外两个由/rosout提供。

~$ rosnode info /turtlesim 
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications: 
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/color_sensor [turtlesim/Color]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions: 
 * /turtle1/cmd_vel [unknown type]

Services: 
 * /clear
 * /kill
 * /reset
 * /spawn
 * /turtle1/set_pen
 * /turtle1/teleport_absolute
 * /turtle1/teleport_relative
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level


– 查询提供某服务的节点

rosservice node 服务名

来尝试一下查询上文列举出的服务:不出意外应该会反向查询到turtlesim节点。

~$ rosservice node /spawn
/turtlesim

– 查询服务的数据类型

rosservice info 服务名

来尝试一下查询上文列举出的服务:

$ rosservice info /spawn
Node: /turtlesim
URI: rosrpc://WP:57147
Type: turtlesim/Spawn
Args: x y theta name

可以看到:

  • /spawn服务的数据类型是turtlesim/Spawn。和消息类型类似,它包含两个部分:其一是声明这个service的包(turtlesim),其二是service本身的数据类型(Spawn);
  • 请求参数有四个:x坐标 y坐标 朝向角度 乌龟的名称

– 查询服务的数据类型(文件中的定义)

rossrv show 服务类型

来尝试一下查询上文列举出的服务:不出意外应该会反向查询到turtlesim节点。

~$ rossrv show turtlesim/Spawn 
float32 x
float32 y
float32 theta
string name
---
string name

短横线之前的数据是请求(request),之后的数据是响应项(reponse)。可以为空,甚至两个内容都为空,大致和C++中的void类似。


– 调用服务

rosservice call 服务名 请求 

这里的请求内容应该列举出每一个域的值,正如rossrv show指令所示:

~$ rosservice call /spawn 3 3 0 jack
name: "jack"

未调用服务时:
未调用service

调用服务后:
调用服务后

成功后输出服务器节点的响应数据,如上返回name:jack。

  • 一种情况:在turtlesim中,每只海龟唯一名字,如果运行两边代码,会有如下错误:
~$ rosservice call /spawn 3 3 0 jack
name: "jack"
~$ rosservice call /spawn 3 3 0 jack
ERROR: service [/spawn] responded with an error: 
~$ 

这里的错误以冒号结尾,实际上ROS的内在机制:当服务调用错误时,会返回错误信息的字符串,这里turtle提供的错误信息为空的字符串而已。


祝圣诞快乐!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值