这篇文章,初学者可以大概看一看,后面根据实际项目照猫画虎,有了实际经验,在知行合一的来看,就有不同的理解!
1.架构图
首先明确为什么要分层,很简单,原始社会的茹毛饮血(裸机程序)到刀耕火种(程序架构),再到帝国权利机构,都是人为什么需要帝国,是因为人太多了,需要结构进行功能划分,提高效率(当然运行效率会降低,操作系统额为支出),职能划分清晰。
社会如此,公司架构如此,万事万物都是如此。计算机是科学也是哲学。
我们一层层来分析,
1.操作系统层
操作系统的作用就是统筹计算机硬件,使其有条不紊的运行,ROS2本身就是基于Linux、Windows或者macOS系统建立的,驱动计算机硬件、底层网络通信等实现都是交由操作系统来实现的,计算机系统可以类比为大厂的整体组织架构。
2.DDS实现层
要想理解这一层就需要你了解DDS是什么? 以及为什么ROS2框架中会有多个DDS的实现。
首先知道DDS是DDS信息分发中间件是一种轻便的、能够提供实时信息传送的中间件技术。
其次知道DDS的作用是,举个类比
1.发送数据的应用程序为发布者,类似报社
2.接受数据的应用程序为订阅者,类比为读者
3.DDS中间件则就是邮局或者送报员
4.不同的数据主题为不同的报纸类型
另外的要点,DDS的Qos(quality of Service),如可靠性,持久性,紧迫度等等,总结就是DDS比较可靠,关于DDS了解到这么多就足够了,毕竟我们是使用ROS2,不是设计它,多余的知识是有害的!
DDS实现层用来做什么
DDS实现层其实就是对不同常见的DDS接口进行再次的封装,让其保持统一性,为DDS抽象层提供统一的API。了解即可。
3. 抽象DDS层-RMW
这一层将DDS实现层进一步的封装,使得DDS更容易使用。原因在于DDS需要大量的设置和配置(分区,主题名称,发现模式,消息创建,…),这些设置都是在ROS2的抽象层中完成的。
4.ROS2客户端库 RCL
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.
5.应用层
应用层就是我们写代码以及ROS2开发的各种常用的机器人相关开发工具所在的层了。后面我们写的所有代码其实都是属于这一层的。
6.总结
这一层层的分层,就是让我们更高效的利用计算机,很明显我们写的代码是最高层,那么一个公司的最高层是哪个职位,董事长,股东会对吧,他们下达一个命令,下面机构根据这条指令或者战略开始执行,我们就是ROS2中的董事长。所以我们站在董事长的视角,要着重了解架构方面的信息,而不是实现上面(很多人骂上面领导是傻叉,其实很多时候你们是视角,利益立场根本不同而已,别那么愤青!)
qst:什么时间要了解更多的相关知识呢?答案就是ROS2满足不了我们需求的时候,也就是ROS2我们应用非常熟练的时候!