本系列用来记录ROS2的学习过程,有错误或者不合理的地方请大家指正。由于博主具有ROS1的学习经历,会添加一些与ROS1的一些对比,当然这对于ROS2本身的学习内容没有丝毫影响,欢迎大家积极与我在评论区交流。如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。

1.为什么选择ROS2?

由于ROS1基于TCP/IP通信机制,这就导致了ROS1不可避免的出现以下缺陷:

  • 实时性差
  • 嵌入式设备不友好
  • 需要大带宽的稳定网络连接
  • 多用于学术应用

2. ROS2 的架构

针对以上ROS1中存在的问题,ROS2对其进行改进以解决上述问题。

如图所示,ROS1需要一个Master来处理发布-订阅通信中间层,而ROS2采用基于RTSP(Real-Time Publish-Subscribe)协议的DDS作为中间层,DDS(Data-Distribution Service)数据分布式服务是一种用于实时和嵌入式系统发布-订阅式通信的工业标准,DDS不需要像ROS1借助master来完成两个节点的通信,这使得系统更加容错和灵活。DDS广泛应用在各种军用场景下,证明了DDS的可靠性。同时,ROS2可以部署在多种操作系统中。

多个⼚商提供多种DDS实现,⼀般来说DDS的底层通信机制基于UDP协议或者共享内存机制(当然也有⼚商提供基于TCP的DDS实现),⽽ROS2⽀持多种DDS实现,⽤⼾可以根据实际情况选择DDS中间层, ⽬前来说ROS2 Foxy完整⽀持以下DDS中间层:

  • eProsima的Fast RTPS(当前ROS2版本默认的DDS实现)
  • RTI的Connext DDS
  • Eclipse Cyclone DDS

3.ROS2的内部架构:

ROS2主要包括两个主要的内部接口:

  • RMW API(ROS middleware interface)
  • RCL API(ROS client library interface)

rmw API是ROS2软件栈和底层中间件的实现接口。用于ROS2的底层中间件是DDS或RTPS实现,负责发现、发布和订阅机制、服务的请求-应答机制和消息类型的序列化。

rcl API是一个稍高级的API,用于实现客户端库,不直接接触中间件实现,而是通过ROS中间件接口(rmw API)抽象来实现。

4.ROS2中的QoS

ROS2中引⼊了Quality of Service, QoS(服务质量)的策略⽤于配置节点间通信,进⽽提升了ROS2适应于不同应⽤场景的灵活性。ROS1只⽀持基于TCP的通信,通过配置QoS,ROS2可以表现出TCP的可靠性,也可以表现出UDP那样的⾼实时性。⽤⼾可以通过选择不同的QoS配置⽂件以实现不同的通信表现,QoS配置⽂件为策略的集合,ROS2提供了预设的QoS配置⽂件,如下所⽰:

  • 发布-订阅机制的QoS设定
  • 服务 (Service) 的QoS设定
  • 传感器数据的QoS设定
  • 参数的QoS设定
  • DDS中间层默认的QoS设定

了解更多DDS相关背景,可以参考这篇⽂章:

About internal ROS 2 interfaces — ROS 2 Documentation: Foxy documentation

所以,由于ROS1与ROS2在架构方式上的不同,ROS1在启动时需要启动roscore,而ROS2则不需要(yyds)。

参考文章:ROS2探索总结(二)——走近ROS2.0时代 - 古月居 (guyuehome.com)

拥抱ROS2系列:ROS2概述和实践入门(一) - 知乎 (zhihu.com)

ROS2学习之旅(1)——初识ROS2的更多相关文章

  1. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...

  2. ROS2学习之旅(15)——编写简单的服务和客户节点(C++)

    当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...

  3. ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)

    节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...

  4. ROS2学习之旅(13)——创建ROS2 功能包

    一个功能包可以被认为是ROS2代码的容器.如果希望能够管理代码或与他人共享代码,那么需要将其组织在一个包中.通过包,可以发布ROS2工作,并允许其他人轻松地构建和使用它. 在ROS2中,创建功能包使用 ...

  5. ROS2学习之旅(2)——配置ROS2环境

    目录 1.source一下setup文件 2.自动source 3.自动进入工作区(不常用) 4.检查环境变量是否设置成功 5.总结 ROS2依赖于使用shell(终端)环境组合工作空间的概念.工作空 ...

  6. ROS2学习之旅(12)——创建工作空间

    workspace(工作空间)是包含ROS2 packages(包)的文件夹.在使用ROS 2之前,有必要在终端中source一下ROS 2的安装工作区,这样就可以在该终端中使用ROS 2的软件包. ...

  7. ROS2学习之旅(21)——创建一个动作服务和客户节点(C++)

    动作是ROS中的一种异步通信形式,动作客户端向动作服务器发送目标请求,目标服务器向操作客户端发送目标反馈和结果.本文基于前一篇自定义动作博文. 1.创建一个action_turtorials_cpp包 ...

  8. ROS2学习之旅(20)——创建一个动作消息

    本文用来自定义一个动作消息类型. 以下命令用来创建一个工作空间并建立一个功能包: mkdir -p action_ws/src cd action_ws/src ros2 pkg create act ...

  9. 我的angularjs源码学习之旅1——初识angularjs

    angular诞生有好几年光景了,有Google公司的支持版本更新还是比较快,从一开始就是一个热门技术,但是本人近期才开始接触到.只能感慨自己学习起点有点晚了.只能是加倍努力赶上技术前线. 因为有分析 ...

随机推荐

  1. cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”

    8.cut命令 cut命令用于按"列"提取文本字符,格式为"cut [参数] 文本". 在Linux系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习 ...

  2. Linux如何设置用户登录超时(闲置时间)vi /etc/profile ... export TMOUT=900

    Linux如何设置用户登录超时(闲置时间) 转载莫负寒夏ai 最后发布于2019-08-08 15:04:22 阅读数 1897  收藏 展开 1. 针对所有用户 # vi /etc/profile ...

  3. mate-notification-daemon stopping, Mate notifications timeout

    mate-notification-daemon stopping, Mate notifications timeout Ask Question Asked 9 days ago Viewed 1 ...

  4. 033.Python的__del__析构方法he__call__方法

    一 __del__ 魔术方法(析构方法) 1.1 介绍 触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候] 功能:对象使用完毕后资源回收 参数:一个s ...

  5. 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)

    第一步:先打开第一个hex文件, 第二步:选择 "Merge data file",合并文件 第三步:两个工程有可能地址相同,会有如下提示:(如果在编译的时候设置好Flash的地址 ...

  6. C# 技术体系简介

    C# 语言 .Net Framwork .NET Core winform界面编程 WPF开发经验,熟悉C/S架构产品开发及架构和设计 DevExpress界面框架(其实就是基于微软的 Winform ...

  7. MyBatis 高级查询之一对一查询(九)

    高级查询之一对一查询 查询条件:根据游戏角色ID,查询账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据角色ID查询账号信息 * @para ...

  8. mysql事务实现方式

    事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性. 原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 由und ...

  9. python 解析html网页

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法: 代码如下: from pyquery import PyQuery as pq 1.可加载一段HTML字符串 ...

  10. [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion

    [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 (1 ...