文章目录
本节沿上节继续介绍通信架构方面的内容
通信方式(接上)
Service
之前所说的topic是采用发布订阅的方式,但有些时候这种单向的消息传输不能满足我们的需求。
ROS中的同步通信方式,Node之间可以通过request-reply的方式通信。
此处服务器Server
会给外界提供一个服务Service
,别的node
就可以通过请求Request
来调用这个服务。如果没有人调用,这个服务便不会被执行。
适用于一些场景,如一个node想不定时地获得人体坐标。此时如果我们用Service的方式来通信的话,便不需要传感器一直获取人体坐标信息并发送,只在有请求时才执行。
注意:同步通信即表明,在Client发送完请求后会阻塞,直到服务器端返回了结果,Client才会继续执行。
Topic VS Service
Callback 和 RPC 的理解不清楚
srv
Service通信的数据类型或者说是格式标准,定义在*.srv文件中。
srv文件写法如下
路径固定,同时横线上是请求服务要求的格式,横线下是应答返回的格式。请求的消息应该尽量简单。而srv里面就只能嵌套msg文件了,在HumanPose[]
里的文件格式就由下面的格式要求规范了。
注意
在自己定义和修改完msg或srv之后,要修改package.xml
和CMakeList.txt
文件。可见下图中红色的部分。
常用命令
Parameter Server
参数服务器其实在执行roscore
指令时,系统就已经自动帮我们启动好了。它是ROS里面有别于同步通信和异步通信的一种通信方式。该方式较之前topic和service更为静态。通常情况下,我们把一些不常改变的参数放在PS里,以便于读写。同时,我们可以用命令行,launch文件和node(API)对其进行读写操作。
PS维护着一个存储各种参数的键值对字典,字典里存储了各种参数和配置。
在命令行中的操作
在load
和dump
中,都必须采用YAML的格式,如下
name:'ZHANGSAN'
age:20
gender:'M'
score:{Chinese:80,Math:90|
在launch文件中的操作
在API修改
详见roscpp和rospy部分
Action
对于同步通信的方式,Service在发出请求后需要阻塞等待结果。某些结果可能需要的时间比较长,但此时对于client来说,它并不知道server是在执行还是死机了。所以我们希望server可以提供反馈,对进度有一个实时的跟进。同时,当server在提供服务中,我们也可能希望打断该服务做别的操作,那此时service这种通信方式就不满足需求了。对此问题,Action应运而生。
Action 类似于Service,带有状态反馈的通信方式。通常用在长时间(如移动一段距离),可抢占(做到一半可以被打断)的任务中。
goal:即request
cancel:中断指令
status:server所处的状态
result:动作处理完之后返回的结果
feedback:实时状态
action
Action通信的数据格式,定义在*.action文件中。
action要分为三段:
- 第一段:goal
- 第二段:result (动作执行完回传,只传一次)
- 第三段:feedback(实时的状态,所以可能多次或一直回传)
举例
转载请注明出处。
本文总结于中国大学MOOC《机器人操作系统入门》
链接: link.
图片来自于课程视频截图