《 无人驾驶原理与实践》一2.7ROS Service
2.7ROS Service
ROS除了发布/订阅这类通信机制以外,还提供了一种请求/回复(Request/Response)机制,如图29所示。
这种通信机制通过Service(服务)来实现。服务和主题很相似,相比于主题,服务会有一个给客户端节点的反馈,服务的定义也与消息相似,
图29请求/回复机制
文件名习惯上使用srv后缀,文件的前面为请求的消息格式,中间以“---”分隔,后面是回复消息的格式,如图210所示。
同样,也可以通过命令行对服务进行分析。常用的服务分析命令包括:
◆ rosservice list:列出当前所有的服务。
◆ rosservice type:显示服务的类型。
◆ rosservice call:调用服务。
ROS中的服务器(Server)/客户端(Client)的定义和发布者/订阅者的定义颇为相似,以下面代码为例,客户端向服务器发送两个整数,服务器对两个整数求和,并且将求和的结果反馈给客户端程序。下面首先定义服务器。
通过上面的代码得出,调用nodeHandleadvertiseService (service_name, callback_function)即可创建一个服务器。当收到请求时,服务器执行定义好的回调函数,既然代码中存在ROS的回调函数,就应该添加ros::spin()来保持节点的运行和对回调的监听。在回调函数中,当完成处理后应该填充response部分,service的回调函数返回值通常为bool,返回true表明回调被正确地执行了。下面接着分析客户端。
类似于发布者的定义,我们使用nodeHandleserviceClient<service_type>(service_name)创建一个客户端,并且像实例化一条消息一样,实例化一个服务。这里我们只需要填充服务的request部分。在客户端,通过clientcall(service)向服务器发送请求,通过serviceresponse来获取反馈的结果。
- 点赞
- 收藏
- 关注作者
评论(0)