0%

ROS基础:catkin编译系统

ROS使用catkin来管理包,它是对CMake的扩展。一个catkin软件包必须要有package.xml和CMakeLists.txt两个文件,前者包括了包的描述和依赖信息,后者是构建包的cmake文件。实际工作中,catkin工具会调用CMakeLists.txt,而生成makefile等文件。

package.xml基本结构

一个典型的package.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<package format="2">
<name>your_package</name>
<version>1.2.4</version>
<description>
This package adds extra features to rosawesome.
</description>
<maintainer email="you@example.com">Your Name</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<build_depend>angles</build_depend>
<build_export_depend>angles</build_export_depend>
<exec_depend>openni_launch</exec_depend>
</package>

几个重要的标签,解释如下:

  1. buildtool_depend: 编译工具,默认catkin,一般不用修改。
  2. depend:指定编译时的依赖项,包含build_dependbuild_export_dependexec_depend
  3. build_depend: 指定编译功能包需要的依赖,例如angle包提供了C++头文件和编译文件。
  4. build_export_depend: 指定对功能包构建库需要的依赖,例如本功能包导出的头文件依赖了<angles/angles.h>,那么第三方包使用本包导出的头文件时,仍然需要<build_depend>angles</build_depend>
  5. exec_depend: 指定运行该功能包需要的依赖。
  6. 建议:简单情况直接使用depend标签即可(一个顶仨),也不容易出错;如果是依赖的系统项,可以根据官方建议谨慎选择。

CMakeLists.txt的基本结构

CMake是不知道package.xml中的依赖关系的,但是catkin知道,因此在CMakeLists.txt中需要对catkin合理配置,便于处理包的依赖关系。
CMakeLists.txt基本结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cmake_minimum_required(VERSION 2.8.3)
project(robot_brain)
# Get the information about this package's buildtime dependencies
find_package(catkin REQUIRED
COMPONENTS message_generation std_msgs sensor_msgs)

# Declare the message files to be built
add_message_files(FILES
MyMessage.msg
)

# Declare the service files to be built
add_service_files(FILES
MyService.srv
)

# Actually generate the language-specific message and service files
generate_messages(DEPENDENCIES std_msgs sensor_msgs)

# Declare that this catkin package's runtime dependencies
catkin_package(
CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
)

add_executable(message_program src/main.cpp)
add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS)
target_link_libraries(message_program ${catkin_LIBRARIES} other_lib)

重要的模块解释如下:

  1. find_package: cmake宏,指定依赖的其他pacakge,实际是生成了一些环境变量,如NAME_FOUND,NAME_INCLUDE_DIRS, NAME_LIBRARYIS,此处catkin是必备依赖 其余的syd_msgs…为组件,这个里面的包在package.xml中一定要有build_depend标签。
  2. catkin_package:catkin宏,生成当前package的cmake配置,供依赖本包的其他软件包调用,同时这个命令必须在add_library()或者add_executable()之前调用;注意这个里面的包在package.xml一定要有build_export_depend标签。
  3. 其余为CMake自身语法,具体可以参考CMake学习资料

创建msg的注意事项

  • 在package.xml中
    1. <build_depend>message_generation</build_depend>
    2. <build_export_depend>message_runtime</build_export_depend>
    3. <exec_depend>message_runtime</exec_depend>
  • 在CMakeLists.txt中
    1. 添加find_package(messaga_generation),确保可以生成msg文件;
    2. 添加catkin_package(message_runtime):确保生成的msgs文件可以被外部使用;
    3. 添加add_message_file,添加具体的文件名;
    4. 添加generate_message中的依赖包,如依赖std_msgs