Udacity机器人软件工程师课程笔记(九)-ROS-Catkin包、工作空间和目录结构

Catkin包和工作空间

1.Carkin包简介

Catkin是ROS的官方构建系统,也是原始ROS构建系统rosbuild的继承者。catkin结合了CMake宏和Python脚本,在CMake的正常工作流程之上提供了一些功能。 被设计为比更传统的rosbuild,允许更好的分发包、更好的交叉编译的支持,以及更好的便携性。catkin的工作流程与CMake的工作流程非常相似,但增加了对自动“查找包”基础架构的支持,同时还构建了多个依赖项目。

ROS 的早期开发者 Willow Garage根据办公室周围柳树上的花取了 catkin 这个名字。

Catkin 工作空间本质上是一个目录,我们可以在这里编写、修改并安装 catkin 包。通常当我们开发基于 ROS 的机器人或项目时,需要在单独的工作空间里完成。

这个单独的工作空间需要保存大量不同的 catkin 包,所有 ROS 软件组件都以 catkin 包的形式组织并发布。和工作空间类似 catkin 包,不过是目录包括了大量资源,这些资源在一起就构成了一些有用的模块。Catkin 包可能包括节点的源代码,有用的脚本、配置文件等等。

接下来的部分包括

  1. 如何创建 catkin 工作空间
  2. 向其添加包
  3. 管理包内部的依赖关系
  4. 编译所有内容

ROS软件被组织并分发到包中,这些包可能包含ROS节点,库,数据集等的源代码。每个包还包含一个带有构建指令的文件 - CMakeLists.txt文件 - 以及一个包含有关包的信息的package.xml文件。软件包使ROS用户能够以方便且可重用的格式组织有用的功能。

2.Catkin工作区

catkin工作区是一个顶级目录,您可以在其中构建,安装和修改catkin包。工作区包含项目的所有包,以及catkin系统在从源代码构建可执行文件和其他目标时使用的其他几个目录。

3.创建Catkin工作区

第1步:mkdir -p ~/catkin_ws / src

首先,创建顶级catkin工作空间目录和名为src的子目录。顶级目录的名称是任意的,但通常被称为catkin_ws(catkin_workspace的缩写),因此我们将遵循此约定。可以使用一个命令创建这两个目录:

$ mkdir -p ~/catkin_ws/src

第2步:cd ~/ catkin_ws / src

接下来,使用cd命令导航到该src目录:

$ cd ~/catkin_ws/src

第3步:catkin_init_workspace

初始化catkin工作区:

$ catkin_init_workspace

列出当前目录的内容

$ ls -l

CMakeLists.txt已创建符号链接(symbol link ) /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake

第4步:cd~ / catkin_ws

返回顶级目录,

$ cd ~/catkin_ws

第5步:catkin_make

并构建工作区。

$ catkin_make

若想深入了解catkin构建系统的内容请参考ROS维基。
完成后,应该在输出结尾处看到以下行:

-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robo/catkin_ws/build
####
#### Running command: "make -j2 -l2" in "/home/robo/catkin_ws/build"
####
robo@robo-virtual-machine:~/catkin_ws$

再次使用ls命令

$ ls

在这里插入图片描述
现在有两个新目录:build和devel。build目录是C ++包的构建空间,在大多数情况下我们不会与它进行交互。devel目录确实包含一些有趣的内容,一个名为的文件setup.bash。必须在使用catkin工作区之前获取此setup.bash脚本。

4.catkin工作区常规目录结构:

(1)推荐的布局

推荐的开发布局如下

workspace_folder/        --工作区
  src/                   --source space	来源空间
    CMakeLists.txt       --这是与catkin / cmake / toplevel.cmake的符号链接
    package_1/
      CMakeLists.txt
      package.xml
    ...
    package_n/
      CATKIN_IGNORE      --可选地放置此空标记文件以排除处理package_n的CMakeLists.txt
      CMakeLists.txt
      package.xml
  build/                 --BUILD SPACE(这是调用构建系统的地方,不一定在工作区内)
    CATKIN_IGNORE        --在抓取包时标记要忽略的文件夹(当源空间位于工作空间的根目录时,文件是emtpy时需要)
  devel/                 --DEVEL SPACE(目标转到此处,可参数化,但默认为Build Space的同行)
    bin/
    etc/
    include/
    lib/
    share/
    .catkin              --将文件夹标记为开发空间(该文件包含以分号分隔的源空间路径列表)
    env.bash
    setup.bash
    setup.sh
    ...
  install/               --INSTALL SPACE(这是测试安装的已安装目标,不一定在工作区内)
    bin/
    etc/
    include/
    lib/
    share/
    .catkin              --将文件夹标记为安装空间(该文件为emtpy)
    env.bash
    setup.bash
    setup.sh
    ...

(2)工作区的元素

在谈论开发中使用的工作空间时,有几个名称需要注意

工作区(Workspace)

工作区是您将在其中积极开发的文件夹。将文件保存在具有连接开发的文件夹中有助于保持开发模型的分离。
源空间(Source Space)
源空间是catkin在构建时期望查找包的文件夹。此文件夹很容易识别,因为它是从catkin项目链接到toplevel.cmake的位置。
每个需要从源代码编译的catkin项目都应该这个目录中的子目录中检出。包可以递归方式找到,因此它们不必是直接子文件夹。

