ROS机器人开发实践
上QQ阅读APP看书,第一时间看更新

2.3 文件系统

类似于操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下,如图2-5所示。

功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件等。

功能包清单(Package Manifest):每个功能包都包含一个名为package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。

元功能包(Meta Package):在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目的的功能包。例如一个ROS导航的元功能包中会包含建模、定位、导航等多个功能包。

元功能包清单:在图2-5中并未显示,类似于功能包清单,不同之处在于元功能包清单中可能会包含运行时需要依赖的功能包或者声明一些引用的标签。

图2-5 ROS中的文件系统结构

消息(Message)类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。

服务(Service)类型:服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。

代码(Code):用来放置功能包节点源代码的文件夹。

2.3.1 功能包

图2-6是一个功能包的典型文件结构。

图2-6 ROS功能包的典型结构

这些文件夹的主要功能如下。

1)config:放置功能包中的配置文件,由用户创建,文件名可以不同。

2)include:放置功能包中需要用到的头文件。

3)scripts:放置可以直接运行的Python脚本。

4)src:放置需要编译的C++代码。

5)launch:放置功能包中的所有启动文件。

6)msg:放置功能包自定义的消息类型。

7)srv:放置功能包自定义的服务类型。

8)action:放置功能包自定义的动作指令。

9)CMakeLists.txt:编译器编译功能包的规则。

10)package.xml:功能包清单,图2-7是一个典型的功能包清单示例。

图2-7 ROS功能包的package.xml文件示例

从功能包清单中可以清晰地看到该功能包的名称、版本号、信息描述、作者信息和许可信息。除此之外,<build_depend></build_depend>标签定义了功能包中代码编译所依赖的其他功能包,而<run_depend></run_depend>标签定义了功能包中可执行程序运行时所依赖的其他功能包。在开发ROS功能包的过程中,这些信息需要根据功能包的具体内容进行修改。

ROS针对功能包的创建、编译、修改、运行设计了一系列命令,表2-1简要列出了这些命令的作用,后续内容中会多次涉及这些命令的使用,你可以在实践中不断加深对命令的理解。

表2-1 ROS的常用命令

2.3.2 元功能包

元功能包是一种特殊的功能包,只包含一个package.xml元功能包清单文件。它的主要作用是将多个功能包整合成为一个逻辑上独立的功能包,类似于功能包集合的概念。

虽然元功能包清单的package.xml文件与功能包的package.xml文件类似,但是需要包含一个引用的标签如下:


<export>
    <metapackage/>
</export>

此外,元功能包清单不需要<build_depend>标签声明编译过程依赖的其他功能包,只需要使用<run_depend>标签声明功能包运行时依赖的其他功能包。

以导航元功能包为例,可以通过以下命令看到该元功能包中package.xml文件的内容,如图2-8所示。


$ roscd navigation
$ gedit package.xml

图2-8 ROS元功能包的package.xml文件示例