package.xml
当你的package里已经包含配置文件(package.xml),ROS能够找到它。执行:rospack find [包名称]。应该注意到我们刚才所创建的package.xml依赖于 roscpp 和 std_msgs.而catkin恰恰是利用这些依赖项来配置所创建的package。
基本结构
<package>
</ package>
所需标签
<name>
- 包的名称<version>
- 包的版本号(需要3个点分隔的整数)<description>
- 包装内容的描述<maintainer>
- 维护包的人员的名称<license>
- 发布代码的软件许可证(例如GPL,BSD,ASL)。
依赖关系
格式1
<buildtool_depend>
构建工具依赖关系指定此软件包需要构建自身的构建系统工具。通常唯一的构建工具是catkin。在交叉编译场景中,构建工具依赖关系用于执行编译的架构。<build_depend>
构建依赖关系指定构建此包所需的包。在构建时需要这些软件包中的任何文件时才是这种情况。这可以包括这些包在编译时的标头,链接到这些包的库或在构建时需要任何其他资源(特别是当这些包在CMake 中是find_package())时)。在交叉编译场景中,构建依赖关系针对目标体系结构。<run_depend>
运行依赖关系指定在此程序包中运行代码所需的软件包,或针对此软件包构建库。在这种情况下,您依赖于共享库或将其头部包含在此包中的公头中(特别是当这些包在CMake 中的catkin_package()中声明为(CATKIN_DEPENDS)时)。
CMakelists.txt
我们还需要一个 CMakeLists.txt 文件,这样 catkin_make才能够利用 CMake 强大的跨平台特性来编译所创建的package。
CMake版本
cmake_minimum_required(VERSION 2.8.3)
软件包名称
project(beginner_tutorials)
它对应package.xml的<name>
标签。在CMake中,您可以随时在CMake脚本中随时使用变量$ {PROJECT_NAME } 来引用项目名称。
查找构建所需的其他CMake / Catkin 程序包
find_package()
这个函数,或者叫宏。是cmake原有,它是用来寻找库文件。它其实是对应了package.xml标签中的xxx特别在生成消息/服务时,运行和编译时的依赖不一样,所以说findpackage()与catkin_package(CATKIN_DEPEND xxx)所跟的依赖是略有不同的,findpackage要的是message_generation,catkin_package要的是message_runtime。
如果CMake通过find_package找到一个包,则会创建几个提供有关找到包信息的CMake环境变量。这些环境变量可以稍后在CMake脚本中使用。环境变量描述了包导出的头文件的位置,源文件的位置,包所依赖的库以及这些库的路径。名称符合<PACKAGE NAME> _ <PROPERTY>
的惯例:
- <NAME> _FOUND
- 如果找到库,则设置为true,否则为false
- <NAME> _INCLUDE_DIRS或<NAME> _INCLUDES
- 包导出的包含路径
- <NAME> _LIBRARIES或<NAME> _LIBS
- 由包导出的库
- <NAME> _DEFINITIONS
-
catkin程序包
find_package(catkin required COMPONENTS xyz)
required表示要寻找的依赖包对我来说很重要,如果找不到就不编译了。COMPONENTS它表示我们要找的包需要后面的这些库或者包。
CMake程序包
启用Python模块支持
catkin_python_setup()
消息/服务/动作生成
消息(.msg),服务(.srv)和动作(.action)文件在ROS包构建和使用之前需要一个特殊的预处理器构建步骤。这些宏的要点是生成编程语言特定的文件,以便可以利用其选择的编程语言中的消息,服务和动作。
- add_message_files
- add_service_files
- add_action_files
这些宏之后必须跟随调用生成的宏generate_messages()
Catkin包的导出、依赖信息
catkin_package()
是一个catkin提供的CMake宏。这是为构建系统指定catkin特定信息所必需的,以便进一步应用于生成pkg-config和CMake文件。在使用add_library()
或add_executable()
声明任何目标之前,必须调用此函数。该函数有5个可选参数:
INCLUDE_DIRS
- 包的导出包含路径。表示这个catkin包的头文件是导出到include这个文件夹,include位置是位于该功能包目录下(需要手动创建)就是当前编写的CMakeList.txt所在位置,与msg、srv、package.xml、CMakeList.txt共存的位置。与工作空间下(有src、build、devel的位置)devel文件下的include不同,那个有包含由msg文件生成的消息、服务的头文件。
LIBRARIES
- 从项目导出的库,就是做成一个库给别的功能包用。
CATKIN_DEPENDS
- 该项目依赖的其他catkin项目。是简单来说要填的内容就是该功能包运行时所需要的、所依赖的catkin包。它与package.xml中标签xxxx对应。运行和编译时的依赖不一样,所以说findpackage()与catkin_package(CATKIN_DEPEND xxx)所跟的依赖是略有不同的,findpackage要的是message_generation,catkin_package要的是message_runtime。
DEPENDS
- 该项目所依赖的非catkin CMake工程。这个包运行时所依赖的包如果不属于catkin包的话就要写在这里。简单来说,一样也是通过package.xml的run_depend标签所决定所确定。
`CFG_EXTRAS
- 其他配置选项
建立库/可执行文件
include_directories(<dir1>,<dir2>,...,<dirN>)
是用来指定头文件的搜索路径。include_directories的参数应该是find_package调用生成的*_INCLUDE_DIRS变量。如果用findpackage()寻找catkin和Boost,然后用include_directories()找它俩的头文件,可以这样表达:include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
add_library()
将功能包的cpp生成一个库给别人用。默认的catkin编译产生共享库add_library($ {PROJECT_NAME} $ {$ {PROJECT_NAME} _SRCS})
。add_dependencies(some_target ${PROJECT_NAME}_generate_messages_cpp)
如果你有一个包编译.msg .srv,并且可执行文件要使用他们,那么你就需要创建一个显式的依赖项,自动生成message的target。这里的some_target是add_executable()设置的target的名字。target_link_libraries(<executableTargetName>,<lib1>,<lib2>,... <libN>)
函数来指定可执行文件链接的库。
测试建立
安装规则
参考:
catkinCMakeLists.txt
catkinpackage.xml
ROS之CMakeLists
ROS学习之CMakeLists.txt完全解析
ROS中的CMakeLists.txt