上一节提到了如何自定义消息,这一节来看一下如何自定义服务。其实“自定义服务”这个说法有点奇怪,因为ROS是没有标准服务的,都需要用户进行开发。
首先回顾一下消息和服务的区别。
ROS作为一个分布式计算框架,各节点之间的通讯有点像我们平时上网。消息(msg)的收发类似于直播博主和订阅用户之间的关系,以主题(topic)来限定通讯的内容和格式,允许有多个直播博主推送内容,而用户只需要登记订阅信息即可接受主题中的内容。博主和用户之间通过roscore来连接,这里roscore就像youtube网站的服务器。此时信息的传输是单向的。当然,一个节点可以同时作为某个topic的发布者和订阅者。
主题topic采用异步的 publish-subscribe 通讯模式,使用TCP/IP或UDP传输,适用于多对多的场景。而服务srv属于同步的request-response通讯模式。类似于出租车的通讯系统,控制中心向全员广播的信息是topic,而如果直接派单给司机A,则需要呼叫司机A并要求A回复,此时用的是服务service。
注:基于TCP传输称为TCPROS,使用TCP/IP长连接,是ROS默认的传输方式; 基于UDP传输称为UDPROS,是一种低延迟高效率的传输方式,但可能丢失数据,适用于远程操控类任务。
接下来我们通过rospy_tutorials中005_add_two_ints示例学习如何使用srv。
这一示例涉及两个节点的py文件以及srv文件的正例与反例。
关于节点的惯用名称,消息中发布者一般称为talker/publisher, 订阅者称为listener/subscriber. 而服务中消息的两个节点分别称为client和server.client发出请求,而server作出响应。
add_two_ints_client
#!/usr/bin/env python
import sys
import os
import rospy
# imports the AddTwoInts service
from rospy_tutorials.srv import *
## add two numbers using the add_two_ints service
## @param x int: first number to add
## @param y int: second number to add
def add_two_ints_client(x, y):
# NOTE: you don't have to call rospy.init_node() to make calls against
# a service. This is because service clients do not have to be