目录
1.架构设计
2.计算图
(1)节点
(2)消息
(3)话题
(4)服务
(5)节点管理器(master)
(6)参数服务器(parameter server)
3.文件系统
(1)功能包(Package)
(2)功能包清单(Package Manifest)
(3)元功能包(Meta Package)
(4)元功能包清单
(5)消息(Message)类型
(6)服务(Service)类型
(7)代码(Code)
4.开源社区
(1)发行版(Distribution)
(2)软件源(Repository)
(3)ROS wiki
(4)邮件列表(Mailing List)
(5)ROS Answers
(6)博客(Blog)
从系统的实现角度来看,ROS可分为三个层次:计算图、文件系统、开源社区。
从计算图的角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接。
节点(Node)就是一些执行运算任务的进程,一个系统一般由多个节点组成,也可以称为“软件模块”。节点概念的引入使得基于ROS的系统在运行时更加形象:当许多节点同时运行时,可以很方便地将端对端的通信绘制成节点关系图,在这个图中进程就是图中的节点,而端对端的连接关系就是节点之间的连线。
ROS中关于节点的工具是rosnode:
指令 | 功能 |
rosnode info node | 输出当前节点的信息 |
rosnode kill node | 结束当前运行的节点进程 |
rosnode list | 列出当前活动的节点 |
rosnode machine hostname | 列出某一特定计算机上运行的节点或列出主机名 |
rosnode ping node | 测试节点之间的连通性 |
rosnode cleanup | 将无法访问的节点的注册信息清除 |
节点之间是通过传送消息进行通讯的。每一个消息都是一个严格的数据结构。
原来标准的数据类型(整型,浮点型,布尔型等等)都是支持的,同时也支持原始数组类型。消息可以包含任意的嵌套结构和数组(很类似于C语言的结构structs)。
ROS中关于消息的工具是rosmsg:
指令 | 功能 |
rosmsg show | 显示一条消息的字段 |
rosmsg list | 列出所有消息 |
rosmsg package | 列出功能包中的所有消息 |
rosmsg packages | 列出所有具有该消息的功能包 |
rosmsg users | 收索使用该消类型的代码文件 |
rosmsg md5 | 显示一条消息得MD5检验值 |
消息以一种发布/订阅(Publish/Subscribe)的方式传递。
一个节点可以针对一个给定的话题(Topic)发布消息(称为发布者/Talker),也可以关注某个话题并订阅特定类型的数据(称为订阅者/Listener)。
发布者和订阅者并不了解彼此的存在,系统中可能同时有多个节点发布或者订阅同一个话题的消息。
ROS中关于话题的工具是rostopic:
指令 | 功能 |
rostopic bw /topic | 显示话题所使用的带宽 |
rostopic echo /topic | 将话题对应的消息显示 |
rostopic find message_type | 按照类型查找话题 |
rostopic hz /topic | 显示话题的发布频率 |
rostopic info /topic | 输出关于该话题的信息 |
rostopic list | 输出活动话题的列表 |
rostopic pub /topic type args | 将数据发布到话题中 |
rostopic type /topic | 输出话题的类型,或者说话题中发布的消息类型 |
虽然基于话题的发布/订阅模型是一种很灵活的通信模式,但是对于双向的同步传输模式并不适合。在ROS中,我们称这种同步传输模式为服务(Service),其基于客户端/服务器(Client/Server)模型,包含两个部分的通信数据类型:一个用于请求,另一个用于应答,类似于Web服务器。与话题不同的是,ROS中只允许有一个节点提供指定命名的服务。
在上面概念的基础上,需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)。
ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。
比如控制节点订阅和发布消息的模型如下:
ROS中关于服务的工具是rosservice:
指令 | 功能 |
rosservice call /service args | 根据命令行参数调用服务 |
rosservice find msg-type | 根据服务类型查找服务 |
rosservice info /service | 输出服务信息 |
rosservice list | 输出活动的服务列表 |
rosservice type /service | 输出服务类型 |
rosservice uri /service | 输出提供服务的node的rosrpc链接 |
管理者角色,统筹管理节点,保证节点的正常运行通过远程调用(RPC)提供登记列表和对其它计算图表的查找功能帮助节点间相互查找,建立连接,交换消息,调用服务提供参数服务器,管理全局参数
如:人体的大脑
通过网络访问的共享的多变量字典,通过关键字存储在节点管理器上节点使用此服务器存储和索运行时的参数,还可以改变节点的工作任务参敷服务器使用XMLRPC实现,并运行在ROS节点管理器上着其API可通过通用的XMLRPC库进行访问
如:人体的大脑记忆,所有数据的储存在这
ROS中关于参数服务器的工具是rosparam
指令 | 功能 |
rosparam list | 列出参数服务器中的所有参敷 |
rosparam get parameter | 获取参数值 |
rosparam set parameter value | 设置参数值 |
rosparam delete parameter | 删除参数值 |
rosparam dump file | 将参数服务器保存到一个文件中 |
rosparam load file | 加载参数文件到参数服务器 |
类似于操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下
功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等。
每个功能包都包含一个名为package. xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。
在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目的的功能包。例如一个ROS导航的元功能包中会包含建模、定位、导航等多个功能包。
在图中并未显示,类似于功能包清单,不同之处在于元功能包清单中可能会包含运行时需要依赖的功能包或者声明一些引用的标签。
消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。
服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。
用来放置功能包节点源代码的文件夹。
例如:
WorkSpace --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件=
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
ROS开源社区中的资源非常丰富,而且可以通过网络共享以下软件和知识。
类似于Linux发行版,ROS发行版包括一系列带有版本号、可以直接安装的功能包,这使得ROS的软件管理和安装更加容易,而且可以通过软件集合来维持统一的版本号。
ROS依赖于共享网络上的开源代码,不同的组织结构可以开发或者共享自己的机器人软件。
记录ROS信息文档的主要论坛。所有人都可以注册、登录该论坛,并且上传自己的开发文档、进行更新、编写教程。
ROS邮件列表是交流ROS更新的主要渠道,同时也可以交流ROS开发的各种疑问。
ROS Answers是一个咨询ROS相关问题的网站,用户可以在该网站提交自己的问题并得到其他开发者的问答。
发布ROS社区中的新闻、图片、视频(http://www.ros.org/news)。
ROS社区的组织形式: