主要内容

呼叫和提供ROS服务

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

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

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

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

服务的概念如下图所示:

此示例向您展示如何设置服务服务器以向ROS网络进行广告服务。此外,您将学习如何使用服务客户端来调用服务器并接收响应。

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

创建服务服务器

在检查服务概念之前,启动MATLAB®中的ROS master和样本ROS网络。examplehelperroscreatesamplenetwork将创建一些服务服务器来模拟真实的ROS网络。

rosinit
推出ROS Core ......在3.16秒内完成。初始化ROS Master http://192.168.178.1:55438。使用nodeUri初始化全局节点/ matlab_global_node_55791 http:// ah-csalzber:51640 /
examplehelperroscreatesamplenetwork

假设您要制作显示的简单服务服务器“一个服务客户端正在调用”当你致电服务时。使用该服务创建服务Rossvcserver命令。指定服务名称和服务消息类型。还将回调函数定义为examplehelperrosumpycallback..服务服务器的回调函数有一个非常特定的签名。具体操作请参见相关文档Rossvcserver

为了更快的性能,使用结构格式的信息使用服务。

testserver = rossvcserver(“/测试”“std_srvs /空”,@ examplehelperrosumpycallback,“dataformat”“结构”
testserver = ServiceServer with properties: ServiceType: 'std_srvs/Empty' ServiceName: '/test' NewRequestFcn: @exampleHelperROSEmptyCallback DataFormat: 'struct'

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

rosservice.列表
/add /matlab_global_node_55791/get_loggers /matlab_global_node_55791/set_logger_level /node_1/get_loggers /node_1/set_logger_level /node_2/get_loggers /node_2/set_logger_level /node_3/get_loggers /node_3/set_logger_level /reply /test . /add / matlab_global_node_global_node_55791 /set_logger_level /node_1/get_loggers /node_2/set_logger_level /node_3/get_loggers /node_3/set_logger_level /reply /test

您可以获得更多关于您的服务使用的信息rosservice.信息.全局节点被列为可访问服务服务器的节点,您还可以看到它std_srvs /空服务类型。

rosservice.信息/测试
节点:/ matlab_global_node_55791 URI: rosrpc://ah-csalzber:51639 Type: std_srvs/Empty Args: MessageType

创建服务客户端

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

的服务客户端/测试我们刚刚创建的服务。

testclient = rossvcclient (“/测试”“dataformat”“结构”
testclient = serviceClient具有属性:serviceType:'std_srvs /空'servicename:'/ test'dataformat:'struct'

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

testreq = rosmessage(testclient)
testreq =结构体字段:MessageType:'std_srvs / listrequest'

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

waitforserver(testclient,“暂停”3)

当您想要从服务器获取响应时,使用称呼函数,该函数调用服务服务器并返回响应。您之前创建的服务服务器将返回一个空响应。此外,它将调用examplehelperrosumpycallback.函数并显示字符串“一个服务客户端正在调用”.你也可以定义a超时参数,指示客户端应该等待响应多长时间。

testresp =调用(testclient testreq,“暂停”,3);

如果上面的调用函数失败,它将出错。如果您更喜欢使用条件语句对调用失败作出反应,则返回错误而不是错误状态StatuStext.来自呼叫功能的输出。这状态输出显示调用是否成功,而StatuStext.提供其他信息。可以从类似的输出waitforserver

numCallFailures = 0;[testresp、状态、statustext] =调用(testclient testreq,“暂停”,3);如果〜状态numcallfailures = numcallfailues + 1;fprintf("呼叫失败号码%d。错误原因:% s \ n”,numcallfailures,statustext)其他的disp(testresp)结尾
messageType:'std_srvs / emptyresponse'

为添加两个数字创建服务

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

存在现有的服务类型,roscpp_tutorials / tewints.我们可以用它来完成这项任务。可以通过调用来检查请求和响应消息的结构ROSMSG显示.该请求包含两个整数,一种B.,响应包含它们的添加

rosmsg展示roscpp_tutorials / tworintsrequest.
A .不填B .不填
rosmsg展示roscpp_tutorials / tewintsresponse.
INT64 SUM

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

sumserver = rossvcserver (“/总和”“roscpp_tutorials / tewints”@exampleHelperROSSumCallback,“dataformat”“结构”
sumserver = serveryerver属性:serviceType:'roscpp_tutorials / tawints'servicename:'/ sum'newrequestfcn:@examplehelperrossumcallback dataformat:'struct'

要调用服务服务器,您必须创建一个服务客户机。注意,这个客户端可以在ROS网络的任何地方创建。出于本例的目的,我们将为/笔在Matlab中服务。

sumclient = rossvcclient (“/总和”“dataformat”“结构”
sumclient = ServiceClient with properties: ServiceType: 'roscpp_tutorials/TwoInts' ServiceName: '/sum' DataFormat: 'struct'

创建请求消息。您可以定义两个整数,一种B.,当你使用称呼命令。

Sumreq = Rosmessage(SumClient);sumreq.a = int64(2);sumreq.b = int64(1)
Sumreq =.结构体字段:MessageType:'roscpp_tutorials / twinintsrequest'a:2 b:1

期望这两个数的和是3。要调用服务,请使用以下命令。服务响应消息将包含物业,存储添加一种B..确保在拨打电话之前可用服务服务器,并且如果不是,则会对其进行反应。

如果isserveravailable(sumclient)sumresp = call(sumclient,sumreq,“暂停”3)其他的错误(“网络上不可用的服务服务器”结尾
sumresp =结构体字段:MessageType:'roscpp_tutorials / twingintsresponse'sum:3

关闭ROS网络

从ROS网络删除样本节点和服务服务器。

exampleHelperROSShutDownSampleNetwork

关闭ROS主站并删除全局节点。

Rosshutdown.
使用NodeURI http://ah-csalzber:51640/关闭全局节点/matlab_global_node_55791

下一个步骤