• 创建一个ROS包


    先前笔者不知道catkin到底是个什么东东,后来终于在官方网站上找到了答案,原来catkin是ROS的一个官方的编译构建系统,是原本的ROS的编译构建系统rosbuild的后继者。catkin的来源有点复杂,我们可以慢慢的讲一下其中的渊源。ROS来源于Willow Garage这个公司,他们希望借助开源的力量,使ROS发扬光大。而在英语中,willow的意思是柳树,catkin是柳絮的意思,为了纪念的作用吧,因而为这个软件命名为catkin。

         这篇博客的主要内容是介绍如何使用catkin创建一个ROS包。一个catkin的包主要有以下几部分组成:(1)必须包括一个package.xml文件,(2)必须包括一个CMakeLists.txt文件,(3)在每一个文件夹下只能有一个包,且包不允许嵌套。一个最简单的包类似于如下的形式:

    my_package/
      CMakeLists.txt
      package.xml

    官网上推荐在catkin工作空间中使用catkin包,当然也可以独立使用catkin包,一个典型的工作空间结构如下:

    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_ws,下面我们来看一下如何在一个工作空间中创建一个包。在创建一个catkin包时需要使用catkin_create_pkg脚本。

    首先进入到目录~/catkin_ws/src下,使用如下命令:

    cd ~/catkin_ws/src

    接着创建一个名字为beginner_tutorials的包,它直接依赖于以下三个包:std_msgs,rospy以及roscpp,使用如下命令:

    catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

    在创建的beginner_tutorials文件夹下可以看到package.xml和CMakeLists.txt。catkin_create_pkg要求您给出包的名字,及选择性的给出所创建的包依赖于哪一个包。他的使用方法如下:

    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

    这样,我们的一个包就创建好了,我们可能会需要对包之间的依赖性做一下解释。我们可以使用rospack命令来查看包之间的依赖关系。查看直接依赖关系:

    rospack depends1 beginner_tutorials

    可以看到,返回的结果正是我们使用catkin_create_pkg时,所使用的参数。我们还可以直接在beginner_tutorials包下的package.xml中查看包的依赖关系。使用命令:

    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>

    在通常情况下,一个包所依赖的包又会依赖许多其它的包,这称为间接依赖。我们使用如下命令来查看rospy依赖的包:

    rospack depends1 rospy

    返回结果如下:

    genpy
    rosgraph
    rosgraph_msgs
    roslib
    std_msgs

    一个包可以有很多的间接依赖关系,我们可以使用命令:

    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

    接下来配置您的package.xml包,我们将会一个标签一个标签的分析这个xml文件。首先是description标签:

    <description>The beginner_tutorials package</description>

    在这个标签中的内容可以改变为任何的内容,不过一般是对这个包的一个简述,尽量简单就行。

    接下来是maintainer标签:

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

    这是一个很重要的标签,因为可以根据这个标签知道它的维护者,另外标签的email属性也是必须的,可有多个maintainer标签。

    接下来是license标签:

    <!-- 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修改为BSD。

    接下来是依赖性的标签:

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

    我们向里面添加了run_depend:

    <run_depend>roscpp</run_depend>
      <run_depend>rospy</run_depend>
      <run_depend>std_msgs</run_depend>

    好了,经过以上的步骤,我们的package.xml已经配置好了。

    注意:其中的<!--这里是注释内容-->,一个package.xml中其实没有多少东西,大部分的都是注释信息。

    总结:这部分主要讲解了ROS包的创建方法和包的依赖性的查询,同时讲解了包的清单文件package.xml的各个标签的意义。

  • 相关阅读:
    WDM驱动加载方式理解
    应用程序与设备对象交换数据的三种方法
    IRP完成例程返回值理解
    关于IoCallDriver使用的疑惑
    Ring0打开其他设备对象三种方式整理
    DPC和ISR的理解
    Windows驱动开发技术详解HelloWDM例子win7下无法安装
    wdk中ramdisk代码解读
    内核编程键盘过滤几种方法思路整理
    IOAPIC重定位中断处理函数思路整理
  • 原文地址:https://www.cnblogs.com/stemon/p/4185475.html
Copyright © 2020-2023  润新知