1. 创建一个包
本节的重点是使用catkin创建一个包(也可以使用rospack_create,这里不讲解),并讲解如何使用rospack来列出包。
2. caktin包的组成
*包必须包含package.xml文件,它是提供包的元信息的(前面说过)。
*包必须包含CMakeLists.txt文件,catkin提供这个文件的模板,后期根据自己需要修改。
*每个包是独立的文件夹中,不允许嵌套。
类似的包结构如下图:
3.catkin工作空间中的包结构
使用catkin包的推荐方法使使其在一个catkin workspace中,但是也可以独立的编译一个包,一个正常的工作空间可能如下图架构:
4. 创建一个catkin包
4.1 step1 切换到工作空间的源码目录:
$ cd ~/catkin_ws/src //这个源码目录是在创建工作空间时创建的
4.2 step2 使用catkin_create_pkg创建包
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
这将会创建一个名为beginner_tutorials的包,包中包括packages.xml和CMakeList.txt文件,并且已经根据给出的创建信息填充了部分文件。
catkin_create_pkg需要给出包的名字和可选地给出包的依赖,依赖项可以在以后手动添加到package.xml中。
5. 编译catkin工作空间、执行setup脚本
$ cd catkin_ws //切换到工作空间顶层目录
$ catkin_make //make
在编译完成后,如果之前没有配置当前工作空间相关信息到ROS环境变量中,则需要执行以下:
$ . ~/catkin_ws/devel/setup.bash
这里就类似安装ROS时将/opt/ros/jade/setup.bash添加到shell启动脚本一样。一个是在shell中建立ROS环境变量,一个是将当前工作空间变量信息添加到ROS环境变量中。
并不是每次catkin_make后都需要执行这个脚本,从建立工作空间后一次就够了。
6. 包依赖
6.1 一级依赖
可以使用rospack工具的depends1(1指一级依赖)选项查看包的一级依赖:
$ rospack depends1 beginner_tutorials
//会看到以下一级依赖
std_msgs
rospy
roscpp
可以看出来,这些依赖和我们使用catkin_create_okg创包时使用的参数一样,这些依赖都在packages.xml中:
$ roscd beginner_tutorials
$ cat package.xml
//会看到如下内容
<package>
...
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
...
</package>
6.2 简介依赖
每个依赖包都可能有很多自己的依赖,rospack可以使用depends选项递归地列出所有嵌套的依赖:
$ rospack depends beginner_tutorials
//会看到很多依赖
std_msgs
rospy
roscpp
...
...
...
7. 定制自己的包
7.1 定制package.xml文件
package.xml文件位于包目录中,它是catkin生成的,我们需要根据我们的实际情况来修改该文件:
7.1.1 修改描述标签
<description>The beginner_tutorials package</description>
<description>这里填写包的基本描述信息</description>
7.1.2 修改维护信息
维护信息很重要,当你的包在网上流传,那么使用者会通过该信息来联系你。
一个包可能会有多个维护者,那么每个维护者占用一条消息。
Toggle line numbers
7 <!-- One maintainer tag required, multiple allowed, one person per tag -->
8 <!-- Example: -->
9 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
10 <maintainer email="user@todo.todo">user</maintainer>
7.1.3 修改许可标签
许可标签十分重要,它描述了你的包具有什么样的权限。
Toggle line numbers
12 <!-- One license tag required, multiple allowed, one license per tag -->
13 <!-- Commonly used license strings: -->
14 <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
15 <license>TODO</license>
7.1.4 修改依赖标签
依赖分为4种: build_depend, buildtool_depend, run_depend, test_depend. 在xml文件中都有体现,如下:
12 <buildtool_depend>catkin</buildtool_depend>
13
14 <build_depend>roscpp</build_depend>
15 <build_depend>rospy</build_depend>
16 <build_depend>std_msgs</build_depend>
17
18 <run_depend>roscpp</run_depend>
19 <run_depend>rospy</run_depend>
20 <run_depend>std_msgs</run_depend>
27 <!-- The *_depend tags are used to specify dependencies -->
28 <!-- Dependencies can be catkin packages or system dependencies -->
29 <!-- Examples: -->
30 <!-- Use build_depend for packages you need at compile time: -->
31 <!-- <build_depend>genmsg</build_depend> -->
32 <!-- Use buildtool_depend for build tool packages: -->
33 <!-- <buildtool_depend>catkin</buildtool_depend> -->
34 <!-- Use run_depend for packages you need at runtime: -->
35 <!-- <run_depend>python-yaml</run_depend> -->
36 <!-- Use test_depend for packages you need only for testing: -->
37 <!-- <test_depend>gtest</test_depend> -->
38 <buildtool_depend>catkin</buildtool_depend>
39 <build_depend>roscpp</build_depend>
40 <build_depend>rospy</build_depend>
41 <build_depend>std_msgs</build_depend>
7.1.5 最终的package.xml文件
把注释和未使用的标签清除后,简洁的package.xml文件如下:
<?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>
7.2 定制CMakeList.txt文件
经过以上的步骤我们已经定制完成了属于我们自己包的package.xml文件,接下来我们要修改CMakeList.txt文件,并构建我们的包。看下一节教程。