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网络删除样本节点和服务服务器。
exampleHelperROSShutDownSampleNetwork
关闭ROS主站并删除全局节点。
Rosshutdown.
使用NodeURI http://ah-csalzber:51640/关闭全局节点/matlab_global_node_55791
参考使用基本的ROS消息探讨如何在MATLAB中表示ROS消息。