每一个Package中都必须包括以下两个文件:
package.xml
能够提供当前Package包的描述(元)信息
CMakeLists.txt
如果它是一个catkin元包,它必须具有相关的样板文件CMakeLists.txt文件。
此外,每个Package包必须有其自己的文件夹,这就意味着没有嵌套的包,也不存在多个package包共享同一个文件夹。
最简单的package包可能结构如下所示:
my_package/
CMakeLists.txt
package.xml
(工作空间创建方法参考:ROS学习-创建一个工作空间)
同时,假如在工作空间 Workspace下创建n个包package1、package2 … packagen,则整体文件结构如下所示:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
首先,使用cd切换到工作空间的src文件夹下。
cd ~/catkin_ws/src
使用catkin_create_pkg命令,创建一个package包,同时这个包依赖于std_msgs rospy roscpp等ros包。
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
即其用法为:
catkin_create_pkg
[depend1] [depend2] [depend3]
接着,我们回到src文件夹的上一级目录,即工作空间catkin_ws中,使用catkin_make对工作空间中的package包进行编译
catkin_make
我们在上述创建beginner_tutorials包时依赖了std_msgs rospy roscpp等常用的ros包,可以通过rospack命令进行查看。
rospack depends1 beginner_tutorials
注意这个depends1是指的是beginner_tutorials所直接依赖的包,即我们在catkin_create_pkg命令创建时所指定的包,返回结果应该如下所示:
roscpp
rospy
std_msgs
同时上述的roscpp、rospy、std_msgs等包也都依赖于其他包,比如我们使用:
rospack depends1 rospy
可以查看得到rospy所依赖的包包括:
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
上述这些rospy所依赖的包都是beginner_tutorials的间接依赖包,那我们怎么知道beginner_tutorials所有的间接依赖包呢?
可以通过rospack depends(depends1变为depends)来进行查看:
输入命令:
rospack depends beginner_tutorials
返回结果:
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy
description tag(这是一个描述性的tag)
<description>The beginner_tutorials package</description>
这一部分的内容可以由我们自主设定,通过一句简单的描述来说明包的内容和功能就行了。
maintainer tag(说明这个包的维护者,或者说作者,让使用者可以联系到你)
7 <!-- One maintainer tag required, multiple allowed, one person per tag -->
8 <!-- Example: -->
9 <!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
10 <maintainer email="[email protected]">user</maintainer>
把email和名字替换成我们自己的就可以。
license tag(包的许可满足什么开源政策)
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>
因为我们依赖的包是BSD,所以这里我们也是相同的。
<license>BSD</license>
dependencies.tag(对自定义包所依赖包的描述)
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 <exec_depend>roscpp</exec_depend>
19 <exec_depend>rospy</exec_depend>
20 <exec_depend>std_msgs</exec_depend>
最终一个通用的package.xml文件形式如下:
<?xml version="1.0"?>
<package format="2">
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="[email protected]">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="[email protected]">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
</package>