ROS学习(三)——package.xml和CmakeList.txt文件的编写

前言

package.xml和CmakeList.txt文件是生成程序包和节点的重要配置文件,在开始编写我们的程序之前,对这两个文件的编写需要有一定的了解。

package.xml

package.xml实际上是一个程序包的描述文件,以下参考ros百科入门教程中的一个xml文件来解读。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="you@yourdomain.tld">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
</package>

在描述文件中,有几个重要的参数需要注意,出错将导致编译无法通过,一个是name,决定了编译出的程序包的名称,另外是build_depend和run_depend,它们指明了程序包编译和运行的依赖项,通常是所用到的库文件的名称。这三个参数需要根据自己的需要修改,其他的参数更多的是程序维护这的信息。
实际上,上面的xml文件是一种旧的书写格式,现在ros支持新的书写格式,与第一中格式的差别不大,并且ros对两种xml文件格式都是兼容的,新格式的xml文件可以参照下面的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<package format="2">
<name>node_example</name>
<version>0.0.1</version>
<description>
Example.
</description>
<author>Thomas Denewiler</author>
<maintainer email="tdenewiler@gmail.com">Thomas Denewiler</maintainer>
<license>BSD</license>
<url>https://github.com/tdenewiler/node_example</url>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>message_generation</build_depend>
<depend>roscpp</depend>
<depend>rospy</depend>
<depend>std_msgs</depend>
</package>

可以看到,新版本相对旧版本的区别主要在于不区分build_depend和run_depend,更多的关于两种package.xml描述文件以及它们的区别,可以参考下面的网页
http://wiki.ros.org/catkin/package.xml
http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage

CmakeList.txt

下面来研究一下CmakeList.txt文件的编写方式,先预览一下一个完整的需要包括的内容
cmake_minimum_required()
要求的CMake最低版本
project()
程序包的名称
find_package()
编译依赖的程序包
add_message_files(), add_service_files(), add_action_files()
添加消息、服务或响应文件
generate_messages()
生成消息、服务或响应文件
catkin_package()
catkin程序包
add_library()/add_executable()/target_link_libraries()
添加库文件,可执行文件,链接库文件
catkin_add_gtest()
添加测试单元
install()
安装

前两个参数都很好理解,不再赘述。

find_package()作用是指定编译工程需要的其他程序包,这个函数的参数至少要包括catkin REQUIRED,我们来看一个典型的find_package()包含的内容。

1
2
3
4
5
6
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
sensor_msgs
)

catkin_package()是catkin提供的CMake宏,对生成的pkg和CMake文件进行配置,如果去掉编译也能通过,但是配置会发生变化,比如生成的可执行文件会在工作空间中的build文件夹中而不是devel/lib文件夹中,这样可能导致的一个后果是无法使用rosrun指令来运行可执行文件。

add_message_files()和generate_messages()是在使用用户自定义消息时需要添加,这部分可以在学习添加自定义消息时再深入学习。

add_executable()
指定要编译的可执行文件,例如
add_executable(myNode src/main.cpp src/file1.cpp src/file2.cpp)
上面的语句将调用src/main.cpp,src/file1.cpp和src/file2.cpp生成名为myNode的目标可执行文件,生成的可执行文件就是我们说的节点。

add_library()
生成库文件

target_link_libraries()
指定所生成的可执行文件所链接的库文件,通常写在add_executable()之后。一般来说,要生成一个ros节点,必须添加catkin_LIBRARIES,例如
target_link_libraries(myNode ${catkin_LIBRARIES})

install()
install()是一个可选项,通常在程序编译完后,目标可执行文件被放在工作空间的devel文件夹中,但通常我们希望把目标放在系统中,这样程序包就可以作为被其他人使用,作为其他程序的依赖项。具体做法可以参考ros wiki http://wiki.ros.org/catkin/CMakeLists.txt