主要内容

呼叫和提供ROS服务

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

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

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

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

服务的概念如下图所示:

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

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

创建服务服务器

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

rosinit
启动ROS Core... ...用时3.16秒。在http://192.168.178.1:55438上初始化ROS master。使用NodeURI http://ah-csalzber:51640/初始化全局节点/matlab_global_node_55791
exampleHelperROSCreateSampleNetwork

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

为了获得更快的性能,请使用具有结构格式的消息的服务。

testserver = rossvcserver (“/测试”“std_srvs /空”@exampleHelperROSEmptyCallback,“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”“结构”
ServiceType: 'std_srvs/Empty'服务名称:'/test'数据格式:'struct'

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

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

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

waitForServer (testclient“超时”3)

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

testresp =调用(testclient testreq,“超时”3);

如果上面的调用函数失败,它将出错。如果您更喜欢使用条件语句对调用失败作出反应,则返回错误而不是错误状态statustext调用函数的输出。的状态输出显示调用是否成功,而statustext提供额外的信息。可以从下面返回类似的输出waitForServer

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

创建双号业务

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

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

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

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

sumserver = rossvcserver (“/总和”“roscpp_tutorials / TwoInts”@exampleHelperROSSumCallback,“DataFormat”“结构”
sumserver = ServiceServer with properties: ServiceType: 'roscpp_tutorials/TwoInts' 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。一个= int64(2); sumreq.B = int64(1)
sumreq =结构体字段:MessageType: 'roscpp_tutorials/TwoIntsRequest' A: 2 B: 1

期望这两个数的和是3。要调用服务,请使用以下命令。服务响应消息将包含总和属性,该属性存储添加的一个B.在进行调用之前,确保服务服务器可用,如果不可用,则适当地作出反应。

如果isServerAvailable(sumclient) sumrespp = call(sumclient,sumreq,)“超时”3)其他的错误("服务服务器在网络上不可用"结束
sumresp =结构体字段:MessageType: 'roscpp_tutorials/TwoIntsResponse

关闭ROS网络

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

exampleHelperROSShutDownSampleNetwork

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

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

下一个步骤