ROS基础(一)|ROS架构及概念

关键词:ROS

ROS架构及概念

ROS的架构经过设计并划分为三部分,每一部分都代表一个层级的概念:

  • 文件系统级(Filesystem level)
  • 计算图级(Computation Graph level)
  • 社区级(Community level)

第一级是文件系统级。在这一级,我们会使用一组概念来解释ROS的内部构成、文件夹结构,以及工作所需要的核心文件。

第二级是计算图级,体现的是进程和系统之间的通信。在相关小节中,我们将学习ROS的各个概念和功能,包括建立系统、处理各类进程、与多台机器通信等。

第三级是社区级,我们将解释一系列的工具和概念,包括在开发人员之间如何共享知识、算法和代码。由于强大社区的支持,不仅提高了初学者理解复杂软件的能力,还解决了最常见的问题。

理解ROS文件系统级

与其他操作系统类似,一个ROS程序的不同组件要放在不同的文件夹下,这些文件夹是根据功能的不同来对文件进行组织的。

  1. 功能包(Package):功能包构成ROS中的原子级。一个功能包具有创建ROS程序最小结构和最少内容。它可以包含ROS运行时进程(节点)、配置文件等。
  2. 功能包清单(Package Manifest):功能包清单提供关于功能包、许可证、依赖关系、编译标志等的信息。包清单又一个名为package.xml的文件管理。
  3. 元功能包(Metapackage):如果你希望将几个具有某些功能的包组织在一起,那么你将使用一个元功能包。这种包的组织形式之前被称为功能包集(Stack )。功能包集被废除,现在使用元功能包实现这个功能。在ROS中,存在大量不同用途的元功能包,例如导航功能包集
  4. 元功能包清单(Metapackage manifest):元功能包清单(package.xml)类似普通功能包但又一个XML格式的导出标记,他在结构上也有一定的限制。
  5. 消息类型(Message(msg)type):消息是一个进程发送到其他进程的消息。ROS 的消息类型的说明存储在my_package/msg/MyMessageType.msg中。
  6. 服务类型(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
2
cmake packageToBuild/
make

如果想编译所有的包,可以用catkin_make命令行,见以下命令:

1
2
cd workspace
catkin_make

在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文件的示例。

元功能包

元包中只有一个文件,这个文件就是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 命令也可以用于查找元功能包。