ROS入坑 创建与编译ROS程序包

创建ROS程序包

  • 一个catkin程序包packages由什么组成?
  • 在catkin工作空间中的程序包
  • 创建一个catkin程序包
  • 程序包依赖关系
    • 一级依赖
    • 间接依赖
    • 自定义你的程序包
    • 自定义 package.xml
      • 描述标签
      • 维护者标签
      • 许可标签
      • 依赖项标签
      • 最后完成简单清爽的package.xml
    • 自定义 CMakeLists.txt
    • 编译ROS程序包
      • 使用 catkin_make
      • 开始编译你的程序包
  • 参考文档



写个自己学习的笔记,方便回查



一个catkin程序包packages由什么组成?

一个程序包要想称为catkin程序包必须符合以下要求:

  • 程序包必须包含catkin compliant package.xml文件

    • 这个package.xml文件提供有关程序包的元信息。
  • 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。???

  • 每个目录下只能有一个程序包。

    • 这意味着在同一个目录下不能有嵌套的或者多个程序包存在。

最简单的程序包也许看起来就像这样:

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程序包

本部分教程将演示如何使用catkin_create_pkg命令来创建一个新的catkin程序包以及创建之后都能做些什么.

我为了方便学习, 先装一个tree命令好打印文件目录结构

sudo apt-get install tree
cd ~catkin_ws 
tree
或者
tree -L N     N 为子文件夹显示到第几层

可以看到整个工作空间的树状文件结构

ROS入坑 创建与编译ROS程序包_第1张图片

首先切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下:

cd ~/catkin_ws/src
现在使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

这将会创建一个名为beginner_tutorials的文件夹,这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件,这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。 如图:
ROS入坑 创建与编译ROS程序包_第2张图片
catkin_create_pkg命令会要求你输入package_name,如果有需要你还可以在后面添加一些需要依赖的其它程序包, 下面是命令的示例:

# 只是示范不要运行
catkin_create_pkg  [depend1] [depend2] [depend3]

程序包依赖关系

一级依赖

之前在使用catkin_create_pkg命令时提供了几个程序包作为依赖包,现在我们可以使用rospack命令工具来查看一级依赖包。

rospack depends1 beginner_tutorials 

在这里插入图片描述

就像你看到的,rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖包随后保存在 package.xml 文件中。 查看一下:

roscd beginner_tutorials
cat package.xml

在这里插入图片描述

间接依赖

在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。

rospack depends1 rospy

ROS入坑 创建与编译ROS程序包_第3张图片
一个程序包还可以有好几个间接的依赖包,幸运的是使用rospack可以递归检测出所有的依赖包。这里注意是depends 而非 depends1

rospack depends beginner_tutorials

ROS入坑 创建与编译ROS程序包_第4张图片

自定义你的程序包

本部分教程将剖析catkin_create_pkg命令生成的每个文件并详细描述这些文件的组成部分以及如何自定义这些文件。

自定义 package.xml

自动生成的package.xml文件应该在你的新程序包中。现在让我们一起来看看新生成的package.xml文件以及每一个需要你注意的标签元素。

先查看一下xml文件

~/Desktop/catkin_ws/src/beginner_tutorials$ gedit package.xml

描述标签

首先更新描述标签:

The beginner_tutorials package</description>

在这里插入图片描述

将描述信息修改为任何你喜欢的内容,但是按照约定第一句话应该简短一些,因为它覆盖了程序包的范围。如果用一句话难以描述完全那就需要换行了。
在这里插入图片描述

维护者标签

在这里插入图片描述
这是package.xml中要求填写的一个重要标签,因为它能够让其他人联系到程序包的相关人员。至少需要填写一个维护者名称,但如果有需要的话你可以添加多个。除了在标签里面填写维护者的名称外,还应该在标签的email属性中填写邮箱地址:
在这里插入图片描述

许可标签

在这里插入图片描述
你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。你可以在Open Source Initiative中阅读其中的若干个许可协议的相关信息。对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议.

依赖项标签

ROS入坑 创建与编译ROS程序包_第5张图片
除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到exec_depend标签中

最后完成简单清爽的package.xml

ROS入坑 创建与编译ROS程序包_第6张图片

自定义 CMakeLists.txt

编译ROS程序包

老规矩, 记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下:

source /opt/ros/melodic/setup.bash

使用 catkin_make

以下代码皆无效因为只做讲解

catkin_make 是一个命令行工具,它简化了catkin的标准工作流程。你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。

# 在catkin工作空间下
catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

CMake标准工作流程主要可以分为以下几个步骤:

# 在一个CMake项目里
mkdir build
cd build
cmake ..
make
make install  # (可选)

每个CMake工程在编译时都会执行这个操作过程。相反,多个catkin项目可以放在工作空间中一起编译,工作流程如下:

# In a catkin workspace
catkin_make
catkin_make install  # (可选)

上述命令会编译src文件夹下的所有catkin工程。想更深入了解请参考REP128。 如果你的源代码不在默认工作空间中(~/catkin_ws/src),比如说存放在了my_src中,那么你可以这样来使用catkin_make:

# In a catkin workspace
catkin_make --source my_src
catkin_make install --source my_src  # (optionally)

对于catkin_make更高级的使用方法,请参考catkin/commands/catkin_make

开始编译你的程序包

按照之前的创建一个ROS程序包教程,你应该已经创建好了一个catkin 工作空间 和一个名为beginner_tutorials的catkin 程序包。现在切换到catkin workspace 并查看src文件夹:

cd ~/catkin_ws/
ls src

ROS入坑 创建与编译ROS程序包_第7张图片
你可以看到一个名为beginner_tutorials的文件夹,这就是你在之前的catkin_create_pkg 教程里创建的。现在我们可以使用catkin_make来编译它了:

catkin_make

报错:

'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

把 之前修改的package.xml文件中的中文(只用标签中的就好,注释的无所谓) 改成英文再编译

catkin_make

ROS入坑 创建与编译ROS程序包_第8张图片
编译成功.

catkin_make首先输出它所使用到的每个空间所在的路径。更多关于空间的信息,请参考REP128和catkin/workspaces。需要注意的是由于这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成了,使用ls查看:

ls

在这里插入图片描述
build目录是build space的默认所在位置,同时cmake 和 make也是在这里被调用来配置并编译你的程序包。devel 目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件库文件的地方。

参考文档

Ros官方

你可能感兴趣的:(ROS机器人入门)