免费网站建站排名,wordpress手机电脑端,在线商城网站模板,宁波网站优化公司电话0. 简介
在前几讲我们讲了Matlab中的Message以及Topic的相关知识。而ROS主要支持的通信机制还有服务这一类。服务通过允许请求以及响应的通信方式#xff0c;来给整个系统完成更紧密的耦合。服务客户端向服务服务器发送请求消息并等待响应。服务器将使用请求中的数据构造响应…0. 简介
在前几讲我们讲了Matlab中的Message以及Topic的相关知识。而ROS主要支持的通信机制还有服务这一类。服务通过允许请求以及响应的通信方式来给整个系统完成更紧密的耦合。服务客户端向服务服务器发送请求消息并等待响应。服务器将使用请求中的数据构造响应消息并将其发送回客户端。每个服务都有一个类型该类型决定请求和响应消息的结构。
1. ROS1的服务端和客户端 1.1 创建服务端
在ROS1当中如果希望创建一个简单的服务服务器并在调用服务时能够显示“A service client is calling”。使用rosssvcserver命令创建服务。从而指定服务名称和服务消息类型。然后还要将回调函数定义为exampleHelperROSEmptyCallback。
为了获得更快的性能一般我们在设置rossvcsrve时候带上结构格式消息类型。
testserver rossvcserver(/test,std_srvs/Empty,exampleHelperROSEmptyCallback,DataFormat,struct)testserver ServiceServer with properties: ServiceType: ‘std_srvs/Empty’ ServiceName: ‘/test’ NewRequestFcn: exampleHelperROSEmptyCallback DataFormat: ‘struct’ 当列出ROS网络中的所有服务时可以看到新服务/test。
rosservice list/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 此外还可以使用rosservice info获取有关您的服务的更多信息。
rosservice info /testNode: /matlab_global_node_55791 URI: rosrpc://ah-csalzber:51639 Type: std_srvs/Empty Args: MessageType 1.2 创建客户端
使用服务客户机从ROS服务服务器请求信息。要创建客户端请使用带有服务名称的rossvcclient作为参数。
为我们刚刚创建的/test服务创建一个服务客户机。
testclient rossvcclient(/test,DataFormat,struct)testclient ServiceClient with properties: ServiceType: ‘std_srvs/Empty’ ServiceName: ‘/test’ DataFormat: ‘struct’ 为服务创建一个空请求消息。使用rosmessage函数并将客户端作为第一个参数传递。这将创建一个具有服务指定的消息类型和格式的服务请求函数。
testreq rosmessage(testclient)testreq struct with fields: MessageType: ‘std_srvs/EmptyRequest’ 确保服务已连接到客户端并在必要时等待客户端连接。
waitForServer(testclient,Timeout,3)当您希望从服务器获得响应时请使用call函数该函数将调用服务服务器并返回响应。您之前创建的服务服务器将返回一个空响应。此外它将调用exampleHelperROSEmptyCallback函数并显示字符串“A service client is calling”。您还可以定义一个Timeout参数该参数指示客户机应该等待响应的时间。
testresp call(testclient,testreq,Timeout,3);如果上面的调用函数失败就会出错。如果希望使用条件对调用失败做出反应则可以从调用函数返回状态和statustext输出而不是错误。状态输出指示调用是否成功而statustext提供其他信息。waitForServer也可以返回类似的输出。
numCallFailures 0;
[testresp,status,statustext] call(testclient,testreq,Timeout,3);
if ~statusnumCallFailures numCallFailues 1;fprintf(Call failure number %d. Error cause: %s\n,numCallFailures,statustext)
elsedisp(testresp)
endMessageType: std_srvs/EmptyResponse1.3 两数之和
如果说我们想要完成两数求和这样的功能我们可以先将现有的服务类型roscpp_tutorials/TwoInts用于此任务。您可以通过调用rosmsg show来检查请求和响应消息的结构。请求包含两个整数A和B响应包含它们在Sum中的加法。
rosmsg show roscpp_tutorials/TwoIntsRequestint64 A int64 B rosmsg show roscpp_tutorials/TwoIntsResponseint64 Sum 使用此消息类型创建服务服务器和计算加法的回调函数。为了方便起见exampleHelperROSSumCallback函数已经实现了这个计算。将函数指定为回调函数。
sumserver rossvcserver(/sum,roscpp_tutorials/TwoInts,exampleHelperROSSumCallback,DataFormat,struct)sumserver ServiceServer with properties: ServiceType: ‘roscpp_tutorials/TwoInts’ ServiceName: ‘/sum’ NewRequestFcn: exampleHelperROSSumCallback DataFormat: ‘struct’ 要调用服务服务器必须创建一个服务客户机。注意这个客户端可以在ROS网络中的任何地方创建。为了本例的目的我们将在MATLAB中为/sum服务创建一个客户端。
sumclient rossvcclient(/sum,DataFormat,struct)
sumreq rosmessage(sumclient);
sumreq.A int64(2);
sumreq.B int64(1)
if isServerAvailable(sumclient)sumresp call(sumclient,sumreq,Timeout,3)
elseerror(Service server not available on network)
endsumresp struct with fields: MessageType: ‘roscpp_tutorials/TwoIntsResponse’ Sum: 3 2. ROS2的服务端和客户端
…详情请参照古月居