构造空间(Build Space)

构造空间是调用cmake的文件夹,并生成诸如CMakeCache之类的构件。
遵循推荐的布局时,典型的cmake调用将如下所示。

cmake ../src
开发空间(Development)

开发空间是catkin生成二进制文件和运行时库的地方,这些库在安装之前是可执行的。此文件夹将是FHS布局的近似值,但仅包含来自关联源空间的构件。

在构建步骤之后,在此文件夹中,需要运行已构建的包中的节点所需的一切。
开发空间不能是包含子文件夹中的ROS包的文件夹。它不能等于工作区根目录,因为这将使源空间成为子文件夹,从而导致多次找到包。

安装空间

如果调用make install,这是cmake将针对所有安装的目录。再次创建一个FHS样式的目录结构。在root用户中,可以使用-DCMAKE_INSTALL_PREFIX=/any/directory作为cmake的选项将其设置为任何目录。cmake默认值是/usr/local
与开发空间相同的限制适用于安装空间。这也意味着安装空间和开发空间不能相互嵌套。

系统安装空间(system install space)

系统安装空间是安装空间的一个特殊类别,预计将是系统上所有用户的共享安装。通常这是从您的包管理器安装的。此位置的默认值为/ opt / ros / ROSDISTRO,其中ROSDISTRO是正在使用的ROS发行版的代号。

结果空间(result space)

术语“结果空间”可用于开发空间或安装空间。如果这两个特定术语中的任何一个都适用,则应该使用通用术语。为了在视觉上区分结果空间和具有直接文件夹名称对应的空间(例如安装空间的文件夹安装),建议 在文档中将结果空间称为RESULT-SPACE,例如:

source RESULT-SPACE / setup.sh

(3)覆盖(overlays)

在catkin风格的工作区中,支持将一个工作区覆盖在另一个工作区之上。每个覆盖层都可以构建在另一个覆盖层的顶部,而任何位于较高覆盖层中的包都将屏蔽位于较低覆盖层中的包。

注意:当覆盖任何包时,如果要使用依赖于该包的所有包,则必须覆盖它们。创建覆盖的用户必须检查这一点。如果一个核心包被覆盖并改变了它的工作方式,任何依赖于它并依赖于旧行为(无论是运行时,还是链接时间)的包都会崩溃。

Catkin在devel中创建FHS[引用FHS]样式的布局并安装空间。可以使用指向devel空间或install空间的CMAKE_PREFIX_PATH将这些空间包含到另一个工作区中。如果是已安装空间,则必须调用make install;如果是devel空间,则必须使用make构建它。

例子

以下是一些基本用法的实例
假设我们的主文件夹(~/)中有几个catkin工作区。

~/workspace1/
    src/
    build/
    devel/
~/workspace2/
    src/
    build/
    devel/
~/workspace3/
    src/
    build/
    devel/
例1:将工作区1安装到系统
export CMAKE_INSTALL_PREFIX=/opt/ros/groovy
cd ~/workspace1/build
cmake ../src
make
make install

或者在第三步调用cmake时可以设置CMAKE_INSTALL_PREFIX

cd ~/workspace1/build
cmake -DCMAKE_INSTALL_PREFIX=/opt/ros/groovy ../src
make
make install
例2:在工作区1的顶部覆盖工作区2
source ~/workspace1/devel/setup.bash
cd ~/workspace2/build
cmake ../src
make
例3:在系统安装空间顶部的workspace1的开发空间顶部覆盖工作区间2
source ~/workspace1/devel/setup.bash
cd ~/workspace2/build
cmake ../src
make
例4 :在系统安装空间顶部的workspace1开发空间顶部的本地workspace2上安装工作空间3
cd ~/workspace2/build
cmake -DCMAKE_INSTALL_PREFIX=~/ws2_installed ../src
make
make install

source ~/ws2_installed/setup.bash

cd ~/workspace3/build
cmake ../src
make

(4)混合catkin和rosbuild工作区

catkin的设计允许rosbuild包裹坐在catkin之上。这是通过使用叠加来完成的。rosbuild叠加层可以覆盖catkin工作区开发空间或安装空间。rosbuild工作区的setup.* sh文件在获取时,也会获取catkin工作区的相应setup.* sh文件。

虽然可以在技术上将相同的文件夹用于rosbuild工作区和catkin工作区,但建议的布局是将rosbuild和catkin工作区隔离在自己的文件夹中。

~/rosbuild_ws/
   dry_pkg1/
   ...
   dry_pkgN/
   setup.bash
   setup.sh
~/catkin_ws/
   src/
     wet_pkg1/
     ...
     wet_pkgN/
   build/
   devel/
     setup.bash
     setup.sh
   install/
     setup.bash
     setup.sh

实现此布局的步骤是:

  1. 创建catkin_ws和catkin_ws / src文件夹
  2. 在catkin_ws中运行catkin_make
  3. 运行rosws init~ / rosbuild_ws /〜/ catkin_ws / devel(或安装)

参考:
Naming Conventions for Catkin Based Workspaces

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stan Fu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值