ROS系列-官方catkin创建工程

Posted 哇小明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS系列-官方catkin创建工程相关的知识,希望对你有一定的参考价值。

原文地址:http://wiki.ros.org/ROS/Tutorials

为catkin创建一个工作空间

这个教程假设你已经装好了catkin,并且初始化好了环境变量。如果你是通过apt-get来装ROS inidgo,下面的命令是source的命令

$ source /opt/ros/indigo/setup.bash

创建一个catkin工作空间:

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

即使这个工作空间是空的(没有任何包在src这个目录下,只有一个CMakeLists.txt)你仍然可以“编译”这个工作空间:

$ cd ~/catkin_ws/
$ catkin_make

catkin_make 这个命令是个很方便的工具用来操作catkin工作空间,如果你查看点钱目录下的文件夹,你会看到‘build’和‘devel’这两个文件夹。在devel文件夹里,你可以看到有几个setup.*sh文件,通过source命令激活这些文件中任何一个文件都会将这个工作空间覆盖到最上层的环境中:

$ source devel/setup.bash

为了确认工作空间被正确的通过sh脚本覆盖,先确认ROS_PACKAGE_PATH的环境变量包含在你自己的目录中,如下:

$ echo $ROS_PACKAGE_PATH
/home/youruser/catkin_ws/src:/opt/ros/kinetic/share

接下来你需要继续学习怎么使用这个工作空间,进行下一个教程的学习:创建一个ROS工作空间。

catkin包室友什么组成?
对于一个安装包catkin包需要考虑并满足到以下几点要求:

The package must contain a catkin compliant package.xml file.必须包含一个兼容的package.xml文件
That package.xml file provides meta information about the package.这个文件提供了包的一些元信息
The package must contain a CMakeLists.txt which uses catkin. If it is a catkin metapackage it must have the relevant boilerplate CMakeLists.txt file.必须包含一个使用catkin的CMakeLists.txt文件或者模板。
There can be no more than one package in each folder.每个文件夹不猛存在超过一个安装包
This means no nested packages nor multiple packages sharing the same directory.多个包不能共享一个文件夹
The simplest possible package might have a structure which looks like this:一个简单的包的目录树如下:  

my_package/
  CMakeLists.txt
  package.xml

Packages in a catkin Workspace

建议使用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

在继续这个教程之前,先按照前面一个教程的方法创建一个空的工作空间。

Creating a catkin Package

加下来会演示如何使用catkin——create_pkg这个脚本去创建一个新的catkin安装包,还有你接下去要如何做。

首先先把环境切换到catkin工作空间的源码目录下:

$ cd ~/catkin_ws/src

现在使用catkin_create_pkg脚本去创建一个新的安装包”beginner_tutorials”,这个包依赖于 std_msgs, roscpp, and rospy:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

这个将会创建一个 beginner_tutorials文件夹,包含了package.xml and a CMakeLists.txt.

catkin_create_pkg会要求你提供一个安装包的名字还有一些可选的依赖包:

This is an example, do not try to run this

catkin_create_pkg [depend1] [depend2] [depend3]

catkin_create_pkg也有一些深层的功能,都在catkin/commands/catkin_create_pkg中有所描述。

编译一个catkin工作空间,然后source者安装文件脚本:

$ cd ~/catkin_ws
$ catkin_make

在工作空间被编译之后,它会创建一个与/opt/ros/$ROSDISTRO_NAME目录中相似的的目录树结构。

把这个工作空间添加到你自己的ROS环境中的话,你需要source自动生成的脚本文件:

$ . ~/catkin_ws/devel/setup.bash

安装包的依赖:
早些时间在使用catkin_create_pkg的时候,需要提供少部分的依赖安装包这些依赖包现在可以用用rospack这个工具来review。

$ rospack depends1 beginner_tutorials 
std_msgs
rospy
roscpp

就像你所看到的,rospack列出了同样的依赖包,跟之前运行catkin_create_pkg时加的参数是一样的。这些依赖关系被保存在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可以递归地确定所有嵌套依赖项
.

$ 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:
这个教程会详细地分析每一个靠catkin_create_pkg生成的文件,还有这些文件的每一部分和如何去客制化这些package。

客制化 package.xml
生成的package.xml 应该在你的新的package里面. 现在逐一分析一下心得package.xml文件:

description tag

首先是 description tag:

<description>The beginner_tutorials package</description>

可以改变描述,但是按照惯例第一句话应该简短,毕竟是要覆盖整个package范围。如果很难用一个句子描述,可能需要分开。

maintainer tags(required)

接下来是 maintainer tag:

<!-- 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是一个重要的tag。因为它可以让别人知道关于这个package可以联系谁。至少一个维护者是必需的,当然可以有很多。维护者的名称进入主体的标签,但也有一个电子邮件属性,应填写:

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

license tags

接下来是license tag(required):

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

你应该选择一个许可证然后填在这里。一些常见的开放源码许可BSD,麻省理工学院,提升软件许可证,GPLv2,GPLv3 LGPLv2.1,LGPLv3。你可以读到一些开放源代码项目。在本教程中我们将使用BSD许可,因为其余的核心ROS组件也使用了。

8   <license>BSD</license>

dependencies tags

下一组标签描述您的软件包的依赖关系。依赖关系分成build_depend、buildtool_depend run_depend test_depend。我们通过std_msgs、roscpp rospy catkin_create_pkg作为参数,所以会像这样的依赖关系:

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

我们所有的依赖关系添加了作为build_depend对我们来说,除了默认buildtool_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>

package.xml

package.xml的最后没有任何comments和tags, 相当的简洁:

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

客制化CMakeLists.txt:
package.xml包含了元信息,它包含元数据信息,是根据你的包量身定制的,你可以准备继续后面的教程。CMakeLists。txt文件由catkin_create_pkg命令创建,关于这部分内容会在下面的教程说明。

Building Packages

只要你的package所有的依赖包都安装好了,接下来就可以编译这个package了。

在接下去的操作前,记得先source环境变量,在ubuntu中可能是这样source的:

$ source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash
$ source /opt/ros/kinetic/setup.bash             (For Kinetic for instance)

使用 catkin_make
catkin_make 是一个命令工具用来简化catkin的标准工作流程的,你可以想象一下catkin_make工具可以调用cmake和make来完成编译。
用法:

In a catkin workspace

$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

For people who are unfamiliar with the standard CMake workflow, it breaks down as follows:
如果有些人对标准的cmake编译流程不太熟悉,可以把上述命令拆成下面的步骤执行:

Note: If you run the below commands it will not work, as this is just an example of how CMake generally works.

In a CMake project

$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install  # (optionally)

这个操作流程适用于每个CMake项目,而catkin可以在一个工作空间编译多个项目,如下操作:

In a catkin workspace

$ catkin_make
$ catkin_make install  # (optionally)

上面的命令将会编译任何catkin项目,只要是能在src文件夹中找到。在此之前REP128设定的建议。如果你的源代码是在不同的地方,比如在my_src文件夹下,那么catkin_make命令可以这样用:

Note: If you run the below commands it will not work, as the directory my_src does not exist.

In a catkin workspace

$ catkin_make --source my_src
$ catkin_make install --source my_src  # (optionally)

For more advanced uses of catkin_make see the documentation: catkin/commands/catkin_make

编译Package

看到这页想编译你自己代码的读者,可以事先学习一下C++/Python语言,因为你将会修改CMakeList.txt配置问题。
到这边你应该有一个catkin的工作空间和一个新的catkin package—–beginner_tutorials。进入catkin工作空间,你可以看到src文件夹:

$ cd ~/catkin_ws/
$ ls src
beginner_tutorials/  CMakeLists.txt@

你在src文件夹下可以看到之前用catkin_create_pkg命令创建的额文件夹–beginner_tutorials,我们现在可以用catkin_make命令来编译这个package:

$ catkin_make

这个命令的log会像是cmake和make的过程,如下所示:

Base path: /home/user/catkin_ws
Source space: /home/user/catkin_ws/src
Build space: /home/user/catkin_ws/build
Devel space: /home/user/catkin_ws/devel
Install space: /home/user/catkin_ws/install
####
#### Running command: "cmake /home/user/catkin_ws/src
-DCATKIN_DEVEL_PREFIX=/home/user/catkin_ws/devel
-DCMAKE_INSTALL_PREFIX=/home/user/catkin_ws/install" in "/home/user/catkin_ws/build"
####
-- The C compiler identification is GNU 4.2.1
-- The CXX compiler identification is Clang 4.0.0
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/kinetic
-- This workspace overlays: /opt/ros/kinetic
-- Found PythonInterp: /usr/bin/python (found version "2.7.1") 
-- Found PY_em: /usr/lib/python2.7/dist-packages/em.pyc
-- Found gtest: gtests will be built
-- catkin 0.5.51
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/catkin_ws/build
####
#### Running command: "make -j4" in "/home/user/catkin_ws/build"
####

注意,catkin_make最开始显示是每个space所使用的的路径。REP128和文档中描述的space:wiki:catkin/workspace。比较重要的需要注意的是,由于这些默认值,几个文件夹已经被创建在你的工作区。用ls看一看:

$ ls
build
devel
src

build文件夹是build空间的默认位置,另外也是cmake和make配置并编译你的package的所在目录。devel文件夹是devel空间的默认路径,也就是在你安装你的package之前你的执行文件和库文件的所在的位置。

以上是关于ROS系列-官方catkin创建工程的主要内容,如果未能解决你的问题,请参考以下文章

Ros系列_学习一

如何用cmake搭建ros工程,make编译而不是catkin_make

ROS系统 创建工作空间与功能包

详解ROS文件系统

创建一个ros功能包

ros学习笔记11——ROS中catkin_make install的用法