服务(Services)
在 ROS 2 中,服务(service)指的是可远程调用的处理程序。 换句话说,一个节点可以远程调用另一个节点的处理程序,随后被调用的节点会运行计算然后把结果传递回来。
这种结构也体现在 service message 的定义中:
uint32 request
---
uint32 response
在 ROS 2 中,因为客户端通常在等待结果,所以我们期望服务能够迅速返回处理结果。 因此,服务不应该用于长时间运行的处理程序,特别是可能需要被异常情况中断的处理程序。 如果你有一个需要长时间运行的处理程序,考虑使用 action。
服务由服务名标识,它看起来很像一个 topic 名称(但在不同的命名空间(namespace)中)。
一个服务由两部分组成:服务器和客户端。
Service 服务器(server)
Service 服务器是接受请求并运行程序进行计算的实体。 举个例子,假设 ROS 2 消息包含以下内容:
uint32 a
uint32 b
---
uint32 sum
服务服务器是接收这个消息的实体,将 a
和 b
相加,然后返回 sum
。
Note
每个服务名称(service name)应该只有一个服务服务器。 如果有多个服务服务器使用相同的服务名称,那么在客户端请求时,无法确定哪个服务服务器会接收到请求。
Service 客户端(client)
Service 客户端是一个实体,它会请求远程服务服务器,让服务器执行计算。
继续上面的例子,服务客户端是 创建包含 a
和 b
的初始消息,并等待服务服务器计算出和并返回结果的 实体。
与服务服务器不同,可以有任意数量的服务客户端使用相同的服务名称。(译者注: 可以认为,service name 只表示要处理的事情的名称,只能有一个服务器处理这件事,而可以有很多客户端让服务器处理这件事。不同客户端拥有同样的 service name 只意味着他们想向同一个服务器请求同样/同类的事情。)