Note: This tutorial assumes that you have completed the previous tutorials: navigating the ROS filesystem.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Creating a ROS Package

Description: This tutorial covers using roscreate-pkg to create a new package, and rospack to list package dependencies.

Tutorial Level: BEGINNER

Next Tutorial: Building a ROS package

本文介绍如何使用roscreate-pkg 创建一个新的package, 并使用 rospack 列出package中文件的依赖关系

如何使用roscreate

在我们创建一个package之前,先看下如何使用 roscreate-pkg 命令行工具,该命令用于创建一个新的ROS package。 所有的 ROS packages 包含很多相似的文件 : manifests, CMakeLists.txt, mainpage.dox 和 Makefiles。roscreate-pkg免除手工创建package的繁琐的步骤及由于键盘输入可能带来的错误。

在当前目录创建一个新的package的命令如下

$ roscreate-pkg [package_name]

可以同时指明该package所依赖的其它package:

$ roscreate-pkg [package_name] [depend1] [depend2] [depend3]

创建新的ROS Package

现在我们在home目录下或者自定义的目录下创建名为 beginner_tutorials 的package,并使它依赖 std_msgs, roscpp, 和 rospy,这三个package都是ROS的公共通用的package。

切换到目录 ~/ros_workspace 并创建package:

$ cd ~/ros_workspace
$ roscreate-pkg beginner_tutorials std_msgs rospy roscpp

然后在控制台会看到如下相似的返回结果:

  • Creating package directory ~/ros_workspace/beginner_tutorials
    Creating include directory ~/ros_workspace/beginner_tutorials/include/beginner_tutorials
    Creating cpp source directory ~/ros/ros_tutorials/beginner_tutorials/src
    Creating python source directory ~/ros_workspace/beginner_tutorials/src/beginner_tutorials
    Creating package file ~/ros_workspace/beginner_tutorials/Makefile
    Creating package file ~/ros_workspace/beginner_tutorials/manifest.xml
    Creating package file ~/ros_workspace/beginner_tutorials/CMakeLists.txt
    Creating package file ~/ros_workspace/beginner_tutorials/mainpage.dox
    
    Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package

我们可以查看文件 beginner_tutorials/manifest.xml。 manifests 文件起到很重要的作用,在ROS中它定义package如何创建、运行和归档。下面我们验证并确认ROS能查找到我们这个新的package。当目录路径和ROS_PACKAGE_PATH环境变量变化时,通常使用命令 rospack profile 来使得这个新的目录能够在ROS中被查找到:

$ rospack profile
$ rospack find beginner_tutorials 
  • YOUR_PACKAGE_PATH/beginner_tutorials

如果没有列出package的路径说明ROS不能找到这个新的package,需要查看环境变量 ROS_PACKAGE_PATH是否存在问题。仔细查阅ROS安装指南可以找出问题所在。如果已经创建或者添加已经存在的package路径,则需要修改环境变量ROS_PACKAGE_PATH包含进相应的路径。 在ros_workspace 目录中再次执行source setup.sh命令。

例如.

$ roscd beginner_tutorials 
$ pwd
  • YOUR_PACKAGE_PATH/beginner_tutorials

Package互相依赖的优先顺序

使用命令roscreate-pkg 创建package时可以作为参数指明所依赖的其它package,这个依赖的先后顺序可以通过命令 rospack 来查看。

$ rospack depends1 beginner_tutorials 
  • std_msgs
    rospy
    roscpp

如同你看到的返回结果, rospack 命令列出了所有依赖的package,这些package就是运行命令roscreate-pkg 时所带的参数。 一个package的所有依赖项保存在文件 manifest 中。 下面的命令查看 manifest 文件.

$ roscd beginner_tutorials
$ cat manifest.xml
  • <package>
    
    ...
    
      <depend package="std_msgs"/>
      <depend package="rospy"/>
      <depend package="roscpp"/>
    
    </package>

package 间接依赖关系

大多数情况下,一个package作为其它package的依赖项,同时也有自己的依赖项(package)。例如, rospy 也有它自己的依赖项(package).

$ rospack depends1 rospy
  • roslib
    roslang

一个 package 可以由间接的依赖项。命令 rospack 可以查看这些依赖项.

$ rospack depends beginner_tutorials
  • rospack
    roslib
    std_msgs
    rosgraph_msgs
    rosbuild
    roslang
    rospy
    cpp_common
    roscpp_traits
    rostime
    roscpp_serialization
    xmlrpcpp
    rosconsole
    roscpp

ROS 库文件

也许你会问前面例子中的 rospyroscpp 依赖哪些package呢? rospyroscpp 是ROS的一组库文件 Client Libraries. 这些库文件允许不同的编程语言来调用以便能够在ROS框架中数据交换. rospy 是Python用的库文件. roscpp 是针对C++用的库文件.

Review

Lets just list some of the commands we've used so far:

  • roscreate-pkg = ros+create-pkg : generates all the files needed to create a ROS package
  • rospack = ros+pack(age) : provides information related to ROS packages
  • rosstack = ros+stack : provides information related to ROS stacks

Now that you've made a new ROS package, let's build our ROS package.

Wiki: roschina/教程/创建Package (last edited 2012-02-22 07:12:15 by LuZhiShen)