调用
调用ROS或ROS 2服务服务器并接收响应
语法
描述
发送默认服务请求消息并等待服务响应
=电话(serviceclient
)响应
.默认的服务请求消息是类型为空的消息serviceclient。ServiceType
.
指定一个服务请求消息,响应
=电话(serviceclient
,requestmsg
)requestmsg
,发送到服务。
[
返回一个响应
,状态
,statustext
= call(___)状态
说明是否响应
已成功收到,和statustext
对象的附加信息状态
,使用前面语法中的任何参数。如果调用失败,则状态
将假
默认值为空响应
消息,该函数将不会显示错误。
例子
使用默认消息调用服务客户端
连接ROS网络。
rosinit
启动ROS核心…耗时0.35385秒。在http://172.29.209.26:59266上初始化ROS master。初始化全局节点/matlab_global_node_04063,使用NodeURI http://dcc245873glnxa64:37529/和MasterURI http://localhost:59266。
设置业务服务器。使用ROS消息数据格式的结构。
服务器= rossvcserver(/测试的,“std_srvs /空”@exampleHelperROSEmptyCallback,...“DataFormat”,“结构”);客户端= rossvcclient(/测试的,“DataFormat”,“结构”);
检查业务服务器是否可用。如果是,等待服务客户端连接到服务器。
如果(isServerAvailable(client)) [connectionStatus,connectionStatustext] = waitForServer(client)结束
connectionStatus =逻辑1
connectionStatustext = 'success'
使用默认消息调用服务服务器。
响应=呼叫(客户端)
响应=带字段的结构:MessageType:“std_srvs / EmptyResponse”
如果调用
上述函数失败,将导致错误。方法,而不是返回错误,如果希望使用条件对调用失败作出反应,则返回状态
而且statustext
调用函数的输出。的状态
输出表示调用是否成功,而statustext
提供附加信息。
numcallfails = 0;[response,status,statustext] = call(客户端,“超时”3);如果~status numcallfails = numcallfails + 1;流(“呼叫失败号码%d。错误原因:%s\n"、numCallFailures statustext)其他的disp(响应)结束
MessageType:“std_srvs / EmptyResponse”
关闭ROS网络。
rosshutdown
使用NodeURI http://dcc245873glnxa64:37529/和MasterURI http://localhost:59266关闭全局节点/matlab_global_node_04063。在http://172.29.209.26:59266上关闭ROS master。
使用特定请求消息调用响应
连接ROS网络。
rosinit
启动ROS核心…用时0.42616秒。在http://172.29.209.26:50464上初始化ROS master。初始化全局节点/matlab_global_node_82406,使用NodeURI http://dcc245873glnxa64:36833/和MasterURI http://localhost:50464。
设置一个服务服务器和客户端。该服务器计算两个整数的和,并基于ROS服务教程。
Sumserver = rossvcserver(/笔的,“roscpp_tutorials / TwoInts”, @exampleHelperROSSumCallback);Sumclient = rossvcclient(/笔的);
获取客户端的请求消息并修改参数。
reqMsg = rosmessage(sumclient);reqMsg。A = 2;reqMsg。B = 1;
调用服务并获得响应。响应应该是请求消息中给出的两个整数的和。等待5秒服务超时。
response = call(sumclient,reqMsg,“超时”5)
response = ROS TwoIntsResponse消息,带有属性:MessageType: 'roscpp_tutorials/TwoIntsResponse' Sum: 3使用showdetails显示消息的内容
关闭ROS网络。
rosshutdown
使用NodeURI http://dcc245873glnxa64:36833/和MasterURI http://localhost:50464关闭全局节点/matlab_global_node_82406。在http://172.29.209.26:50464上关闭ROS master。
使用自定义回调函数调用ROS 2服务客户端
创建带有两个节点的示例ROS 2网络。
Node_1 = ros2node(“node_1_service_client”);Node_2 = ros2node(“node_2_service_client”);
设置一个服务服务器并将其连接到一个ROS 2节点。指定回调函数flipstring
,它翻转输入字符串。回调函数在本例的最后定义。
Server = ros2svcserver(node_1,/测试的,“test_msgs / BasicTypes”, @flipString);
设置一个相同服务类型的服务客户端,并将其附加到不同的节点。
客户端= ros2svcclient(node_2,/测试的,“test_msgs / BasicTypes”);
等待服务客户端连接到服务器。
[connectionStatus,connectionStatustext] = waitForServer(客户端)
connectionStatus =逻辑1
connectionStatustext = 'success'
基于客户端创建请求消息。将字符串赋值给消息中的相应字段,string_value
.
请求= ros2message(客户端);请求。string_value =“hello world”;
检查业务服务器是否可用。如果是,则发送一个服务请求并等待响应。指定服务等待响应3秒。
如果(isServerAvailable(客户端))response = call(客户端,请求)“超时”3);结束
对象中的请求消息的反转字符串string_value
字段。
response.string_value
Ans = 'dlrow olleh'
如果调用
上述函数失败,将导致错误。方法,而不是返回错误,如果希望使用条件对调用失败作出反应,则返回状态
而且statustext
调用函数的输出。的状态
输出表示调用是否成功,而statustext
提供附加信息。
numcallfails = 0;[response,status,statustext] = call(客户端,请求,“超时”3);如果~status numcallfails = numcallfails + 1;流(“呼叫失败号码%d。错误原因:%s\n"、numCallFailures statustext)其他的disp (response.string_value)结束
dlrow olleh
用于翻转字符串的回调函数定义如下。
函数resp = flipString(req,resp)反转REQ中字符串的顺序,并在RESP中返回。分别地。String_value = fliplr(req.string_value);结束
输入参数
serviceclient
- - - - - -服务客户端
ros。ServiceClient
对象句柄|ros2serviclient
对象句柄
ROS或ROS 2服务客户端,指定为ros。ServiceClient
或ros2serviceclient
对象句柄。
requestmsg
- - - - - -请求消息
消息
对象句柄|结构
请求消息,指定为消息
对象句柄或结构。缺省消息类型为serviceclient。ServiceType
.
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:“超时”,5
超时
- - - - - -服务响应超时(以秒为单位)
正(默认)|标量
服务响应的超时时间,以秒为单位,由逗号分隔的对组成“超时”
一个标量。如果服务客户端没有收到服务响应,并且超时时间已过,调用
显示一个错误信息,并让MATLAB®继续运行当前程序。的默认值正
阻止MATLAB运行当前程序,直到服务客户端收到服务响应。
DataFormat
- - - - - -ROS服务客户端的消息格式
“对象”
(默认)|“结构”
ROS服务客户端的消息格式,指定为“对象”
或“结构”
.在使用名称-值输入创建服务客户端时设置此属性。有关更多信息,请参见ROS消息结构.此参数仅适用于ROS服务客户端。
输出参数
响应
-响应消息
消息
对象句柄|结构
由服务服务器发送的响应消息,作为消息
对象句柄或结构。
状态
—服务呼叫的状态
逻辑
标量
服务调用的状态,返回为逻辑
标量。如果调用失败,状态为假
.
请注意
使用状态
在入口点函数中使用call进行代码生成时,输出参数。这将避免运行时错误并输出状态,可以在调用代码中对其作出反应。
statustext
—与服务调用状态相关联的状态文本
特征向量
与服务调用状态相关联的状态文本,作为以下之一返回:
“成功”
—服务响应成功。“输入”
—输入的函数无效。“超时”
—在指定的超时时间内没有收到服务响应。“未知”
—未知错误,未收到服务响应。
提示
ROS 2服务服务器不能将回调执行中的错误直接传递给客户端。在这种情况下,服务器只返回默认响应,没有任何失败指示。因此,建议在回调函数中使用try-catch块,并在响应消息中设置特定的字段,以在服务器端传达回调执行的成功/失败。
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
金宝app仅对生成类型支持,
可执行的
.使用在MATLAB函数不支持Block。金宝app
版本历史
R2019b引入R2021a:ROS消息结构
现在可以将消息创建为具有与消息对象属性匹配的字段的结构。使用结构通常可以提高创建、更新和使用ROS消息的性能,但是设置消息字段时不再验证消息字段。在通过网络发送时,将验证来自结构的消息类型和相应的字段值。
要使用ROS消息作为结构,请使用“DataFormat”
在创建发布者、订阅者或其他ROS对象时使用name-value参数。从这些对象生成的任何消息都将利用结构。
Pub = rospublisher(“/扫描”,“sensor_msgs /提升”,“DataFormat”,“结构”MSG = rosessage(酒吧)
也可以直接将消息创建为结构,但请确保将数据格式指定为“结构”
对于发布者、订阅者或其他ROS对象也是如此。ROS对象默认情况下仍然使用消息对象。
消息(“/扫描”,“sensor_msgs /提升”,“DataFormat”,“结构”)...Pub = rospublisher(“/扫描”,“sensor_msgs /提升”,“DataFormat”,“结构”)
在未来的版本中,ROS消息将默认使用结构,并且将删除ROS消息对象。
有关更多信息,请参见使用消息结构提高ROS的性能.
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。