文章目录
文章目录
前言
一、基本格式
1.基本结构
2.必要标签
3.依赖关系
二、Metapackage包
总结
前言
ros每个功能包中都有一个包清单,它是一个名为package.xml的XML 文件,它必须包含在任何符合 catkin 的包的根文件夹中。此文件定义有关包的属性,例如包名称、版本号、作者、维护者以及对其他 catkin 包的依赖性。
package.xml文件有自己特有的数据书写标签,而它是xml格式文件,大家可能不太熟悉这个格式,其中的标签也比较复杂,本文对这些标签的作用进行解析,并阐明Metapackage元包的作用。
一、基本格式
1.基本结构
每个 package.xml 文件都有<package>标签作为根标签文档,格式如下:
<package format="2">
</package>
2.必要标签
这些必要标签是在<package>标签中嵌套的标签集,以使包清单信息完整,主要是作者和关于包的一些描述:
-
<name> - 包的名称
-
<version> - 包的版本号(必须是 3 个点分隔的整数)
-
<description> - 包内容的描述
-
<maintainer> - 维护包的人员的姓名
-
<license> - 发布代码所依据的软件许可证(例如 GPL、BSD、ASL)
-
<url> - 包信息的 URL,通常是 ros.org 上的 wiki 页面
-
<author> - 包的作者
<package format="2">
<name>foo_core</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="ivana@osrf.org">Ivana Bildbotz</maintainer>
<license>BSD</license>
</package>
3.依赖关系
依赖关系是用来说明该功能包编译或运行时需要依赖哪些其他的功能包,可以有六种类型的依赖关系:
-
Build Tool Dependencies指定构建功能包系统的工具。通常,唯一需要的构建工具是 catkin。在交叉编译场景中,构建工具依赖项适用于执行编译的体系结构。
-
Build Dependencies指定编译这个包时需要哪些包。当构建时需要这些包中的任何文件时,就会出现这种情况。当这些包在 CMake 中被放到find_package()中时,就需要把这些包写在build_dependencies标签中。在交叉编译场景中,构建依赖项是针对目标架构的。
-
Build Export Dependencies指定需要哪些包来针对此包构建库。当您在此包的公共标头中传递地包含它们的标头时就是这种情况(尤其是当这些包在 CMake 的catkin_package()中声明为 (CATKIN_)DEPENDS 时)。
-
Execution Dependencies指定运行此包中的代码需要哪些包。当您依赖此包中的共享库时就是这种情况(尤其是当这些包在 CMake 的catkin_package()中声明为 (CATKIN_)DEPENDS 时)。
-
Test Dependencies项仅指定单元测试的附加依赖项。他们不应该复制任何已经提到的构建或运行依赖项的依赖项,基本用不着。
-
Documentation Tool Dependencies指定此包生成文档所需的文档工具,基本用不着。
这六个关系依次对应标签:
-
<buildtool_depend>
-
<build_depend>
-
<build_export_depend>
-
<exec_depend>
-
<test_depend>
-
<doc_depend>
因为<build_depend>、<build_export_depend>、<exec_depend>经常一起使用,他们的依赖功能包往往是一样的(如果使用catkin_create_pkg创建功能包时就会发现系统会自动为所有依赖功能包添加这三个标签),所以可以使用<depend>标签替代这三个标签,以下两个代码是等价的:
<package format="2">
<name>foo_core</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="ivana@willowgarage.com">Ivana Bildbotz</maintainer>
<license>BSD</license>
<url>http://ros.org/wiki/foo_core</url>
<author>Ivana Bildbotz</author>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>std_msgs</depend>
<depend>message_generation</depend>
<depend>message_runtime<depend>
<depend>rospy</depend>
<test_depend>python-mock</test_depend>
<doc_depend>doxygen</doc_depend>
</package>
<package format="2">
<name>foo_core</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="ivana@willowgarage.com">Ivana Bildbotz</maintainer>
<license>BSD</license>
<url>http://ros.org/wiki/foo_core</url>
<author>Ivana Bildbotz</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>message_runtime</build_depend>
<build_depend>rospy</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>message_generation</build_export_depend>
<build_export_depend>message_runtime</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_generation</exec_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>rospy</exec_depend>
<test_depend>python-mock</test_depend>
<doc_depend>doxygen</doc_depend>
</package>
二、Metapackage包
Metapackage包本身没什么意义,它是负责管理其他在Metapackage中的包,Metapackage是一个功能包集,是把一些相近的功能模块、 软件包放到一起,比如ROS中一些常见地功能包集:
Metapackage中的.xml文件是有固定的形式的如下:
<export> #表示这是一个Metapackage
<metapackage/>
<architecture_independent/>
</export>
##下面均是MetaPackage所管理(依赖)的所有的其他的package
<exec_depend>your_custom_msgs</exec_depend>
<exec_depend>your_server_node</exec_depend>
<exec_depend>your_utils</exec_depend>
Metapackage中的CMakeList.txt文件是有固定的形式的如下,所有的Metapackage中的CMakeList.txt文件均是这样:
cmake_minimum_required(VERSION 2.8.3)
project(exploration_master)
find_package(catkin REQUIRED)
catkin_metapackage()
总结
package.xml文件是每个功能包必须包含的文件,它描述了功能包的主要功能和作者信息,以及编译和运行功能包需要依赖的其他功能包,而它是xml格式文件,大家可能不太熟悉这个格式,其中的标签也比较复杂,本篇文章对其进行了详细解析。