服务是 ROS 图中节点的另一种通信方式。 服务基于调用和响应模型,而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端专门调用它们时才提供数据。
1.打开小海龟
2.查看service列表,运行:ros2 service list,可以看到如下清单:
可以看到/turtlesim和/teleop_turtle各有6个参名字相同且都含有parameter的service
几乎ros2的每个节点都有这些service。
现在看turtlesim特有的服务:/clear,/kill,/spawn,/turtle/set_pen,/turtle/teleport_absolute和/turtle/teleport_relative,这些信息也可以在rqt中看到。
service也和topic相似的数据结构,但是service类型拥有两部分,一组信息是请求,一组信息是响应。要获取service类型,可以使用命令:ros2 service type <service_name>,如
ros2 service type /clear
终端中返回:std_srvs/srv/Empty
其中Empty类型意思是service在发出请求时不发送数据,在收到响应时不接受数据
3.ros2 service list -t
与ros2 topic list -t类似,返回带类型的service列表,如图:
4. ros2 service find
如果要查找特定类型的所有服务,可以使用命令:ros2 service find <type_name>,如
ros2 service fine std_srvs/srv/Empty
可以得到:/clear和/reset
5.ros2 interface show
可以通过命令行call service,但是首先应该知道输入参数的数据结构,使用命令:ros2 interface show <type_name>.srv
如 ros2 interface show std_srvs/srv/Empty.srv(不加.srv也可以出来相同的结果)
可以得到返回值:---,“---”时分割请求数据结构和响应数据结构的符号,也就是请求和响应的数据结构都是空白的,
输入命令:ros2 interface show turtlesim/srv/Spawn
可以获得返回值:
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
在“---”以上的是唤醒/spawn服务所需要的信息,x/y/thrta,值小乌龟的位置和姿态值,name是可选项
6.ros2 service call
上面知道了service类型,和类型的数据结构,然后可以通过命令呼叫服务:
ros2 service call <service_name> <service_type> <arguments>
其中<artuments>部分是可选项,例如Empty类型的service不需要任何参数,即:
ros2 service call /clear std_srvs/srv/Empty
这个命令会清空海龟窗口。
接下来尝试/spawn命令并输入参数:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2,y: 2,theta: 0.2,name: ''}"
会在海龟窗口召唤一个新的海龟,如图所示:
总结:
节点间(node)可以使用ROS2中的服务(service)进行通讯,与主题(topic)不同,主题是一种单向的通讯模式,节点通过主题发布发布信息(可以由一个或者多个订阅者使用),服务是客户端向节点发出请求的<请求/响应>模式提供服务。
对于连续的发出指令,服务(service)是不适合的,主题(topic)和行动(action)更适合。