ROS 系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level)、计算图级(The computation graph level)和开源社区级(The community level)。
文件系统级
ROS 的内部结构、文件结构和所需的核心文件都在这一层里,理解 ROS 文件系统是入门ROS的基础,ROS程序的结构,是一些不同功能进行区分的文件夹
- build 目录:使用 C++ 时 catkin 存放库和可执行程序的地方,使用 Python 时可以忽略该目录的内容;
- devel 目录:包含了许多文件和路径,其中最需要注意的是 setup 文件,运行这个文件可以使系统使用这个工作区以及其中包含的代码;注意,如果打开了一个新终端,必须先添加需要使用的工作区的 setup.bash 文件,否则终端无法找到你的代码
命令如下
source devel/setup.bash |
如果只有一个工作区,可以把这个命令增加到 .bashrc 文件中,这样开启终端的同时配置你需要的工作区
命令如下
echo "source ~/目录/devel/setup.bash" >> ~/.bashrc source ~/.bashrc |
注意:目录替换为你的工作区目录
计算图级
主要是指进程之间(节点之间)的通信。ROS创建了一个连接所有进程的网络,通过这个网络节点之间完成交互,获取其他节点发布的信息。围绕计算图级和节点,一些重要的概念也随即产生:节点管理器、节点、消息、主题(或称话题)、服务、动作和消息记录包。
- 节点管理器:向节点提供连接信息,以便节点间可以互相传递信息的服务程序。每个节点都在启动时连接到节点管理器注册该节点发布和订阅的消息。但一个新节点出现时,节点管理器向他提供与其他发布并订阅相同消息主题的节点建立点对点连接的必要信息。启动节点管理器叫做 roscore 命令,启动 roscore 命令后,默认使用 11311 端口,在启动命令和 ROS_MASTER_URI 环境变量中指定不同的端口号既可以实现同一个网络中运行多个 ROS 节点管理器。
- 节点:作为 ROS 系统的核心,节点是用 C++或 Python(ROS客户端库roscpp、rospy)编写的程序,用来执行任务或进程。当一个节点启动时,该进程假设存在一个名为 ROS_MASTER_URI 的环境变量,这个变化包含了一个格式为 http://hostname:11311/ 的字符串,表示节点管理器的运行实例可以通过主机 hostname 的 11311 端口进行访问。
- 消息:节点之间通过消息进行通信,这些消息包含一个节点发送给其他节点的信息数据,消息类型有ROS标准类型和基于标准消息开发的自定义类型两种。
- 主题(或称话题):指节点发布的消息的去处。节点每一条消息都要发布到主题,一个节点a发布信息数据,就说该节点a向主题发布消息。其他节点可以订阅这个节点a发布的主题,以此来接收a的消息。所以归根结底节点之间的通信,是主题之间的发布和订阅实现的。
- 服务:是另一种在节点间传递数据的方法,服务其实就是同步的跨进程函数调用;他们能够让一个节点调用运行在另一个节点中的函数。
- 动作:动作机制非常适合作为时间不确定,目标导向型的操作接口,服务机制是同步的,而动作机制则是异步的。与服务的请求/响应结构类似,动作使用目标来启动一次操作,在操作完成后会发送一个结果。在此基础上,动作引入了反馈来提供操作的进度信息,还支持取消当前进行中的操作。从原理上看,动作使用主题(或称话题)实现,其本质上相当于一个规定了一系列话题(目标、结果、反馈等)的组合使用方法的高层协议。
- 消息记录包:用于保存消息数据的文件格式,用于存储数据。可以进行信号的监测。
开源社区级
主要是指ROS资源的获取和分享。通过独立的网络社区,我们可以共享和获取知识、算法和代码,开源社区的大力支持使得ROS系统得以快速成长,这些资源包括发行版、软件库、ROS维基、Bug提交系统、邮件列表、ROS问答、博客