主要内容

致电并提供ROS服务

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

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

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

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

服务的概念如下图所示:

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

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

创建服务服务器

在检查服务概念之前,请在MATLAB®和示例ROS网络中启动ROS Master。exampleHelperROSCreateSampleNetwork将创建一些服务服务器来模拟逼真的ROS网络。

罗斯尼特
初始化ROS主机上的HTTP:// HYD-GDAVULUR:53363 /。使用nodeUri初始化全局节点/ matlab_global_node_86569 http:// hyd-gdavulur:53367 /
exampleHelperROSCreateSampleNetwork

假设您想要创建一个简单的服务服务器来显示“服务客户正在呼叫”当你呼叫服务时。属性创建服务rossvcserver命令。指定服务名称和服务消息类型。还将回调函数定义为exampleHelperROSEmptyCallback.服务器服务器的回调函数具有非常特定的签名。有关详细信息,请参阅文档rossvcserver

testserver = rossvcserver (/测试的'std_srvs /空',@examplehelperrosemptycallback)
testserver =具有属性的服务器:servicename:'/ test'serviceType:'std_srvs /空'newrequestfcn:@examplehelperrosumpycallback

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

rosservice列表
/添加/回复/测试

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

rosservice信息/测试
Node: /matlab_global_node_86569 URI: rosrpc://HYD-GDAVULUR:53368/ Type: std_srvs/空参数:

创建服务客户端

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

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

testclient = rossvcclient(/测试的
ServiceName: '/test' ServiceType: 'std_srvs/Empty'

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

testreq = rosmessage (testclient)
testreq = ROS EmptyRequest message with properties: MessageType: 'std_srvs/EmptyRequest'使用showdetails显示消息内容

当您想从服务器获得响应时,使用调用函数,调用服务服务器并返回响应。您之前创建的服务服务器将返回一个空响应。另外,它会打电话给exampleHelperROSEmptyCallback函数并显示字符串“服务客户正在呼叫”.您也可以定义一个超时参数,该参数指示客户机应该等待响应多长时间。

testResp =呼叫(TestClient,TestReq,“超时”3);

创建双号业务

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

有一个现有的服务类型,roscpp_tutorials / TwoInts,我们可以使用此任务。您可以通过调用检查请求和响应消息的结构rosmsg显示.请求包含两个整数,一个B,回应包含他们的加入总和

rosmsg.显示roscpp_tutorials / TwoIntsRequest
INT64 A INT64 B.
rosmsg.显示roscpp_tutorials / TwoIntsResponse
int64总和

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

sumserver = rossvcserver('/和'“roscpp_tutorials / TwoInts”@exampleHelperROSSumCallback)
sumserver = ServiceServer带有属性:ServiceName: '/sum' ServiceType: 'roscpp_tutorials/TwoInts' NewRequestFcn: @exampleHelperROSSumCallback

要调用服务服务器,您必须创建服务客户端。请注意,可以在ROS网络中的任何位置创建此客户端。出于此示例的目的,我们将为客户创建一个客户/和在MATLAB环境下服务。

sumclient = rossvcclient('/和'
sumclient = ServiceClient with properties: ServiceName: '/sum' ServiceType: 'roscpp_tutorials/TwoInts'

创建请求消息。你可以定义两个整数,一个B,当您使用时添加在一起调用命令。

sumreq = rosmessage (sumclient);sumreq。= 2;sumreq。B = 1
sumreq = ROS twintsrequest message with properties: MessageType: 'roscpp_tutorials/ twintsrequest ' A: 2 B: 1使用showdetails显示消息的内容

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

SUMRESP =呼叫(SUMCLIENT,SUMREQ,“超时”3,3)
SUMRESP = ROS TwoIntsResponse消息与属性:messageType:'roscpp_tutorials / twinintsresponse'sum:3使用showdetail来显示消息的内容

关闭ROS网络

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

examplehelperrosshutdownsamplenetwork

关闭ROS master,删除全局节点。

rosshutdown
使用NodeURI http://HYD-GDAVULUR:53367/关闭全局节点/matlab_global_node_86569

下一步