Package由什么组成?
每一个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
创建一个package包
首先,使用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 <package_name> [depend1] [depend2] [depend3]
接着,我们回到src文件夹的上一级目录,即工作空间catkin_ws中,使用catkin_make对工作空间中的package包进行编译
catkin_make
查看package包的依赖
我们在上述创建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
package.xml文件的描述
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="jane.doe@example.com">Jane Doe</maintainer> --> 10 <maintainer email="user@todo.todo">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="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> <exec_depend>roscpp</exec_depend> <exec_depend>rospy</exec_depend> <exec_depend>std_msgs</exec_depend> </package>