ROS使用catkin来管理包,它是对CMake的扩展。一个catkin软件包必须要有package.xml和CMakeLists.txt两个文件,前者包括了包的描述和依赖信息,后者是构建包的cmake文件。实际工作中,catkin工具会调用CMakeLists.txt,而生成makefile等文件。
package.xml基本结构
一个典型的package.xml文件如下:
1 | <package format="2"> |
几个重要的标签,解释如下:
buildtool_depend
: 编译工具,默认catkin
,一般不用修改。depend
:指定编译时的依赖项,包含build_depend
,build_export_depend
和exec_depend
。build_depend
: 指定编译功能包需要的依赖,例如angle
包提供了C++头文件和编译文件。build_export_depend
: 指定对功能包构建库需要的依赖,例如本功能包导出的头文件依赖了<angles/angles.h>
,那么第三方包使用本包导出的头文件时,仍然需要<build_depend>angles</build_depend>
。exec_depend
: 指定运行该功能包需要的依赖。- 建议:简单情况直接使用
depend
标签即可(一个顶仨),也不容易出错;如果是依赖的系统项,可以根据官方建议谨慎选择。
CMakeLists.txt的基本结构
CMake是不知道package.xml中的依赖关系的,但是catkin知道,因此在CMakeLists.txt中需要对catkin合理配置,便于处理包的依赖关系。
CMakeLists.txt基本结构如下:
1 | cmake_minimum_required(VERSION 2.8.3) |
重要的模块解释如下:
find_package
: cmake宏,指定依赖的其他pacakge,实际是生成了一些环境变量,如NAME_FOUND,NAME_INCLUDE_DIRS, NAME_LIBRARYIS,此处catkin是必备依赖 其余的syd_msgs…为组件,这个里面的包在package.xml中一定要有build_depend
标签。catkin_package
:catkin宏,生成当前package的cmake配置,供依赖本包的其他软件包调用,同时这个命令必须在add_library()或者add_executable()之前调用;注意这个里面的包在package.xml一定要有build_export_depend
标签。- 其余为CMake自身语法,具体可以参考CMake学习资料。
创建msg的注意事项
- 在package.xml中
<build_depend>message_generation</build_depend>
<build_export_depend>message_runtime</build_export_depend>
<exec_depend>message_runtime</exec_depend>
- 在CMakeLists.txt中
- 添加
find_package(messaga_generation)
,确保可以生成msg文件; - 添加
catkin_package(message_runtime)
:确保生成的msgs文件可以被外部使用; - 添加
add_message_file
,添加具体的文件名; - 添加
generate_message
中的依赖包,如依赖std_msgs
- 添加