主要内容

呼叫并提供ROS 2服务

ROS支万博1manbetx持两种主要的通信机制:主题和服务。主题有发布者和订阅者,用于发送和接收消息(参见与ros2发布者和订阅者交换数据).服务,另一方面,通过允许请求-响应通信实现更紧密的耦合。一个服务客户端将请求消息发送到服务服务器等待回应。服务器将使用请求中的数据来构造响应消息并将其发送回客户机。每个服务都有一个确定请求和响应消息结构的类型。

该服务通信具有以下特点:

  • 服务请求(或服务调用)用于一对一通信。单个节点将发起请求,只有一个节点接收请求并发回响应。

  • 当执行服务调用时,服务客户机和服务服务器是紧密耦合的。服务器需要在服务调用时存在,一旦发送请求,客户端将阻塞,直到接收到响应。

服务的概念如下图所示:

这个示例向您展示了如何设置服务服务器来向ROS网络发布服务。此外,您还将了解如何使用服务客户机来调用服务器并接收响应。

先决条件:从ROS 2开始连接到ROS 2网络与ros2发布者和订阅者交换数据

创建服务服务器

在研究服务概念之前,创建带有三个节点的示例ROS 2网络,以模拟真实的网络。

node_1 = ros2node (“node_1”);node_2 = ros2node (“node_2”);node_3 = ros2node (“node_3”);

假设您想要创建一个简单的服务服务器来显示“一个服务客户端正在调用”当你呼叫服务时。属性创建服务ros2svcserver命令。指定服务名称、服务消息类型和连接服务器的节点。还将回调函数定义为exampleHelperROSEmptyCallback.服务服务器的回调函数有一个非常特定的签名。具体操作请参见相关文档ros2svcserver

testserver = ros2svcserver (node_1,“/ service_example”“std_srvs /空”@exampleHelperROS2EmptyCallback)
testserver = ros2svcserver with properties: ServiceType: 'std_srvs/Empty' ServiceName: '/service_example' NewRequestFcn: @exampleHelperROS2EmptyCallback History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

你可以看到你的新服务,/测试,当您列出ROS网络中的所有服务时。

ros2 (“服务”“列表”);
/_matlab_introspec__0/ descripbe_parameters /_matlab_introspec__0/get_parameter_types /_matlab_introspec__0/get_parameters /_matlab_introspec__0/list_parameters /_matlab_introspec__0/set_parameters /_matlab_introspec__0/set_parameters_atomically . /

创建服务客户端

使用服务客户端向ROS 2服务服务器请求信息。要创建客户端,请使用ros2svcclient使用服务名作为参数。

的服务客户端/测试我们刚刚创建的服务,并将其连接到另一个节点。

testclient = ros2svcclient (node_2,“/ service_example”“std_srvs /空”
testclient = ros2svccclient with properties: ServiceType: 'std_srvs/Empty' ServiceName: '/service_example' History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

为服务创建一个空请求消息。使用ros2message函数并将客户端作为第一个参数传递。这将创建一个服务请求函数,该函数具有由服务指定的消息类型。

testreq = ros2message (testclient)
testreq =结构体字段:MessageType:“std_srvs / EmptyRequest”

确保服务连接到客户端,如果需要,等待它们连接。

waitForServer (testclient“超时”3)

当您想从服务器获得响应时,使用调用函数,该函数调用服务服务器并返回响应。您之前创建的服务服务器将返回一个空响应。此外,它将调用exampleHelperROSEmptyCallback函数并显示字符串“一个服务客户端正在调用”.你也可以定义a超时参数,该参数指示客户机应该等待响应多长时间。状态statustext输出提供有关响应状态的附加信息。

testresp =调用(testclient testreq,“超时”3)
testresp =结构体字段:MessageType:“std_srvs / EmptyResponse”

如果上面的调用函数失败,它将出错。如果您希望使用条件语句对调用失败作出反应,则可以从调用函数返回状态和状态文本输出,而不是错误。状态输出表明调用是否成功,而statustext提供额外的信息。类似的输出也可以从waitForServer返回。

numCallFailures = 0;[testresp、状态、statustext] =调用(testclient testreq,“超时”3);如果~status numCallFailures = numCallFailures + 1;流("呼叫失败号码%d。错误原因:% s \ n”、numCallFailures statustext)其他的disp (testresp)结束
MessageType:“std_srvs / EmptyResponse”

创建双号业务

到目前为止,服务服务器还没有做任何有意义的工作,但是您可以使用服务进行计算和数据操作。创建一个添加两个整数的服务。

有一个现有的服务类型,example_interfaces / AddTwoInts我们可以用它来完成这项任务。可以通过调用来检查请求和响应消息的结构ros2味精显示.请求包含两个整数,一个b,响应包含它们的添加总和

ros2味精显示example_interfaces / AddTwoIntsRequest
Int64 a Int64 b——Int64 sum
ros2味精显示example_interfaces / AddTwoIntsResponse
Int64 a Int64 b——Int64 sum

使用此消息类型和一个计算添加的回调函数创建服务服务器。为了你的方便,这个exampleHelperROS2SumCallback函数已经实现了这个计算。将函数指定为回调函数。

sumserver = ros2svcserver (node_1,“/总和”“example_interfaces / AddTwoInts”@exampleHelperROS2SumCallback)
sumserver = ros2svcserver with properties: ServiceType: 'example_interfaces/AddTwoInts' ServiceName: '/sum' NewRequestFcn: @exampleHelperROS2SumCallback History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

要调用服务服务器,您必须创建一个服务客户机。注意,这个客户端可以在ROS 2网络的任何地方创建。出于本例的目的,我们将为/笔在MATLAB环境下服务。然后我们将等待以确保客户端已经连接到服务器。

sumclient = ros2svcclient (node_3,“/总和”“example_interfaces / AddTwoInts”
sumclient = ros2svccclient with properties: ServiceType: 'example_interfaces/AddTwoInts' ServiceName: '/sum' History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'
waitForServer (sumclient“超时”3);

创建请求消息。你可以定义两个整数,一个b,当你使用调用命令。

sumreq = ros2message (sumclient);sumreq。一个= int64(2); sumreq.b = int64(1);

期望这两个数的和是3。要调用服务,请使用以下命令。服务响应消息将包含总和属性,该属性存储添加的一个b

sumresp =调用(sumclient sumreq,“超时”3)
sumresp =结构体字段:MessageType: 'example_interfaces/ addtwintsresponse ' sum: 3

关闭ROS 2网络

从ROS 2网络中移除样本节点和业务服务器。

清楚(“node_1”);清楚(“node_2”);清楚(“node_3”);

下一个步骤