主要内容

调用并提供ROS服务

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

这个服务通信具有以下特点:

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

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

服务的概念如下图所示:

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

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

创建服务服务器

检查服务概念,开始之前ROS主在MATLAB®和样本ROS网络。exampleHelperROSCreateSampleNetwork将创建一些服务服务器来模拟现实的ROS网络。

rosinit
启动ROS核心……在3.16秒内完成。初始化ROS主在http://192.168.178.1:55438上。初始化全局节点/ matlab_global_node_55791 NodeURI http://ah-csalzber: 51640 /
exampleHelperROSCreateSampleNetwork

假设你想要一个简单的服务服务器显示“一个服务客户端调用”当你调用服务。创建服务使用rossvcserver命令。指定服务名称和服务消息类型。还定义回调函数exampleHelperROSEmptyCallback。回调函数用于服务的服务器有一个非常特定的签名。的详情,请参阅文档rossvcserver

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

testserver = rossvcserver (“/测试”,“std_srvs /空”@exampleHelperROSEmptyCallback,“DataFormat”,“结构”)
testserver = ServiceServer属性:ServiceType: std_srvs /空的名:“/测试”NewRequestFcn: @exampleHelperROSEmptyCallback DataFormat:“结构”

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

rosservice列表
/添加/ 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 /回复/测试

你可以得到更多的信息关于你的服务使用rosservice信息。被列为全球的节点服务服务器是可获得的,你也看到它std_srvs /空服务类型。

rosservice信息/测试
节点:/ matlab_global_node_55791 URI: rosrpc: / / ah-csalzber: 51639类型:std_srvs /空参数:MessageType

创建服务客户端

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

创建一个服务端/测试我们刚刚创建的服务。

testclient = rossvcclient (“/测试”,“DataFormat”,“结构”)
testclient = ServiceClient的属性:ServiceType: std_srvs /空的名:“/测试”DataFormat:“结构”

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

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

确保服务连接到客户端,等待他们来连接,如果必要的。

waitForServer (testclient“超时”3)

当你想要得到的响应从服务器,使用调用函数,该函数调用服务服务器,并返回一个响应。您之前创建的服务服务器将返回一个空的反应。此外,它将调用exampleHelperROSEmptyCallback功能和显示字符串“一个服务客户端调用”。您还可以定义一个超时参数,这表明客户机应该多长时间等待响应。

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

如果上面的函数调用失败,它将错误。而不是一个错误,如果你更愿意对使用条件语句调用失败,返回状态statustext输出从调用函数。的状态输出表明如果调用成功了,statustext提供额外的信息。类似的输出可以回来waitForServer

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

创建一个服务添加两个数字

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

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

rosmsg显示roscpp_tutorials / TwoIntsRequest
int64 int64 B
rosmsg显示roscpp_tutorials / TwoIntsResponse
int64总和

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

sumserver = rossvcserver (“/总和”,“roscpp_tutorials / TwoInts”@exampleHelperROSSumCallback,“DataFormat”,“结构”)
sumserver = ServiceServer属性:ServiceType: roscpp_tutorials / TwoInts的名:“/总和”NewRequestFcn: @exampleHelperROSSumCallback DataFormat:“结构”

调用服务的服务器,你必须创建一个服务端。注意,这个客户可以创建ROS网络的任何地方。对于本示例中,我们将创建一个客户/笔在MATLAB环境下服务。

sumclient = rossvcclient (“/总和”,“DataFormat”,“结构”)
sumclient = ServiceClient的属性:ServiceType: roscpp_tutorials / TwoInts的名:“/总和”DataFormat:“结构”

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

sumreq = rosmessage (sumclient);sumreq。一个= int64(2); sumreq.B = int64(1)
sumreq =结构体字段:MessageType:“roscpp_tutorials / TwoIntsRequest”: 2 B: 1

预计这两个数的和是3。调用服务,使用以下命令。将包含一个服务响应消息总和属性,该属性存储的一个B。确保服务的服务器可以在调用之前,如果它不是,并作出相应的反应。

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

ROS关闭网络

删除示例服务器ROS的网络节点和服务。

exampleHelperROSShutDownSampleNetwork

关闭ROS掌握全球节点和删除。

rosshutdown
关闭全局节点/ matlab_global_node_55791 NodeURI http://ah-csalzber: 51640 /关闭ROS主在http://192.168.178.1:55438上。

下一个步骤