ROS基础(一)|ROS架构及概念
关键词:ROS
ROS架构及概念
ROS的架构经过设计并划分为三部分,每一部分都代表一个层级的概念:
- 文件系统级(Filesystem level)
- 计算图级(Computation Graph level)
- 社区级(Community level)
第一级是文件系统级。在这一级,我们会使用一组概念来解释ROS的内部构成、文件夹结构,以及工作所需要的核心文件。
第二级是计算图级,体现的是进程和系统之间的通信。在相关小节中,我们将学习ROS的各个概念和功能,包括建立系统、处理各类进程、与多台机器通信等。
第三级是社区级,我们将解释一系列的工具和概念,包括在开发人员之间如何共享知识、算法和代码。由于强大社区的支持,不仅提高了初学者理解复杂软件的能力,还解决了最常见的问题。
理解ROS文件系统级

与其他操作系统类似,一个ROS程序的不同组件要放在不同的文件夹下,这些文件夹是根据功能的不同来对文件进行组织的。
- 功能包(Package):功能包构成ROS中的原子级。一个功能包具有创建ROS程序最小结构和最少内容。它可以包含ROS运行时进程(节点)、配置文件等。
- 功能包清单(Package Manifest):功能包清单提供关于功能包、许可证、依赖关系、编译标志等的信息。包清单又一个名为package.xml的文件管理。
- 元功能包(Metapackage):如果你希望将几个具有某些功能的包组织在一起,那么你将使用一个元功能包。这种包的组织形式之前被称为功能包集(Stack )。功能包集被废除,现在使用元功能包实现这个功能。在ROS中,存在大量不同用途的元功能包,例如导航功能包集。
- 元功能包清单(Metapackage manifest):元功能包清单(package.xml)类似普通功能包但又一个XML格式的导出标记,他在结构上也有一定的限制。
- 消息类型(Message(msg)type):消息是一个进程发送到其他进程的消息。ROS 的消息类型的说明存储在my_package/msg/MyMessageType.msg中。
- 服务类型(Service (srv) Type):服务描述说明存储在my_package/srv/MyServiceType.srv中,为ROS中由每个进程提供的服务定义请求和响应数据结构。
下面的截图说明了turtlesim功能包的内容。所看到的是一系列文件和文件夹,包含代码、图片、启动文件服务和消息。以下只是文件的一个简短列表。

工作空间
工作空间包含功能包,功能包包含源文件和环境和工作空间,是集中开发的一种好方式。
下图所示是一个典型的工作空间。
主要包含一下内容:
- 源文件空间(Source space):在源空间(src文件夹)中,放置了功能包、项目、复制的包等。最重要文件:CMakeLists.txt。当在工作空间配置包时,通过cmake调用CMakeLists.txt。这个文件是通过catkin_init_workspace命令创建的。
- 编译空间(build space):在build文件夹里,cmake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。
- 开发空间(Development (devel)space):devel文件夹用来保存编译后的程序,这些是无需安装就能用来测试的程序。
用catkin编译包有两个选项。第一个是使用标准CMake工作流程。通过使用此方式。可以一次编译一个包,见以下命令:
1 | cmake packageToBuild/ |
如果想编译所有的包,可以用catkin_make命令行,见以下命令:
1 | cd workspace |
在ROS配置的编译空间目录中,这两个命令编译出可执行文件。
ROS支持覆盖(overlay)。当你正在使用ROS功能包例如(Turtlesim)时,可以使用安装版本,也可以下载源文件并编译它来使用你修改后的版本。
ROS允许使用自己版本的功能包去替代安装版本。下一章我们将使用这个功能来创建自己的插件。
功能包
包指的是一种特定结构的文件和文件夹组合。
| 目录 | 功能 |
|---|---|
| include/package_name | 此目录包含了需要的库的头文件 |
| msg/ | 如果开发需要非标准的消息,请把文件放在这里。 |
| script/ | 其中包含Bash、Python或者任何其他脚本语言的可执行脚本。 |
| src/ | 存储程序源文件。可以为节点创建一个文件夹或按照希望的方式组织它。 |
| srv/ | (srv)服务类型 |
| CMakeLists.txt | CMake的生成文件 |
| package.xml | 功能包清单文件 |
ROS提供的工具(命令)
| 命令 | 功能 |
|---|---|
| rospack | 使用此命令来获取信息或在系统中查找包 |
| catkin_create_pkg | 使用此命令创建一个新的功能包 |
| catin_make | 使用此命令来编译工作空间 |
| rosdep | 使用此命令按照功能包的系统依赖项 |
| rqt_dep | 使用此命令来查看包的依赖关系图 |
如果要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash,功能包,其中包含的非常类似Linux命令的命令。
| 命令 | 功能 |
|---|---|
| roscd | 此命令用于更改目录,相当于Linux中的cd命令 |
| rosed | 此命令用来编辑文件 |
| roscp | 此命令用于从功能包复制文件。 |
| rosls | 此命令列出功能包下的文件,类似Linux中的ls命令。 |
文件package.xml必须在每个功能包中,它用来说明此包相关的各类信息。如果你发现在某个文件夹内包含此文件,那么这个文件夹很可能是一个包或者元功能包。
打开package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了方便安装和分发这些功能包。
在package.xml文件中使用的两个典型标记是

元功能包
元包中只有一个文件,这个文件就是package.xml。它不包含其他文件,如代码等。
元功能包用于指代其他按照类似功能特性分组的包,例如导航功能包集,ros_tutorials等。
使用迁移的特定规则,可以讲ROS Fuerte中的功能包和功能包集转换为Kinetic等。具体参见http://wiki.ros.org/catkin/migrating_from_rosbuild。
在下图中。可以看到在ros_tutorials元功能包中package.xml的内容。可以看到 <export>标记和<run_depend>标记。这些事功能包清单中必不可缺少的,在下图中也可以看到这些标记。

如果你想定位ros_tutorials元功能包,可以使用下面的命令:
1 | rosstack find ros_tutorials |
显示路径为:

查看里面的代码
1 | vim /opt/ros/kinetic/share/ros_tutorials/package.xml |
注意:Kinetic使用元功能包,不是功能包集,但是rosstack find 命令也可以用于查找元功能包。