主要内容

呼叫和提供ROS 2服务

ROS支金宝app持两种主要通信机制:主题和服务。主题具有发布者和订阅者,并用于发送和接收消息(请参阅与ROS 2发布者和订阅者交换数据).服务另一方面,通过允许请求-响应通信实现更紧密的耦合。一个服务客户端对象发送请求消息服务服务器然后等待回复。服务器将使用请求中的数据构造响应消息并将其发送回客户端。每个服务都有一个类型,该类型决定请求和响应消息的结构。

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

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

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

服务的概念如下图所示:

Basic.png

此示例向您展示如何设置服务服务器,以便将服务发布到ROS网络。此外,您将学习如何使用服务客户机调用服务器并接收响应。

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

创建服务服务器

在研究服务概念之前,创建带有三个节点的示例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历史:' keepast '深度:10可靠性:'reliable'耐久性:'volatile'

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

ros2 (“服务”“列表”);
/ _matlab_introspec_0_rmw_fastrtps_cpp /describe_parameters / _matlab_introspec_0_rmw_fastrtps_cpp /get_parameters / _matlab_introspec_0_rmw_fastrtps_cpp /list_parameters / _matlab_introspec_0_rmw_fastrtps_cpp /set_parameters / _matlab_introspec_0_rmw_fastrtps_cpp /set_parameters_atomically /node_1/describe_parameters /node_1/get_parameter_types /node_1/list_parameters /node_1/set_parameters/node_1/set_parameters_atomically /node_2/describe_parameters /node_2/get_parameter_types /node_2/get_parameters /node_2/list_parameters /node_2/set_parameters_atomically /node_3/describe_parameters /node_3/get_parameter_types /node_3/get_parameters /node_3/set_parameters /node_3/set_parameters /node_3/set_parameters_atomically /service_example

创建服务客户端

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

对象的服务客户机创建/测试服务,并将其附加到不同的节点。

Testclient = ros2svcclient(node_2,“/ service_example”“std_srvs /空”
testclient = ros2svcclient with properties: ServiceType: 'std_srvs/Empty' ServiceName: '/service_example'历史记录:' keepast '深度:10可靠性:'reliable'耐久性:'volatile'

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

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

确保服务已连接到客户端,并在必要时等待客户端连接。

waitForServer (testclient“超时”3)

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

Testresp = call(testclient, teststreq,“超时”3)
testresp =带字段的结构:MessageType:“std_srvs / EmptyResponse”

如果上面的调用函数失败,就会出错。如果希望使用条件对调用失败做出反应,则可以从调用函数返回状态和statustext输出,而不是错误。状态输出指示调用是否成功,而statustext提供其他信息。waitForServer也可以返回类似的输出。

numcallfails = 0;[testresp,status,statustext] = call(testclient, teststreq,“超时”3);如果~status numcallfails = numcallfails + 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
ros2味精显示example_interfaces / AddTwoIntsResponse
int64总和

使用此消息类型创建服务服务器和计算加法的回调函数。为方便起见,我们exampleHelperROS2SumCallback函数已经实现了此计算。将函数指定为回调函数。

Sumserver = ros2svcserver(node_1,“/总和”“example_interfaces / AddTwoInts”@exampleHelperROS2SumCallback)
sumserver = ros2svcserver with properties: ServiceType: 'example_interfaces/AddTwoInts' ServiceName: '/sum' NewRequestFcn: @exampleHelperROS2SumCallback历史:' keepast '深度:10可靠性:'reliable'耐久性:'volatile'

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

Sumclient = ros2svcclient(node_3,“/总和”“example_interfaces / AddTwoInts”
sumclient = ros2svcclient with properties: ServiceType: 'example_interfaces/AddTwoInts' ServiceName: '/sum'历史记录:' keepast '深度:10可靠性:'reliable'耐久性:'volatile'
waitForServer (sumclient“超时”3);

创建请求消息。你可以定义这两个整数,一个而且b,它们会在使用调用命令。

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

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

Sumresp = call(sumclient,sumreq,“超时”3)
sumresp =带字段的结构:MessageType: 'example_interfaces/AddTwoIntsResponse' sum: 3

关闭ROS 2网络

从ROS 2网络中删除示例节点和服务服务器。

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

下一个步骤