ROS中除了消息传递机制还有另外一种通信方式称为服务调用(service calls)。服务调用和消息的区别主要在两方面的内容。
(1)服务调用是双向的,一个节点给另外一个节点发送信息并等待响应,因此是双向通讯。
(2)服务调用是实现一对一的通讯,一个节点发起一个服务,对这个服务的响应返回这个节点。
(3)服务常用在分布式系统中。
服务的基本过程
服务的基本过程是一个客户端(client)节点发送一些称为请求(request)的数据到一个服务器(server)节点,并且等待回应。服务器节点接收到请求之后,采取行动(计算,配置软件或者硬件,改变自身的行为等)。然后发送一些称为响应的(response)的数据给客户端节点。
服务需要定义一对消息,必须有请求(request)消息的数据类型和(response)消息的数据类型。这两种消息类型都存储在.srv后缀的文件中,srv文件存储在功能包的srv子文件夹中。
ROS中有两种服务管理工具,一个是rossrv,是用来查询一个服务的信息,类似与rosmsg。另外一个是rosservice,是用来查询所有运行的服务。
rosservice的用法:
(1) $ rosservice call /service args : 使用给定的参数调用服务。
(2) $ rosservice find /service-type : 找到给定服务类型的服务
(3) $ rosservice info /services : 打印给定服务的信息
(4) $ rosservice list : 列出在系统上运行的服务
(5) $ rosservice type /service : 显示给定服务的类型
(6) $ rosservice uri /service : 打印出服务的 ROSRPC URI
ROS bag
ROS 包用来存储来自话题(Topic)和服务(Service)的信息。包的主要应用是数据记录(data logging),机器人的数据可以被记录,可视化和离线运行。
包的常用命令如下:
(1) $ rosbag record [topic_1] [topic_2] -o [bag_name] : 这个命令用来记录给定的话题中的信息并且写入一个包文件,如果参数是 -a 则将所有话题的数据写入包文件。
(2) $ rosbag play [bag_name] : 回放一个包内的数据。
有一个GUI工具可以操作包,利用 rqt_bag 调用。