创建一个ROS package(rawmeat:wiki.ros.org/ROS/Tutorials/CreatingPackage)
描述:这个教程包含使用roscreate-pkg 或 catkin来创造一个新的package,使用rospack来列举package的依赖文件。
教程等级:初学者
下一个教程:构造一个ROS package
(只介绍catkin)
内容:
- 什么组成了一个catkin package?
- catkin workspace中的packages
- 创建一个catkin package
- 建立一个catkin workspacce与source setup file
- package的依赖关系
- 第一阶依赖关系
- 间接的依赖关系
- 定制你的package
- 定制package.xml
- 描述tag
- 维护tag
- 许可证tag
- 依赖关系tag
- 最终的package.xml
- 定制CMakeList.txt
- 定制package.xml
1.什么组成了一个catkin package?
一个package如果要被称为Catkin package,需要满足以下几个条件:
- package包含一个catkin compliant package.xml文件。
- catkin compliant package.xml 提供了package的元信息。
- package必须包含一个CMakeLists.txt which uses catkin。
- 如果它是一个catkin metapackage,那么必须有相关的样板CMakeLists.txt文件
每个package都有自己的文件夹,
- 这意味着没有嵌套的packages或者多个packages分享同个路径
最简单的可能的package可能有如下结构:
my_package/
CMakeLists.txt
package.xml
2.catkin workspace中的packages
推荐的使用catkin packages是使用catkin workspace,但是也可以单独使用catkin packages。一个普通的workspace可能如下所示:
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
在继续这个教程之前,根据教程 Creating a workspace for catkin(http://wiki.ros.org/catkin/Tutorials/create_a_workspace) 先创建一个空的catkin workspace。
3.创建一个catkin package
这个教程展示如何使用[catkin_create_pkg] script(http://wiki.ros.org/catkin/commands/catkin_create_pkg)来创建新的catkin package ,以及创建之后可以做什么。
首先改变你在(http://wiki.ros.org/catkin/Tutorials/create_a_workspace)教程中之前创建的catkin workspace的 source space目录:
# You should have created this in the Creating a Workspace Tutorial
$ cd ~/catkin_ws/src
现在使用catkin_creat_pkg script来创建新的package,名叫“beginner_tutuorials”,依赖于std_msgs, roscpp, and rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
这将会创建一个beginner_tutorials文件夹,包括一个[package.xml] (http://wiki.ros.org/catkin/package.xml)和一个 CMakeLists.txt,这些的部分被你在catkin_creat_pkg给出的信息填满。
catkin_creat_pkg要求你给它一个package_name和有选择地,这个package所依赖的清单:
# This is an example, do not try to run this
# catkin_create_pkg [depend1] [depend2] [depend3]
catkin_creat_pkg也有更多先进的功能,在catkin/commands/catkin_create_pkg
4.建立一个catkin workspacce与source setup文件
现在你需要在catkin workspace中建立package:
$ cd ~/catkin_ws
$ catkin_make
在workspace被创建之后,它已经在devel的子文件夹中创建了相似的结构,正如你在/opt/ros/$ROSDISTRO_NAME下面经常找到的。
为了将workspace增加到你的ROS环境中,你需要source产生的setup文件:
$ . ~/catkin_ws/devel/setup.bash
5.package的依赖关系
5.1第一阶依赖关系
之前使用catkin_creat_pkg的时候,提供了一些package的依赖关系。这些第一阶级的依赖关系现在可以被rospack 查看
$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
正如所示,rospack列举了相同的依赖关系,和运行catkin_create_pkg时的一样,这些依赖关系被储存在package.xml文件中
$ roscd beginner_tutorials
$ cat package.xml
< package format=”2” >
…
< buildtool_depend >catkin< /buildtool_depend >
< build_depend >roscpp< /build_depend >
< build_depend >rospy< /build_depend >
< build_depend >std_msgs< /build_depend >
…
< /package >
5.2间接的依赖关系
许多情况,一个依赖关系也有自己的依赖关系。比如说,rosp有其他的依赖关系
$ rospack depends1 rospy
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
一个package可以有许多间接依赖,幸运的是rospack可以递归地确定所有嵌套依赖关系。
$ 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
6.定制你的package
这部分教程会研究catkin_create_pkg创建的每个文件,以及一行行地描述这些文件的成分,还有你怎样为你的package而定制他们。
6.1定制package.xml
生成的package.xml应该在你的新package中。现在熟悉新的(package.xml)[http://wiki.ros.org/catkin/package.xml]以及接触需要你注意的元素。
6.1.1 描述tag
首先升级描述tag:
5 < description >The beginner_tutorials package< /description >
改变这个描述至任何你喜欢的,但是按照惯例第一句话应该短,同时覆盖了package的范围。如果在一句话中描述这个package很困难,就需要拆分。
6.1.2维护tag
接下来是维护者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 >
对于package.xml这是一个必须的,重要的tag因为它让其他人知道谁来联系这个package。至少一个维护者是需要的,但是你可以有许多,如果你喜欢。维护者的名字在tag的体内,但是这儿也有一个email属性应该被填写:
7 < maintainer email=”you@yourdomain.tld”>Your Name< /maintainer>
6.1.3许可证tag
接下来是许可证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, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, and LGPLv3。你可以在Open Source Initiative阅读几个。对于这个教程,我们将会使用BCD许可,因为剩余的ROS核心成分已经使用过它了。
8 < license>BSD< /license>
6.1.4依赖关系tag
接下来的tag描述了package的依赖关系。依赖关系被分在build_depend, buildtool_depend, exec_depend, test_depend。对于这些tag的更清楚的解释,请见文件Catkin Dependencies。既然我们已经把std_msgs, roscpp,和 rospy作为论证传递给了catkin_create_pkg,依赖关系将会如下所示:
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 < !– genmsg< /build_depend> –>
32 < !– Use buildtool_depend for build tool packages: –>
33 < !– catkin< /buildtool_depend> –>
34 < !– Use exec_depend for packages you need at runtime: –>
35 < !– python-yaml< /exec_depend> –>
36 < !– Use test_depend for packages you need only for testing: –>
37 < !– 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>
我们所有列举的依赖文件已经被作为一个build_depend添加给我们,除了catkin中默认的buildtool_depend。这种情况下,我们想让我们的依赖文件在构建和运行的时候可用,所以我们将为他们的每一个添加一个exec_depend tag :
12 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>
6.1.5 最终的package.xml
正如你所见最终的package.xml,不含评论与没有使用的tags,简洁多了:
1 < ?xml version=”1.0”?>
2 < package format=”2”>
3 < name>beginner_tutorials< /name>
4 < version>0.1.0< /version>
5 < description>The beginner_tutorials package< /description>
6
7 < maintainer email=”you@yourdomain.tld”>Your Name< /maintainer>
8 < license>BSD< /license>
9 < url type=”website”>http://wiki.ros.org/beginner_tutorials< /url>
10 < author email=”you@yourdomain.tld”>Jane Doe< /author>
11
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>
21
22 < /package>
6.2定制CMakeList.txt
既然package.xml,包含了元信息,已经为你的package量身定做了,你将会继续进行教程。由catkin_create_pkg创造的CMakeList.txt文件将会在下文有关ROS代码的内容介绍。
现在你已经创造了一个新的ROS package,现在构建我们的ROS package。