ROS的设计目标是简化机器人的开发,如何简化呢?ROS为此设计了一套通信机制(话题、服务、参数、动作)
通过这些通信机制,ROS实现了将机器人的各个组件连接起来,所有节点(即组件)的通信建立必须经过主节点Ros Master
一旦Ros Master主节点挂掉后,就会造成整个系统通信的异常,此时避障策略将会失效,如果机器人正在运行,碰到障碍物会径直装上去,机毁人亡!
除了不稳定这个问题,ROS还有很多其他地方存在着问题:
所以在ROS2中,首当其冲的将ROS的主节点干掉了,这里放一张网上流传最广的ROS/ROS2架构图
从原来的只支持linux平台变成了支持windows、mac甚至是嵌入式RTOS平台
那么中间层ROS2到底相对于ROS做了哪些优化呢?
对于应用层来说ROS2也做了很大的改进,上面那张图没有体现出来。
ROS2进行改进有:
操作系统层比较好理解,ROS2本身就是基于Linux、Windows或者macOS系统建立的,驱动计算机硬件、底层网络通信等实现都是交由操作系统来实现的。
DDS,全称 Data Distribution Service (数据分发服务)。是由对象管理组 (OMG) 于 2003 年发布并于 2007 年修订的开分布式系统标准。
通过类似于ROS中的话题发布和订阅形式来进行通信,同时提供了丰富的服务质量管理来保证可靠性、持久性、传输设置等。
一文读懂“数据分发服务DDS”(Data Distribution Service,RTPS,OMG)_DDS数据分发服务的博客-CSDN博客_corba dds
DDS实现层其实就是对不同常见的DDS接口进行再次的封装,让其保持统一性,为DDS抽象层提供统一的API。
这一层将DDS实现层进一步的封装,使得DDS更容易使用。原因在于DDS需要大量的设置和配置(分区,主题名称,发现模式,消息创建,…),这些设置都是在ROS2的抽象层中完成的。
RCL(ROS Client Library)ROS客户端库,其实就是ROS的一种API,提供了对ROS话题、服务、参数、Action等接口。
ROS的客户端库就是上面所说的RCL,不同的语言对应着不同的rcl,但基本功能都是相同的。
比如Python语言提供了rclpy来操作ROS2的节点话题服务等,而C++则使用rclcpp提供API操作ROS2的节点话题和服务等。
所以后面我们使用Python和C++来编写ROS2节点实现通讯等功能时,我们就会引入rclpy和rclcpp的库。
上面这张图时ROS2,API的实现层级,最新下面的是第三方的DDS,rmw(中间件接口)层是对各家DDS的抽象层,基于rmw实现了rclc,有了rclc,我们就可以实现各个语言的库,大家都知道C语言是各个语言的鼻祖(汇编除外)所以基于rclc,ROS2官方实现了rclpy和rclcpp.
基于rclpy和rclcpp我们就可以实现上层的应用了
应用层就是我们写代码以及ROS2开发的各种常用的机器人相关开发工具所在的层了。后面我们写的所有代码其实都是属于这一层的。
中间件就是介于某两个或者多个节点中间的组件。干嘛用的呢?
就是提供多个节点中间通信用的。
ROS2为每家DDS供应商都开发了对应的DDS_Interface即DDS接口层,然后通过DDS Abstract抽象层来统一DDS的API。
优势:
劣势: