ROS学习笔记三:创建ROS软件包

,# ROS学习笔记三:创建ROS软件包

catkin软件包的组成

一个软件包必须满足如下条件才能被称之为catkin软件包:

  • 这个软件包必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信息。
  • 这个软件包必须包含一个CMakeLists.txt文件,并且采用catkin。
  • 在每个文件夹中可能只有一个软件包,这表明没有相互依赖的软件包共享相同的目录。
    最简单的可能的软件包可能有如下文件结构:
my_package/
CMakeLists.txt
package.xml

catkin工作空间中的软件包

推荐利用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软件包

利用catkin_create_pkg命令创建一个新的catkin软件包。

cd ~/catkin/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

依赖于std_msgs、rospy、roscpp在src目录下创建一个名为beginner_tutorials的catkin软件包,这将会创建一个名称为beginner_tutorials的包含CMakeLists.txt和package.xml文件的文件夹。catkin_create_pkg命令要求提供软件包名称和可选择的一系列软件包的依赖。
注意:软件包命名惯例是—以小写字母开头,只能包含小写字母和数字以及下划线,不符合规则的软件包名称将不能编译通过。

mountzf@ubuntu:~/catkin_ws/src/beginner_tutorials$ tree
.
├── CMakeLists.txt
├── include
│ └── beginner_tutorials
├── package.xml
└── src

同时也会创建beginner_tutorials软件包的src文件夹和include文件夹,但是此时都是空的。

编译catkin工作空间

创建完成软件包之后,需要在工作空间中进行编译:

cd ~/catkin_ws
catkin_make
mountzf@ubuntu:~/catkin_ws$ catkin_make
Base path: /home/mountzf/catkin_ws
Source space: /home/mountzf/catkin_ws/src
Build space: /home/mountzf/catkin_ws/build
Devel space: /home/mountzf/catkin_ws/devel
Install space: /home/mountzf/catkin_ws/install
####
#### Running command: "cmake /home/mountzf/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/mountzf/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/mountzf/catkin_ws/install -G Unix Makefiles" in "/home/mountzf/catkin_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/mountzf/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/indigo
-- This workspace overlays: /opt/ros/indigo
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/mountzf/catkin_ws/build/test_results
-- Found gtest sources under '/usr/src/gtest': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.6.18
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mountzf/catkin_ws/build
####
#### Running command: "make -j4 -l4" in "/home/mountzf/catkin_ws/build"
####

根据如上编译信息,可以知道:

  • 前面几行是编译文件的基本信息,base path, source sapce, build space, devel space, install space.
  • 后续研究明白了再记录。
    在编译完成工作空间之后,在devel文件夹中产生了一系列的和/opt/ros/indigo目录中结构相似的文件,通过读取devel文件夹中的.*sh文件来将软件包的工作空间添加到环境变量当中。
. ~/catkin_ws/devel/setup.bash

软件包依赖

直接依赖

在前面利用catkin_create_pkg命令的时候,在选项中提供了一些依赖,利用rospack工具可以查看这些直接依赖。

rospack depends1 beginner_tutorials
std_msgs
rospy
roscpp

注意上面的是depends1(是阿拉伯数字1,而不是小写字母l)。可以看出rospack工具列出了在使用catkin_create_pkg命令的时候提供的依赖,这些信息存储在packa.xml文件中,可以cat package.xml查看。

间接依赖

在很多情况下,我们会遇到依赖的依赖,即间接依赖。例如beginner_tutorials的依赖文件rospy也有其他依赖。

rospack depends1 rospy
genpy
rosgraph
rosgraph_msgs
roslib
std_msgs

如果我们使用rospack depends(没有阿拉伯数字1),则会列出catkin软件包的所有依赖文件。

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

定制catkin软件包

主要按照自己的需要更改package.xml文件和CMakeLists.txt文件。

定制package.xml文件

描述部分description

<description>The beginner_tutorials package</description>

描述软件包的概述,应该简短精要。

维护者部分maintainer

<!-- One maintainer tag required, multiple allowed, one person per tag -->
 <!-- Example:  -->
 <!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
 <maintainer email="[email protected]">user</maintainer>
 ```
 至少需要一个维护者的信息,但是也可以添加多个。维护者的名字在类别的内容之中,邮箱在类别的属性之中。
#### 许可证部分license
```bash
<!-- 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>




<div class="se-preview-section-delimiter"></div>

一些常见的软件使用BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv等,在这里使用BSD,因为ROS的其他核心部件已经使用了BSD证书。

依赖部分dependencies

依赖在这里被分为build_depend, buildtool_depend, run_depend, test_depend, 更加详细的信息见此link。当前package.xml中的依赖部分如下:

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




<div class="se-preview-section-delimiter"></div>

我们想在编译和运行的时候都能够获得这些依赖,所以需要在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>




<div class="se-preview-section-delimiter"></div>

修改后的package.xml

<?xml version="1.0"?>
<package>
  <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>

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

</package>

定制CMakelists.txt文件

在下一部分编译ROS软件包中再来修改CMakelist.txt文件。

总结

  • catkin软件包必要组成:package.xml和CMakeList.txt文件。
  • 创建catkin软件包:catkin_create_pkg命令创建一个新的catkin软件包。
  • 编译catkin工作空间:catkin_make命令编译catkin工作空间。
  • 查看ROS软件包依赖:rospack depends1查看直接依赖,rospack depends查看间接依赖。
  • 定制catkin软件包:修改文件package.xml和CMakeLists.txt。

祝枫
2016年7月21日于深圳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章