创建ROS的Package(功能包)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建ROS的Package(功能包)相关的知识,希望对你有一定的参考价值。

本文讲如何用catkin创建一个ROS的package

1. catkin package的组成:一定要包含CMakeLists.txt及package.xml文件

my_package/
  CMakeLists.txt
  package.xml

此外,每个package必须要有他自己的文件夹。

2. 推荐使用catkin workspace来处理catkin package

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

3. 创建catkin package

使用catkin_create_pkg脚本来创建新的catkin package:

(1)切换source space目录至之前创建的catkin workspace

$ cd ~/catkin_ws/src

(2)用catkin_create_pkg创建一个catkin package,名字是beginner_tutorials,且依赖于已有的功能包std_msgs,roscpp,rospy,后者称为dependency

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

4. build 这个catkin workspace, source 这个setup文件

build方法:

$ cd ~/catkin_ws
$ catkin_make

source方法:

$ . ~/catkin_ws/devel/setup.bash

5. package dependencies 

(1)用rospack查看1阶dependencies:

$ rospack depends1 beginner_tutorials 

package.xml中储存了package的dependencies信息

$ roscd beginner_tutorials
$ cat package.xml

(2)用rospack查看间接(高阶)的dependencies:

$ rospack depends beginner_tutorials

6. customize(自定义、定制) package

  6.1 自定义package.xml

    (1) 描述标签(description tag):尽可能短

   5   <description>The beginner_tutorials package</description>

    (2)Maintainer 标签:必须有,而且非常重要,至少要有一条。作用是让别人知道有关这个package该联系谁。

Toggle line numbers

   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>

    (3)许可证标签(license tag):有很多开源许可证,我们这里使用BSD,因为许多ROS核心部件都是用的它。  

  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>

    (4)dependencies标签: dependencies标签可分为build_depend, buildtool_depend, exec_depend, test_depend。因为我们使用了std_msgs, roscpp, and rospy,所以该标签应为:

  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   <!--   <build_depend>genmsg</build_depend> -->
  32   <!-- Use buildtool_depend for build tool packages: -->
  33   <!--   <buildtool_depend>catkin</buildtool_depend> -->
  34   <!-- Use exec_depend for packages you need at runtime: -->
  35   <!--   <exec_depend>python-yaml</exec_depend> -->
  36   <!-- Use test_depend for packages you need only for testing: -->
  37   <!--   <test_depend>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和run的时候使用所有特定的dependencies,因此我们还要增加exec_depend标签,最后如下:

  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>

    (5) 最终的package.xml:下面是不含有评论和未使用tag的package.xml文件,非常concise(简明)

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

  6.2 自定义CMakeLists.txt

以上是关于创建ROS的Package(功能包)的主要内容,如果未能解决你的问题,请参考以下文章

ROS运行管理---ROS元功能包(metapackage)

在ROS中创建点云并可视化

ROS 消息通讯——动作action的来龙去脉

二进制包 vs. 源代码包

ROS系统解决找不到用户工作空间下的程序包的问题——E:No such package

ros之package.xml文件