ROS 架构
ROS 的架构
软件层次架构
从软件实现的角度,ROS 的架构可以分为三个层次:OS层,中间层,应用层;
- OS 层:OS 层建立在 Linux 操作系统之上;主要提供了硬件抽象、底层驱动等;
- 中间层:ROS 的中间层进一步封装 OS 层提供的接口,为应用层提供格式统一,模块化的接口。其主要工作为:
- 把 TCP/UDP 通信封装为 TCPROS/UDPROS,并提供主题通信、服务通信、参数共享等三种通信方式;
- 额外提供进行间通信方式–Nodelet,适用于实时性较高的应用;
- 在通信的基础之上提供大量机器人开发的库,如数据类型定义,坐标变换,运动控制等
- 应用层主要调用中间层的接口实现各种应用功能。在应用层,我们需要注意的有:
- 应用层有一个管理者 Master,负责管理整个系统的运行;
- ROS 社区共享了大量机器人应用功能包,功能包内的模块都是以节点为单位运行,以 ROS 标准的输入输出作为接口。我们在使用的时候,不需要关注模块内部实现细节,只用明白接口规则即可复用。
系统层次架构
从系统实现的角度,ROS 可以划分为:计算图、文件系统、开源社区三个视角;如下图所示:
计算图
从计算图的结构来看,ROS 系统软件的功能模块是以节点(节点即为进程)为单位独立运行的,节点以拓扑的方式互联,构成了一个系统网络,即为系统的计算图。如下图所示:
端点表示各个节点,端点之间的边表示节点之间的通信方式。
在计算图中,有几个重要的概念要着重说明:消息、话题、服务、节点管理器;
消息(Message)
消息,又称之为 话题消息,它是话题通信发送的信息。每一种消息都是一种严格的数据结构。消息类型支持标准的数据类型(整型,浮点型,布尔型等),也支持嵌套结构和数组,还可以进行自定义;
话题(Topic)
话题 是 ROS 系统中最核心的通信方式,它基于发布/订阅(Publish/Subsribe)的方式传递。一个节点可以针对一个话题(Topic)发布消息(这个节点的角色为发布者/Talker),一个节点可以订阅这个消息(这个节点称为订阅者/Listener);话题(Topic)通信具有如下特点:
- 发布者和订阅者并不知道彼此的存在;
- 一个话题(Topic)可以有多个发布者,也可以有多个订阅者;
- 发布者向话题(Topic)发布消息,订阅者从话题(Topic)接收消息,消息的流向是单方向的;
服务(Service)
服务(Service)是ROS中另外一个重要的通信方式,它基于 C/S 模型实现。一个节点成为服务端(Server),一个节点成为客户端(Client);客户端发送请求,服务端回应请求;这种通信方式具有以下特点:
- 服务端和客户端必须知道彼此的存在;
- 客户端发送请求,服务端回应请求,信息流向是双向的;
- 数据类型包含两部分:请求数据类型、应答数据类型;
Master(节点管理器)
ROS Master,ROS系统的管理者,也称为节点管理器(因为ROS的应用程序可以认为由节点的拓扑结构组成),其主要作用是管理整个ROS系统的正常运行;具体主要表现在:
- 登记和管理节点信息、话题信息,帮助节点之间相互查找和建立连接;
- 管理全局共享参数,为共享参数通信提供帮助;
文件系统
按照工程文件的组织结构,ROS 功能包的文件系统组织结构如下:
首先来说明功能包中各个部分的内容:
功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等;
- 功能包清单(Package Manifest):每一个功能包都包含一个名为 package.xml 的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等;如下图所示:
- CMakeList.txt:编译器编译功能包的规则;
- 消息类型(msg):存放自定义的消息类型文件,文件名以
.msg
结尾; - 服务类型(srv):存放自定义服务类型文件,文件名以
.srv
结尾; - 源码(src):用来存放功能包源代码的文件;
- 其他的文件夹含义:
- config:放置功能包中的配置文件,由用户创建、文件名可以不同;
- inlude:放置功能包中需要用到的头文件;
- scripts:放置可以直接运行的 Python 脚本;
- launch:放置功能包中的所有启动文件;
- action:放置功能包自定义的动作指令;
元功能包
元功能包是一种特殊的功能包,只包含一个 package.xml
元功能包清单文件。它的主要作用就是将多个功能包整合成一个逻辑上独立的功能包,类似于功能包集合的概念;
元功能包清单 package.xml
文件与功能包清单 package.xml
文件类型,但是需要包含一个引用标签如下:
<export>
<metapackage/>
</export>
元功能包清单也不需要 <buildtool_depend>
标签声明编译过程依赖的其他功能包,只需要使用 <run_depend>
标签声明功能包运行时依赖的其他功能包。
导航功能包的元功能包清单如下:
$ roscd navigation
$ gedit package.xml
开源社区
ROS 开源社区中资料非常丰富,主要有以下几种:
- 提供ROS的发行版(Distrubutiom)
- 提供软件源(Repository):不同的组织机构可以开发或者共享自己的机器人软件;
- ROS Wiki:记录 ROS 信息文档的主要论坛,所有人都可以注册、登陆,并上传自己开发的文档;
- 邮件列表(Mailing List):交流 ROS 更新的主要渠道;
- ROS Answers:咨询ROS相关问题的主要网站;
- 博客:发布ROS 社区中新闻、图片,视频(http://www.ros.org/news)
功能包、元功能包、软件仓库、ROS 社区的主要关系
上一篇: web前端,css清除浮动的常见方法
下一篇: MDD 建模驱动设计
推荐阅读
-
【SDCC讲师专访】饿了么毕洪宇:小析饿了么大数据平台从无到有到优的架构探索三味境...
-
SaaS(软件即服务) 的架构设计,是什么样子的
-
最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。
-
Redis架构~第一讲 redis提供的五种数据结构_MySQL
-
浅谈特大型PHP网站架构的那点事
-
纯HTML+CSS打造组织架构图
-
用MVC架构时,如何进行多表联合查询?求一比较优秀的解决方法
-
[总结] 【架构与优化】从Facebook中集思广益,相互学习
-
NHibernate+Oracle10g搭建一个项目架构全程解析(三)
-
Mysql在大型网站的应用架构演变_MySQL