蹄牛操作系统TINIUX
ROS中文社区
查看: 13507|回复: 23

[跟我学ROS]3.创建ROS系统中的catkin功能包

  [复制链接]
发表于 2013-5-12 22:47:25 | 显示全部楼层 |阅读模式
本帖最后由 时飞 于 2013-5-13 21:37 编辑

描述:这篇文章介绍如何用roscreate-pkg或catkin创建一个新的功能包,并用rospack列出功能包的依赖关系。

1、catkin功能包的组成

要组成一个catkin功能包,必须满足如下相关条件:
•        功能包必须包含一个catkin兼容的注释文件package.xml。
o        package.xml文件提供有关功能包的元信息;
•        功能包必须包含采用catkin的CmakeLists.txt文件
o        例外情况是metapackages不必包含CmakeLists.txt
•        在一个文件夹中不允许出现多个功能包
o        这意味着多个功能包不能共享一个路径,也不允许功能包之间相互嵌套包;

最简单的功能包组成如下所示:
•        my_package/
•          CMakeLists.txt
•          package.xml

2、catkin Workspace里的功能包
推荐在catkin workspace下生成并编译catkin 功能包,当然,catkin功能包也可单独编译。catkin  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

在创建catkin功能包之前,我们先创建一个空的catkin workspace,命名为catkin_ws,接下来的练习都在这个catkin_ws下进行;

3、创建catkin功能包

接下来将会阐述如何利用catkin_create_pkg命令工具生成一个新的catkin功能包,并介绍catkin功能包的用途;

首先,改变路径到catkin workspace的src目录内;
[Bash shell] 纯文本查看 复制代码
# You should have created this in the Creating a Workspace Tutorial
$ cd ~/catkin_ws/src

现在使用catkin_create_pkg命令创建名字为beginner_tutorials的功能包,并设置这个新功能包依赖于std_msg,roscpp和rospy;
[Bash shell] 纯文本查看 复制代码
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

这将会创建一个beginner_tutorials的文件夹,这个文件夹内会自动生成package.xml文件和CmakeLists.txt文件,这个两个文件会依据你对catin_create_pkg命令的设置参数填写一些信息;
Catkin_create_pkg后面的参数需包含功能包的名字及所创建功能包的一些依赖选项:
[Bash shell] 纯文本查看 复制代码
# This is an example, do not try to run this
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

4、功能包依赖关系

4.1 直接(一级)依赖关系

在使用catkin_create_pkg时,一些依赖的功能包需要提供出来,这些直接(一级)依赖关系可以通过命令工具rospack查看;
[Bash shell] 纯文本查看 复制代码
$ rospack depends1 beginner_tutorials 

•        std_msgs
•        rospy
•        roscpp

就像看到的一样,rospack列出了用catkin_create_pkg创建时设置的依赖功能包。这些依赖功能包信息被保存在package.xml文件内;
[Bash shell] 纯文本查看 复制代码
$ 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>

4.2 间接依赖关系

在很多情况下,依赖功能包本身也需要自己的依赖功能包,例如,rospy就会需要一些依赖功能包;
[Bash shell] 纯文本查看 复制代码
$ rospack depends1 rospy

•        genpy
•        rosgraph
•        rosgraph_msgs
•        roslib
•        std_msgs

一个功能包会需要很多间接的依赖功能包,幸运的是,rospack可以次序检测到所有嵌套的依赖功能包;
[Bash shell] 纯文本查看 复制代码
$ rospack depends beginner_tutorials

cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
catkin
rospack
roslib
rospy

5、 设置生成的功能包

这一部分将会逐行查看catkin_create_pkg自动生成的各个文件,并根据需要修正它们;

5.1 设置文件package.xml

在你新创建的功能包内会产生一个package.xml文件,现在我们查看一下文件package.xml,看哪些元素是我们尤其要关注的;

5.1.1 描述标签

首先需要更新的是描述标签:

      <description>The beginner_tutorials package</description>

根据你的需要,改变这些描述信息,顺便提示一下,最好采用一句话描述这个功能包的用途信息;

5.1.2 维护者标签

接下来我们可以看到维护者标签:

      <!-- One maintainer tag required, multiple allowed, one person per tag -->
      <!-- Example:  -->
      <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
      <maintainer email="user@todo.todo">user</maintainer>

这在package.xml文件里是一个非常重要的标签,它可以让其它人知道维护这个功能包的联系人信息。至少提供一个维护者信息,当然,如果需要,你可以添加任何一个维护者的信息。维护者的标签处于body的位置,属性里面的email信息也需要填写完整:

      <maintainer email="you@yourdomain.tld">Your Name</maintainer>

5.1.3 许可标签

接下来是许可标签,这个标签也是必要的:

     <!-- One license tag required, multiple allowed, one license per tag -->
     <!-- Commonly used license strings: -->
     <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
     <license>TODO</license>

