本系列用来记录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)
都看到这了,点个推荐再走吧~