转载自: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可以被多个节点同时发布,也可以同时被多个节点接收。比如在这个场景中用户可以再加入一个图像显示的节点,我们在想看看摄像头节点的画面,则可以用自己的笔记本连接到机器人上的节点管理器,然后在自己的电脑上启动图像显示节点。

这就体现了分布式系统通信的好处:扩展性好、软件复用率高。

总结三点

  1. topic通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。
  2. subscriber通过回调函数的方式来处理消息。
  3. 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 helprostopic 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的四种通信架构(转载)相关推荐

  1. ROS的四种通信架构

    ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构.ROS的通信方式有以下四种: Topic 主题 Service 服务 Parameter Service 参数服务器 A ...

  2. 从魔兽看四种设计模式(转载)

    首开一篇,cnblogms很强大,就在这安居了, 以后要养成多写bolg的习惯, 多与别人交流... 以下为网上转载.从魔兽看四种设计模式(转载) 前段时间看到有人用魔兽来解释设计模式,感觉很有意思, ...

  3. springcloud生产环境一般怎么部署_机器学习模型生产环境部署的四种系统架构总结...

    本文将从简单到复杂介绍典型架构的特点以及其优缺点. 介绍 一旦数据科学家对模型的性能感到满意,下一步便是"模型生产环境部署", 没有系统的合理配置,您的Kaggle Top1模型可 ...

  4. Network 之十四 email 通信架构、Postfix 部署详解

      在之前的博文 Git 之八 详解 Gitlab 本地部署全过程.企业版 PATCH.Gitlab Pages 用到了本地搭建邮件服务器,由于之前对此没有概念,因此,今天专门学习一下(主要是需要配置 ...

  5. 秀场直播主播pk实现的四种技术架构

    秀场互动直播是 RTC 技术应用的常见场景,虽然主播PK 的业务逻辑不算复杂,但由于在标准直播模式和主播PK 模式的切换过程中容易产生卡顿.黑屏等现象,为了在优雅实现业务逻辑的同时,最大程度缓解类似的 ...

  6. 利克特的四种管理方式(转载)

    利克特的四种管理方式 利克特的四种管理方式简介 密执安大学伦西斯·利克特(Rensis Likert)教授和他的同事对领导人员和经理人员的领导类型和作风做了长达30年之久的研究,利克特在研究过程中所形 ...

  7. python整数拆分dp算法_整数拆分问题的四种解法【转载】

    http://blog.csdn.net/u011889952/article/details/44813593 整数拆分问题的四种解法 原创 2015年04月01日 21:17:09 整数划分问题是 ...

  8. Jquery调用webService的四种方法 【转载】

    本文转载自:http://space.itpub.net/221062/viewspace-580298 我总结几个关键点 1. 服务必须声明为ScriptService(否则会出现下面的问题) 2. ...

  9. 详解Java解析XML的四种方法(转载)

    原文地址:http://developer.51cto.com/art/200903/117512.htm XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成 ...

最新文章

  1. php v9 ajax 翻页,phpcms v9建站 ajax列表分页加载更多word文档教程
  2. 已安装的sql怎么添加功能_微信群管理工具有哪些功能?怎么在社群中添加微信小助手?...
  3. 分析 C# 2.0 新特性 -- 范型(Generics)
  4. 什么是中台业务架构?
  5. GeoServer使用CSS渲染地图
  6. 国产数据库产业百花齐放 “1+4+4+N”格局形成
  7. ENVI入门系列教程---二、图像分析---9.遥感图像监督分类
  8. 中控消费机一直显示连接服务器,中控消费机培训及常见问题的解决办法课件.ppt...
  9. 计算机老出现安全警报怎么办,windows安全警报怎么关闭,教您怎么关闭windows安全警报...
  10. 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
  11. 2003年高考语文全国最高分_最新消息!2020高考语文数学题型大变!全国卷或有多套题...
  12. 华为云SSL证书申请流程
  13. 报错:Ncat: bind to :::8888: Address already in use. QUITTING
  14. 云计算是什么通俗解释_什么是云? 解释
  15. Syntactic sugar Syntactic salt
  16. 理解崩溃和崩溃日志(WWDC 2018 session 414)
  17. 单反相机风景摄影易记易学口诀
  18. 软件测试行情前景,你可以做测试多久?到底能干到多少岁?
  19. lower_bound,upper_bound的第四个参数的用法
  20. 下雨天客流量少,美容院怎么做生意

热门文章

  1. 中国大学(慕课)哈工大C语言程序设计精髓编程题在线测试第三周
  2. eBay卖家用WorldFirst将PayPal美元提现国内银行教程!
  3. 五一去哪里人最多?用 Python 抓取的热力图告诉你!
  4. 2018-2019-2 20175227张雪莹《Java程序设计》实验四 《Android程序设计》
  5. 独家 | 2017云栖大会放出哪些数据科学界的利好消息?
  6. WARNING: Heavy swapping observed on system in last 5 mins.
  7. 中国石油天然气股份有限公司2008年半年度报告摘要(业绩公告)
  8. java 经纬度计算_java 实现经纬度计算
  9. 学黑客要学什么编程语言
  10. Spring Security安全机制