cmake 保留中间文件_Ros学习实践|Ros架构和文件包

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

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

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

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

第三级是社区级,我们将解释一系列的工具和概念,其中包括在开发人员之间如何共享知识、算法和代码。这个层级非常重要,和大部分开源软件工程一样,有一个强大的社区支持,不仅提高了初学者理解复杂软件的能力,还解决了最常见的问题,正是由于开源社区的大力支持,ROS才得以快速成长。

I 理解ROS文件系统级

如果你刚接触ROS,无论是准备使用ROS还是准备开发ROS项目,你都会觉得ROS中的各种概念非常奇怪。而一旦你驾轻就熟,那么这些概念就会变得熟悉同时认识到管理工程及其依赖的价值。ROS文件系统的主要目标是将项目构建的过程集中化,同时提供足够的灵活性和工具来分散之间的依赖性。

cmake 保留中间文件_Ros学习实践|Ros架构和文件包_第1张图片

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

  • 功能包(Package):功能包构成ROS中的原子级。一个功能包具有用于创建ROS程序的最小结构和最少内容。它可以包含ROS运行时进程(节点)、配置文件等。
  • 功能包清单(Package Manifest):功能包清单提供关于功能包、许可证、依赖关系、编译标志等的信息。包清单由一个名为package.xml的文件管理。·元功能包(Metapackage):如果你希望将几个具有某些功能的包组织在一起,那么你将会使用一个元功能包。在ROS Fuerte中,这种包的组织形式称为功能包集(Stack)。为了保持ROS简洁,功能包集被移除,现在使用元功能包实现这个功能。在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功能包的内容。你看到的是一列文件和文件夹,包含代码、图片、启动文件、服务和消息。需要注意的是,截图显示了这些文件的一个简短列表,真正的功能包会包含更多内容。

cmake 保留中间文件_Ros学习实践|Ros架构和文件包_第2张图片

Ⅱ 工作空间

概言之,工作空间就是一个文件夹,其中包含功能包,功能包又包含源文件和环境或工作空间,从而提供编译这些功能包的一种方式。当你想同时编译不同的功能包时它非常有用,并且是集中化所有开发的一种好方式。

下图所示的是一个典型的工作空间。每个文件夹都是一个具有不同功能的空间

cmake 保留中间文件_Ros学习实践|Ros架构和文件包_第3张图片
  • 源文件空间(Source space):在源空间(src文件夹)中,放置了功能包、项目、复制的包等。在这个空间中,最重要的一个文件是CMakeLists.txt。当在工作空间中配置包时,src文件夹中有CMakeLists.txt因为cmake调用它。这个文件是通过catkin_init_workspace命令创建的。
  • 编译空间(build space):在build文件夹里,cmake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。
  • 开发空间(Development(devel)space):devel文件夹用来保存编译后的程序,这些是无须安装就能用来测试的程序。一旦项目通过测试,就可以安装或导出功能包从而与其他开发人员分享。

用catkin编译包有两个选项。第一个是使用标准CMake工作流程。通过此方式,可以一次编译一个包,见以下命令:

b1001dc563e5c2a0fe7cea3c9f04e096.png

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

2e395ce70f0b07db4084ef8fb3e6406e.png

在ROS配置的编译空间目录中,这两个命令编译出可执行文件。ROS的另一个有趣的特性是它的覆盖(overlay)。当你正在使用ROS功能包(例如Turtlesim)时,可以使用安装版本,也可以下载源文件并编译它来使用你修改后的版本。

ROS允许使用你自己版本的功能包去替代安装版本。如果你正在升级已安装的功能包,这是非常有用的。或许此时你并不理解它的作用,但无须担心,在后续我们将使用这个功能来创建自己的插件。

Ⅲ 功能包

包指的是一种特定结构的文件和文件夹组合。这种结构如下所示。

  • include/package_name/:此目录包含了需要的库的头文件。
  • msg/:如果开发需要非标准的消息,请把文件放在这里。
  • scripts/:其中包括Bash、Python或任何其他脚本语言的可执行脚本。
  • src/:这是存储程序源文件的地方。你可能会为节点创建一个文件夹或按照希望的方式组织它。
  • srv/:这表示服务(srv)类型。
  • CMakeLists.txt:这是CMake的生成文件。
  • package.xml:这是功能包清单文件。

为了创建、修改或使用功能包,ROS给我们提供了一些工具。

  • rospack:使用此命令来获取信息或在系统中查找包。
  • catkin_create_pkg:使用此命令创建一个新的功能包。
  • catkin_make:使用此命令来编译工作空间。
  • rosdep:使用此命令安装功能包的系统依赖项。
  • rqt_dep:此命令用来查看包的依赖关系图。如果你想看包的依赖关系图,你会在rqt发现一个称为包图(package graph)的插件。选择一个包并查看依赖关系。

要在文件夹和功能包之间移动文件,ROS提供了非常有用的rosbash功能包,其中包含了一些非常类似于Linux命令的命令。下面是一些示例。

  • roscd:此命令用于更改目录,类似于Linux中的cd命令。
  • rosed:此命令用来编辑文件。
  • roscp:此命令用于从功能包复制文件。
  • rosd:此命令列出功能包的目录。
  • rosls:此命令列出功能包下的文件,类似于Linux中的ls命令。

文件package.xml必须在每个功能包中,它用来说明此包相关的各类信息。如果你发现在某个文件夹内包含此文件,那么这个文件夹很可能是一个包或元功能包。

打开一个package.xml文件,可以看到包的名称、依赖关系等信息。功能包清单的作用就是为了方便安装和分发这些功能包。 在package.xml文件中使用的两个典型标标记会显示当前功能包安装之前必须先安装哪些功能包。这是因为新的功能包会使用其他包的一些功能。 标记显示运行功能包中代码所需要的包。

Ⅳ 元功能包

如前所述,元功能包(或简称元包)是一些只有一个文件的特殊包,这个文件就是package.xml。它不包含其他文件,如代码等。

元功能包用于指代其他按照类似功能特性分组的包,例如导航功能包集、ros_tutorials等。

使用迁移的特定规则,可以将ROS Fuerte中的功能包和功能包集转 换为Kinetic和catkin。具体参考http://wiki.ros.org/catkin/migrating_from_rosbuild。

在下图中,可以看到在ros_tutorials元功能包中package.xml的内容。

可以看到标记和标记。这些是功能包清单中必不可少的,在下图中也可以看到这些标记。

你可能感兴趣的:(cmake,保留中间文件)