catkin是当前ROS的官方编译工具。
catkin编译基于CMake,源代码以package为单位组织,每个package必须包含package.xml和CMakeList.txt两个文件。
(1)package.xml
catkin支持两种package.xml标签格式,格式1标准说明是REP-0127,格式2标准说明是REP-0140。后者是针对前者的一些缺点进行改进后的版本,因此更加被推荐使用。
在package.xml中主要包含以下信息:
描述信息(比如package的功能描述、维护者等)
依赖信息
元信息(比如作者、网页)
package信息(比如版本)
每个package.xml文件必须包含的标签包括:
<package> : 最高级tag,属性:format,用于指定格式
<name> :package名称
<version> :当前版本
<description>:package的基本描述
<maintainer>(至少一个):维护者
<license>(至少一个):协议
<buildtool_depend>(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。
可选标签包括:
<package>
<url> (多个):指定package的网址
<author> (多个):作者
<build_depend> (多个):编译时需要依赖的其它package,适用于静态库
<conflict> (多个):声明本package与其它ROS package有冲突,不能同时部署
<replace> (多个):声明本package是其它package的替换版本
<export>:用于添加额外的信息,比如需要嵌入的其它package的插件,或者一些说明信息。
(2)CMakeList.txt
1.cmake_minimum_required():CMake版本
2.project():工程名
3.add_compile_options():编译器选择
比如:
cmake_minimum_required(VERSION 3.0.2)
project(ui_console)
add_compile_options(-std=c++11)
4.find_package():加载外部变量
version和EXACT: 都是可选的,version指定的是版本,如果指定就必须检查找到的包的版本是否和version兼容。如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以。
QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)。
MODULE可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。
CONFIG可选字段。直接在Config模式中查找。下文会介绍什么是Moudule模式什么是Config模式。
REQUIRED可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定REQUIRED则cmake会继续执行。
COMPONENTS:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行。如find_package( PCL REQUIRED COMPONENT common io )我们就利用了该关键字寻找了common和io包。
OPTIONAL_COMPONENTS:可选的模块,找不到也不会让cmake停止执行。
5.include_directories():添加头文件路径
添加包的头文件路径,如果有其它外部路径也在这里添加。比如
include_directories(
include
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
6.add_library():生成库
# 生成库文件,可传入多个源文件
add_library(your_library
libsrc1.cpp
libsrc2.cpp
libsrc_etc.cpp
)
7.add_executable():生成可执行文件
# 生成可执行文件,可以传入多个源文件
add_executable(my_node
src0.cpp
src1.cpp
src2.cpp
)
8.add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加,如下:
# 添加对其它package消息的依赖,前提是已经通过find_package()引入了这个package
add_dependencies(my_target ${catkin_EXPORTED_TARGETS})
# 添加对本package消息的依赖
add_dependencies(my_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
9.target_link_libraries():链接库
# 为可执行文件或库添加链接库
target_link_libraries(my_node
${catkin_LIBRARIES} # ROS基本库
${Boost_LIBRARIES} # Boost库
)
10.install():安装
# 默认情况catkin会为每个package在./devel中建立目录,存放目标文件
# 目标文件可以直接通过rosrun和roslaunch访问
# 如需制定其它安装位置,则需通过install()命令
install(TARGETS my_node0 my_node1
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
11.add_message_files(), add_service_files(), add_action_files()
用于添加自定义的message、service和action文件。基本语法为:
# 以message为例,service、action类似
add_message_files(
# 目录名
DIRECTORY msg
# 文件名
FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg
)
11.catkin_package()
catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
必须在声明add_library()或add_executable()前调用
有5个可选参数:
INCLUDE_DIRS - 声明给其它package的include路径
LIBRARIES - 声明给其它package的库
CATKIN_DEPENDS - 本包依赖的catkin package
DEPENDS - 本包依赖的非catkin package
CFG_EXTRAS - 其它配置参数
比如:
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp nodelet
DEPENDS eigen opencv
)