“既羡慕别人,也加快脚步!”
长安初雪,希望疫情早日退去。
本章我们来看看服务(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"
未调用服务时:
调用服务后:
成功后输出服务器节点的响应数据,如上返回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提供的错误信息为空的字符串而已。
祝圣诞快乐!