ROS 服务

现在,想象一下你在你的电脑后面,你想从这个服务中获取天气。

https://embed.notionlytics.com/wt/ZXlKd1lXZGxTV1FpT2lKbE5EZ3hNRGRqTURKak9ESTBaRGRqT1RnMFltUmxaRGhqT0RrNE4yWXhPQ0lzSW5kdmNtdHpjR0ZqWlZSeVlXTnJaWEpKWkNJNklsZHNTR2hsVEZSUFdXeHpaVmRhUW1ZNU1YQmxJbjA9

你,在你身边,被认为是客户端,在线天气服务是服务器。您将能够通过带有 URL 的 HTTP 请求访问服务器。将 HTTP URL 视为 ROS 服务。

首先,您的计算机将向服务器发送请求。该请求将包含一条消息,在这种情况下是您的位置。然后服务器将处理请求,并发送响应。响应还将包含一条消息。

注意,为了通信,客户端发送的请求必须是一个位置,否则服务器将无法处理数据。并且服务器必须发回天气,否则客户端将无法理解响应是什么。

一项服务的多个客户

我们现在有一个客户端和一个服务器通过 ROS 服务进行通信。

但是,如果我们有多个客户呢? 这不是问题,所有客户端都会通过 HTTP URL 向服务器发送一个包含位置的请求。 然后服务器将处理请求并将响应发送回每个客户端。 请注意,同一服务不应超过一台服务器。

如您所见,在此示例中,我们有 3 个不同的计算机节点,一个节点用于天气服务。 HTTP URL 可以看作是一个 ROS 服务。

计算机节点包含一个服务客户端。该服务客户端将调用 ROS 服务并发送一个带有位置的请求。

另一方面,天气服务包含一个 ROS 服务服务器,它将处理所有请求并通过 ROS 服务发回响应。

同样,节点内的所有客户端和服务器都不知道彼此。他们只看到 ROS 服务接口。

机器人的例子

现在,让我们看另一个例子,这次直接处理机器人技术。此示例可以是真实 ROS 应用程序的一部分。

假设您的应用程序中有一个控制 LED 面板的节点。

该节点正在处理硬件以打开和关闭 LED。当然,您希望该节点能够与其他 ROS 节点通信。例如,其他节点可以要求此节点打开或关闭特定 LED。

在本例中,您创建了一个名为“Set Led”的 ROS 服务。在 Led 面板节点内,您为此 ROS 服务创建一个服务服务器。

现在,您有另一个处理电池的节点。其中一项功能是检查电池电量是否不足,并在发生时通知用户。为此,电池节点将包含一个用于“Set Led”服务的服务客户端。

想象一下,电池电量不足。当检测到时,电池节点将向 ROS 服务发送请求。它将发送一个 LED 编号和一个状态。