可以选择一种license填写到里面。常用的license信息为BSD,MIT,Boost Software License,GPLv2,GPLv3,LGPLv2.1和LGPLv3等,针对这篇文章,我们使用BSD许可。

      <license>BSD</license>

5.1.4 依赖功能包标签

接下一组标签是描述这个功能包的依赖关系的。这些依赖关系被build_depend,buildtool_depend,run_depend,test_depend等分隔开,有关这些标签的更详细的描述可以查看catkin dependencies。因为我们设置了catkin_create_pkg命令的std_msg,roscpp,rospy参数,因此可以看到下面的依赖项:

     <!-- The *_depend tags are used to specify dependencies -->
     <!-- Dependencies can be catkin packages or system dependencies -->
     <!-- Examples: -->
     <!-- Use build_depend for packages you need at compile time: -->
     <!--   <build_depend>genmsg</build_depend> -->
     <!-- Use buildtool_depend for build tool packages: -->
     <!--   <buildtool_depend>catkin</buildtool_depend> -->
     <!-- Use run_depend for packages you need at runtime: -->
     <!--   <run_depend>python-yaml</run_depend> -->
     <!-- Use test_depend for packages you need only for testing: -->
     <!--   <test_depend>gtest</test_depend> -->
     <buildtool_depend>catkin</buildtool_depend>
     <build_depend>roscpp</build_depend>
     <build_depend>rospy</build_depend>
     <build_depend>std_msgs</build_depend>
在catkin功能包里,除了默认的buildtool_dependon,所有列出的依赖包被作为build_depend添加进来。我们希望在编译和运行时均指定相关的依赖包,因此我们为每一个依赖包添加一下run_depend标签:

     <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>

5.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>

6、设置生成的CMakeLists.txt文件

既然包含元信息的package.xml已经根据需要做了修改,你已经做好了练习的准备了吧。Catkin_create_pkg产生的文件CMakeLists.txt将在以后编译功能包时进行修正完善;

英文文档位置: http://www.ros.org/wiki/ROS/Tutorials/CreatingPackage

注:欢迎你转载本篇文章,时飞提醒你转载时请注明出处!

回复

使用道具 举报

发表于 2013-8-8 16:57:03 | 显示全部楼层
在执行完$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp这段命令后,beginner_tutorials并没有列入到packages lists中,后续命令会提示并没有找到beginner_tutorials这样的package,请问这是为什么?求大神解答。。
回复 支持 反对

使用道具 举报

发表于 2013-8-12 15:56:08 | 显示全部楼层
[AppleScript] 纯文本查看 复制代码
export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH

自己弄好了。。。加入ROS_PACKAGE_PATH变量就好了。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-24 11:58:18 | 显示全部楼层
以前版本的manifest.xml被package.xml替换了?不知道有没有向前兼容。
回复 支持 反对

使用道具 举报

发表于 2013-11-16 20:49:15 | 显示全部楼层
isnow4ever 发表于 2013-8-12 15:56
[mw_shl_code=applescript,true]export ROS_PACKAGE_PATH=~/catkin_ws/srcROS_PACKAGE_PATH[/mw_shl_code ...

您好,我看了你的答案确实解决了问题。但是我发现我把原来的终端杀死,重开一个终端的话,又要像您说的那样重新设置一下环境变量,有没有一劳永逸的方法呢??
回复 支持 反对

使用道具 举报

发表于 2013-11-16 20:59:45 | 显示全部楼层
本帖最后由 xmfbit 于 2013-11-16 21:01 编辑

额~~~好吧~~~我自己解决了!http://www.cnblogs.com/sleeper-qp/archive/2013/04/17/3026938.html参考这个网站上的第一种思路,把ROS_PACKAGE_PATH加到bash.rc文件里面就行了~~~就像这样:

[Bash shell] 纯文本查看 复制代码
export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH
回复 支持 反对

使用道具 举报

发表于 2014-6-18 16:18:31 | 显示全部楼层
为什么我系统使用直接依赖关系指令时,不能显示依赖文件
$ rospack depends1 beginner_tutorials

•        std_msgs
•        rospy
•        roscpp
提示
[rospack] Error: no such package beginner_tutorials
有人遇到过吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-18 19:54:04 | 显示全部楼层
有些功能包是做练习时自己创建的,请从头开始看起,逐步操作
回复 支持 反对

使用道具 举报

发表于 2015-7-31 09:36:17 | 显示全部楼层
终于找到组织了,网上国外论坛回答的牛头不对马嘴的
回复 支持 反对

使用道具 举报

发表于 2015-8-19 19:20:46 | 显示全部楼层
新手压力山大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|智能硬件开发社区 ( 京ICP备14010787号 )

GMT+8, 2019-4-25 03:56 , Processed in 0.100903 second(s), 16 queries .

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表