package.xml和CMakeLists.txt详解

基础教程:http://wiki.ros.org/cn/ROS/Tutorials

ROS包的工作空间文件:

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    package_1/
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

可以看到每个节点包内都包含一个package.xml文件和一个CMakeLists.txt文件。我在刚了解ROS的时候一直不太明白这两个文件是干什么的,以及怎么使用。下面我将具体介绍一下这两个文件包含什么内容,有什么作用。

详细内容参考官方教程:package.xml

​ CMakeLists.txt

package.xml文件

package文件是.xml后缀的,xml是一种可扩展标记语言(EXtensible Markup Language),和网页上用到的html结构很类似,是html的一个补充。里面的内容通过标签来进行编辑。它定义了所在软件包的相关属性,名称,版本号,作者,维护者,以及和其他catkin包的依赖关系。在ROS较早版本中,它的作用类似于manifest.xml文件。

package.xml文件从旧版本格式1format = "1"更新到了格式2format = "2"其中有些内容进行了更改升级。

格式2(推荐)

每个package.xml文件都需要有一个根标签

<package format="2">

package>

基本标签:

  • 包的名称
  • 软件包的版本号
  • 包的描述信息
  • 维护者的名字和联系方式(一般是邮箱)
  • 软件许可证(例如:GPL, BSD, ASL)

举个例子:

<package format="2">
  <name>foo_corename>
  <version>1.2.4version>
  <description>
  This package provides foo capability.
  description>
  <maintainer email="[email protected]">Ivana Bildbotzmaintainer>
  <license>BSDlicense>
package>

依赖:

  • 编译构建工具,通常为catkin
  • 指定依赖关系为构建,导出和执行所需要的依赖关系。这是最常用的依赖标记
  • 编译依赖项,编译时需要依赖的库,类等
  • 导出依赖项
  • 运行时所需要的依赖项
  • 测试用例用到的依赖项
  • 生成文档时所需要的依赖项

举个例子:

<package format="2">
  <name>foo_corename>
  <version>1.2.4version>
  <description>
    This package provides foo capability.
  description>
  <maintainer email="[email protected]">Ivana Bildbotzmaintainer>
  <license>BSDlicense>

  <url>http://ros.org/wiki/foo_coreurl>
  <author>Ivana Bildbotzauthor>

  <buildtool_depend>catkinbuildtool_depend>

  <depend>roscppdepend>
  <depend>std_msgsdepend>

  <build_depend>message_generationbuild_depend>

  <exec_depend>message_runtimeexec_depend>
  <exec_depend>rospyexec_depend>

  <test_depend>python-mocktest_depend>

  <doc_depend>doxygendoc_depend>
package>

格式1

格式1的基本标签和格式2的相同,不同的是只有四个依赖标签

  • 运行时的依赖项,在格式2中改为

以下是参考别人写的格式1和2区别:链接

格式1 :

 
<package> 
<name>turtlesimname>
<version>0.8.1version>
<description>
turtlesim is a tool made for teaching ROS and ROS packages.
description>
<maintainer email="[email protected]">Dirk Thomasmaintainer>
<license>BSDlicense>
<url type="website">http://www.ros.org/wiki/turtlesimurl>
<url type="bugtracker">https://github.com/ros/ros_tutorials/issuesurl>
<url type="repository">https://github.com/ros/ros_tutorialsurl>
<author>Josh Faustauthor>

<buildtool_depend>catkinbuildtool_depend>

<build_depend>geometry_msgsbuild_depend>
<build_depend>qtbase5-devbuild_depend>
<build_depend>message_generationbuild_depend>
<build_depend>qt5-qmakebuild_depend>
<build_depend>rosconsolebuild_depend>
<build_depend>roscppbuild_depend>
<build_depend>roscpp_serializationbuild_depend>
<build_depend>roslibbuild_depend>
<build_depend>rostimebuild_depend>
<build_depend>std_msgsbuild_depend>
<build_depend>std_srvsbuild_depend>

<run_depend>geometry_msgsrun_depend>
<run_depend>libqt5-corerun_depend>
<run_depend>libqt5-guirun_depend>
<run_depend>message_runtimerun_depend>
<run_depend>rosconsolerun_depend>
<run_depend>roscpprun_depend>
<run_depend>roscpp_serializationrun_depend>
<run_depend>roslibrun_depend>
<run_depend>rostimerun_depend>
<run_depend>std_msgsrun_depend>
<run_depend>std_srvsrun_depend>
package>

格式2:


<package format="2"> 
<name>turtlesimname>
<version>0.8.1version>
<description>
turtlesim is a tool made for teaching ROS and ROS packages.
description>
<maintainer email="[email protected]">Dirk Thomasmaintainer>
<license>BSDlicense>
<url type="website">http://www.ros.org/wiki/turtlesimurl>
<url type="bugtracker">https://github.com/ros/ros_tutorials/issuesurl>
<url type="repository">https://github.com/ros/ros_tutorialsurl>
<author>Josh Faustauthor>

<buildtool_depend>catkinbuildtool_depend>

<depend>geometry_msgsdepend>
<depend>rosconsoledepend>
<depend>roscppdepend>
<depend>roscpp_serializationdepend>
<depend>roslibdepend>
<depend>rostimedepend>
<depend>std_msgsdepend>
<depend>std_srvsdepend>

<build_depend>qtbase5-devbuild_depend>
<build_depend>message_generationbuild_depend>
<build_depend>qt5-qmakebuild_depend>

<exec_depend>libqt5-coreexec_depend>
<exec_depend>libqt5-guiexec_depend>
<exec_depend>message_runtimeexec_depend>
package>

总的来说,格式1和2改动不大,格式2将标签分得更细,区分了包依赖编译依赖运行依赖,添加了导出依赖项

Metapackages

将多个软件包分组为单个逻辑软件包通常很方便。这可以通过metapackages来实现。metapackage(元包)是在package.xml中具有以下导出标记的普通包:

 <export>
   <metapackage />
 export>

除了必需的对catkin的依赖之外,元包只能对其分组的包运行依赖。

另外,metapackage有一个必需的,样板CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.3)
project()
find_package(catkin REQUIRED)
catkin_metapackage()

注意:将替换为metapackage的名称

回顾catkin_make的作用:参考

总结一下整个编译的过程

  1. 执行catkin_make
  2. 执行catkin_workspace。解析catkin_make的参数同时遍历整个工作空间把所有的有package.xml的文件夹添加进软件包列表里面。对每个软件包执行add_subdirectory
  3. 执行每个软件包内部的CMakeList.txt文件
  4. 执行 catkin_package。解析package.xml文件,载入对应的参数。根据依赖参数,载入对应的软件包参数。根据载入参数生成当前软件包的配置文件

CMakeLists.txt

待更新。。。

你可能感兴趣的:(ROS)