ROS的四种通信架构(转载)
转载自:https://blog.csdn.net/sru_alo/article/details/100100761
如果有侵权请联系删除
ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构。ROS的通信方式有以下四种:
- Topic 主题
- Service 服务
- Parameter Service 参数服务器
- Actionlib 动作库
一 Topic
ROS中的通信方式中,topic是常用的一种。对于实时性、周期性的消息,使用topic来传输是最佳的选择。topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。topic要经历下面几步的初始化过程:首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅该topic,从而建立起sub-pub之间的通信。注意整个过程是单向的。其结构示意图如下:
Subscriber接收消息会进行处理,一般这个过程叫做回调(Callback)。所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。
上图就是ROS的topic通信方式的流程示意图。topic通信属于一种异步的通信方式。下面我们通过一个示例来了解下如何使用topic通信。
3.3.3 通信示例
参考下图,我们以摄像头画面的发布、处理、显示为例讲讲topic通信的流程。在机器人上的摄像头拍摄程序是一个node(圆圈表示,我们记作node1),当node1运行启动之后,它作为一个Publisher就开始发布topic。比如它发布了一个topic(方框表示),叫做/camera_rgb
,是rgb颜色信息,即采集到的彩色图像。同时,node2假如是图像处理程序,它订阅了/camera_rgb
这个topic,经过节点管理器的介绍,它就能建立和摄像头节点(node1)的连接。
那么怎么样来理解“异步”这个概念呢?在node1每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;而对于node2图像处理程序,它只管接收和处理/camera_rgb
上的消息,至于是谁发来的,它不会关心。所以node1、node2两者都是各司其责,不存在协同工作,我们称这样的通信方式是异步的。
ROS是一种分布式的架构,一个topic可以被多个节点同时发布,也可以同时被多个节点接收。比如在这个场景中用户可以再加入一个图像显示的节点,我们在想看看摄像头节点的画面,则可以用自己的笔记本连接到机器人上的节点管理器,然后在自己的电脑上启动图像显示节点。
这就体现了分布式系统通信的好处:扩展性好、软件复用率高。
总结三点:
- topic通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。
- subscriber通过回调函数的方式来处理消息。
- topic可以同时有多个subscribers,也可以同时有多个publishers。ROS中这样的例子有:/rosout、/tf等等。
在实际应用中,我们应该熟悉topic的几种使用命令,下表详细的列出了各自的命令及其作用。
命令 | 作用 |
---|---|
rostopic list
|
列出当前所有的topic |
rostopic info topic_name
|
显示某个topic的属性信息 |
rostopic echo topic_name
|
显示某个topic的内容 |
rostopic pub topic_name ...
|
向某个topic发布内容 |
rostopic bw topic_name
|
查看某个topic的带宽 |
rostopic hz topic_name
|
查看某个topic的频率 |
rostopic find topic_type
|
查找某个类型的topic |
rostopic type topic_name
|
查看某个topic的类型(msg) |
如果你一时忘记了命令的写法,可以通过rostopic help
或rostopic command -h
查看具体用法。
二 Service
上一章我们介绍了ROS的通信方式中的topic(主题)通信,我们知道topic是ROS中的一种单向的异步通信方式。然而有些时候单向的通信满足不了通信要求,比如当一些节点只是临时而非周期性的需要某些数据,如果用topic通信方式时就会消耗大量不必要的系统资源,造成系统的低效率高功耗。
这种情况下,就需要有另外一种请求-查询式的通信模型。这节我们来介绍ROS通信中的另一种通信方式——service(服务)。
工作原理
简介
为了解决以上问题,service方式在通信模型上与topic做了区别。Service通信是双向的,它不仅可以发送消息,同时还会有反馈。所以service包括两部分,一部分是请求方(Clinet),另一部分是应答方/服务提供方(Server)。这时请求方(Client)就会发送一个request,要等待server处理,反馈回一个reply,这样通过类似“请求-应答”的机制完成整个服务通信。
这种通信方式的示意图如下:
Node B是server(应答方),提供了一个服务的接口,叫做/Service
,我们一般都会用string类型来指定service的名称,类似于topic。Node A向Node B发起了请求,经过处理后得到了反馈。
过程
Service是同步通信方式,所谓同步就是说,此时Node A发布请求后会在原地等待reply,直到Node B处理完了请求并且完成了reply,Node A才会继续执行。Node A等待过程中,是处于阻塞状态的成通信。这样的通信模型没有频繁的消息传递,没有冲突与高系统资源的占用,只有接受请求才执行服务,简单而且高效。
topic VS service
我们对比一下这两种最常用的通信方式,加深我们对两者的理解和认识,具体见下表:
名称 | Topic | Service |
---|---|---|
通信方式 | 异步通信 | 同步通信 |
实现原理 | TCP/IP | TCP/IP |
通信模型 | Publish-Subscribe | Request-Reply |
映射关系 | Publish-Subscribe(多对多) | Request-Reply(多对一) |
特点 | 接受者收到数据会回调(Callback) | 远程过程调用(RPC)服务器端的服务 |
应用场景 | 连续、高频的数据发布 | 偶尔使用的功能/具体的任务 |
举例 | 激光雷达、里程计发布数据 | 开关传感器、拍照、逆解计算 |
注意:远程过程调用(Remote Procedure Call,RPC),可以简单通俗的理解为在一个进程里调用另一个进程的函数。
操作命令
在实际应用中,service通信方式的命令时rosservice
,具体的命令参数如下表:
rosservice 命令 | 作用 |
---|---|
rosservice list
|
显示服务列表 |
rosservice info
|
打印服务信息 |
rosservice type
|
打印服务类型 |
rosservice uri
|
打印服务ROSRPC uri |
rosservice find
|
按服务类型查找服务 |
rosservice call
|
使用所提供的args调用服务 |
rosservice args
|
打印服务参数 |
三 Parameter server
简介
前文介绍了ROS中常见的两种通信方式——主题和服务,这节介绍另外一种通信方式——参数服务器(parameter server)。与前两种通信方式不同,参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。
参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
字典简介
何为字典,其实就是一个个的键值对,我们小时候学习语文的时候,常常都会有一本字典,当遇到不认识的字了我们可以查部首查到这个字,获取这个字的读音、意义等等,而这里的字典可以对比理解记忆。键值kay可以理解为语文里的“部首”这个概念,每一个key都是唯一的,参照下图:
每一个key不重复,且每一个key对应着一个value。也可以说字典就是一种映射关系,在实际的项目应用中,因为字典的这种静态的映射特点,我们往往将一些不常用到的参数和配置放入参数服务器里的字典里,这样对这些数据进行读写都将方便高效。
维护方式
参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:
- 命令行维护
- launch文件内读写
- node源码
下面我们来一一介绍这三种维护方式。
命令行维护
使用命令行来维护参数服务器,主要使用rosparam
语句来进行操作的各种命令,如下表:
rosparam 命令 | 作用 |
---|---|
rosparam set param_key param_value
|
设置参数 |
rosparam get param_key
|
显示参数 |
rosparam load file_name
|
从文件加载参数 |
rosparam dump file_name
|
保存参数到文件 |
rosparam delete
|
删除参数 |
rosparam list
|
列出参数名称 |
load&&dump文件
load和dump文件需要遵守YAML格式,YAML格式具体示例如下:
name:'Zhangsan'age:20gender:'M'score{Chinese:80,Math:90}score_history:[85,82,88,90]
简明解释。就是“名称+:+值”这样一种常用的解释方式。一般格式如下:
key : value
遵循格式进行定义参数。其实就可以把YAML文件的内容理解为字典,因为它也是键值对的形式。
launch文件内读写
launch文件中有很多标签,而与参数服务器相关的标签只有两个,一个是<param>
,另一个是<rosparam>
。这两个标签功能比较相近,但<param>
一般只设置一个参数,请看下例:
(1) (2) (3)
观察上例比如序号3的param就定义了一个key和一个value,交给了参数服务器维护。而序号1的param只给出了key,没有直接给出value,这里的value是由后没的脚本运行结果作为value进行定义的。序号(2)就是rosparam的典型用法,先指定一个YAML文件,然后施加command,其效果等于rosparam load file_name
。
node源码
除了上述最常用的两种读写参数服务器的方法,还有一种就是修改ROS的源码,也就是利用API来对参数服务器进行操作。具体内容我们学习完后面章节再进行介绍。
四 Action
4.4.1简介
Actionlib是ROS中一个很重要的库,类似service通信机制,actionlib也是一种请求响应机制的通信方式,actionlib主要弥补了service通信的一个不足,就是当机器人执行一个长时间的任务时,假如利用service通信方式,那么publisher会很长时间接受不到反馈的reply,致使通信受阻。当service通信不能很好的完成任务时候,actionlib则可以比较适合实现长时间的通信过程,actionlib通信过程可以随时被查看过程进度,也可以终止请求,这样的一个特性,使得它在一些特别的机制中拥有很高的效率。
4.4.2 通信原理
Action的工作原理是client-server模式,也是一个双向的通信模式。通信双方在ROS Action Protocol下通过消息进行数据的交流通信。client和server为用户提供一个简单的API来请求目标(在客户端)或通过函数调用和回调来执行目标(在服务器端)。
工作模式的结构示意图如下:
通信双方在ROS Action Protocal下进行交流通信是通过接口来实现,如下图:
我们可以看到,客户端会向服务器发送目标指令和取消动作指令,而服务器则可以给客户端发送实时的状态信息,结果信息,反馈信息等等,从而完成了service没法做到的部分.
4.4.3 Action 规范
利用动作库进行请求响应,动作的内容格式应包含三个部分,目标、反馈、结果。
- 目标
机器人执行一个动作,应该有明确的移动目标信息,包括一些参数的设定,方向、角度、速度等等。从而使机器人完成动作任务。
- 反馈
在动作进行的过程中,应该有实时的状态信息反馈给服务器的实施者,告诉实施者动作完成的状态,可以使实施者作出准确的判断去修正命令。
- 结果
当运动完成时,动作服务器把本次运动的结果数据发送给客户端,使客户端得到本次动作的全部信息,例如可能包含机器人的运动时长,最终姿势等等。
4.4.4 Action规范文件格式
Action规范文件的后缀名是.action,它的内容格式如下:
# Define the goaluint32 dishwasher_id # Specify which dishwasher we want to use---# Define the resultuint32 total_dishes_cleaned---# Define a feedback messagefloat32 percent_complete
4.4.5 Action实例详解
Actionlib是一个用来实现action的一个功能包集。我们在demo中设置一个场景,执行一个搬运的action,搬运过程中客户端会不断的发回反馈信息,最终完成整个搬运过程.
本小节的演示源码在课程的演示代码包里,此处为链接.
首先写handling.action文件,类比如上的格式.包括三个部分,目标,结果,反馈.如下:
# Define the goaluint32 handling_id---# Define the resultuint32 Handling_completed---# Define a feedback messagefloat32 percent_complete
写完之后修改文件夹里CmakeLists.txt如下内容:
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)add_action_files(DIRECTORY action FILES DoDishes.action) generate_messages(DEPENDENCIES actionlib_msgs)add_action_files(DIRECTORY action FILES Handling.action)generate_messages( DEPENDENCIES actionlib_msgs)
修改package.xml,添加所需要的依赖如下:
<build_depend>actionlib </build_depend>
<build_depend>actionlib_msgs</build_depend>
<run_depend>actionlib</run_depend>
<run_depend>actionlib_msgs</run_depend>
然后回到工作空间 catkin_ws
进行编译.
本例中设置的的action,定义了一个搬运的例子,首先写客户端,实现功能发送action请求,包括进行目标活动,或者目标活动.之后写服务器,实验返回客户端活动当前状态信息,结果信息,和反馈信息.从而实现action.本例测试结果截图如下:
小结
至此,ROS通信架构的四种通信方式就介绍结束,我们可以对比学习这四种通信方式,去思考每一种通信的优缺点和适用条件,在正确的地方用正确的通信方式,这样整个ROS的通信会更加高效,机器人也将更加的灵活和智能。机器人学会了通信,也就相当于有了“灵魂”。
ROS的四种通信架构(转载)相关推荐
- ROS的四种通信架构
ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构.ROS的通信方式有以下四种: Topic 主题 Service 服务 Parameter Service 参数服务器 A ...
- 从魔兽看四种设计模式(转载)
首开一篇,cnblogms很强大,就在这安居了, 以后要养成多写bolg的习惯, 多与别人交流... 以下为网上转载.从魔兽看四种设计模式(转载) 前段时间看到有人用魔兽来解释设计模式,感觉很有意思, ...
- springcloud生产环境一般怎么部署_机器学习模型生产环境部署的四种系统架构总结...
本文将从简单到复杂介绍典型架构的特点以及其优缺点. 介绍 一旦数据科学家对模型的性能感到满意,下一步便是"模型生产环境部署", 没有系统的合理配置,您的Kaggle Top1模型可 ...
- Network 之十四 email 通信架构、Postfix 部署详解
在之前的博文 Git 之八 详解 Gitlab 本地部署全过程.企业版 PATCH.Gitlab Pages 用到了本地搭建邮件服务器,由于之前对此没有概念,因此,今天专门学习一下(主要是需要配置 ...
- 秀场直播主播pk实现的四种技术架构
秀场互动直播是 RTC 技术应用的常见场景,虽然主播PK 的业务逻辑不算复杂,但由于在标准直播模式和主播PK 模式的切换过程中容易产生卡顿.黑屏等现象,为了在优雅实现业务逻辑的同时,最大程度缓解类似的 ...
- 利克特的四种管理方式(转载)
利克特的四种管理方式 利克特的四种管理方式简介 密执安大学伦西斯·利克特(Rensis Likert)教授和他的同事对领导人员和经理人员的领导类型和作风做了长达30年之久的研究,利克特在研究过程中所形 ...
- python整数拆分dp算法_整数拆分问题的四种解法【转载】
http://blog.csdn.net/u011889952/article/details/44813593 整数拆分问题的四种解法 原创 2015年04月01日 21:17:09 整数划分问题是 ...
- Jquery调用webService的四种方法 【转载】
本文转载自:http://space.itpub.net/221062/viewspace-580298 我总结几个关键点 1. 服务必须声明为ScriptService(否则会出现下面的问题) 2. ...
- 详解Java解析XML的四种方法(转载)
原文地址:http://developer.51cto.com/art/200903/117512.htm XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成 ...
最新文章
- php v9 ajax 翻页,phpcms v9建站 ajax列表分页加载更多word文档教程
- 已安装的sql怎么添加功能_微信群管理工具有哪些功能?怎么在社群中添加微信小助手?...
- 分析 C# 2.0 新特性 -- 范型(Generics)
- 什么是中台业务架构?
- GeoServer使用CSS渲染地图
- 国产数据库产业百花齐放 “1+4+4+N”格局形成
- ENVI入门系列教程---二、图像分析---9.遥感图像监督分类
- 中控消费机一直显示连接服务器,中控消费机培训及常见问题的解决办法课件.ppt...
- 计算机老出现安全警报怎么办,windows安全警报怎么关闭,教您怎么关闭windows安全警报...
- 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
- 2003年高考语文全国最高分_最新消息!2020高考语文数学题型大变!全国卷或有多套题...
- 华为云SSL证书申请流程
- 报错:Ncat: bind to :::8888: Address already in use. QUITTING
- 云计算是什么通俗解释_什么是云? 解释
- Syntactic sugar Syntactic salt
- 理解崩溃和崩溃日志(WWDC 2018 session 414)
- 单反相机风景摄影易记易学口诀
- 软件测试行情前景,你可以做测试多久?到底能干到多少岁?
- lower_bound,upper_bound的第四个参数的用法
- 下雨天客流量少,美容院怎么做生意
热门文章
- 中国大学(慕课)哈工大C语言程序设计精髓编程题在线测试第三周
- eBay卖家用WorldFirst将PayPal美元提现国内银行教程!
- 五一去哪里人最多?用 Python 抓取的热力图告诉你!
- 2018-2019-2 20175227张雪莹《Java程序设计》实验四 《Android程序设计》
- 独家 | 2017云栖大会放出哪些数据科学界的利好消息?
- WARNING: Heavy swapping observed on system in last 5 mins.
- 中国石油天然气股份有限公司2008年半年度报告摘要(业绩公告)
- java 经纬度计算_java 实现经纬度计算
- 学黑客要学什么编程语言
- Spring Security安全机制