关于ROS 2的构建系统

  • `ament_package`包
    • **package.xml**
    • **ament package**
  • `ament_cmake`代码库
  • `ament_lint`代码库
  • 构建工具
  • 参考

构建系统是一切的基石。在ROS生态中,我们从ROS 1 开始考虑构建系统。这一套构建系统相关的包从ROS 1的catkin迭代至今ament。将名字改为ament中的部分原因是我们希望它不会与catkin相冲突,以便我们需要混合使用它们,并防止与现有的catkin文档混淆。ament的主要职责是使开发和维护ROS 2核心包变得更容易。当然,这种工具也可以提供给任何愿意遵循ROS构建系统约定和工具的用户。此外,它可以使包更加规范的,这样开发人员应该能够挑选任何基于ament构建的包。此规范约束了包如何工作、如何检查以及如何构建或使用。

ament由几个重要的库组成,它们都在GitHub的ament组织中:

  • ament_package
  • ament_cmake
  • ament_lint
  • 构建工具

ament_package

ament/ament_package库包含了一个单独的ament Python包,它为ament包提供了各种实用工具,例如环境hook的模板。

无论底层的编译系统是什么,所有的组件包都必须在包的根目录中包含一个package.xml文件。“manifest”文件package.xml包含处理和操作一个包所需的信息。其中包含了全局唯一的包名和包的依赖项。package.xml还可以作为标记文件,标明包在文件系统中的位置。

在ROS 1中,catkin_pkg提供了对package.xml文件的解析,解析后可以在文件系统中定位相关包。在ROS 2中构建工具(如colcon)负责对这些package.xml文件的解析。

package.xml

包清单文件,它描述了包的根目录,包的元信息,包括它的名称、版本、描述、维护者、许可证、依赖关系等等。清单的内容是机器可读的XML格式,相关格式在REPs 127和140中进行了描述,并有可能在未来的REPs中进一步演进。

因此,每当某个包被称为ament package时,这意味着它是使用package.xml清单文件描述的单个软件单元(源代码、构建文件、测试、文档和其他资源)。

ament package

任何遵循ament打包指南的包,其中包含有package.xml文件。与底层构建系统无关。

由于ament package与构建系统无关,所以存在有ament CMake包、ament Python包等不同种类的ament包。

CMake package

包含普通CMake项目和package.xml清单文件的包。

ament CMake package

遵循ament打包指南的CMake package。

Python package

包含基于setuptools的Python项目和package.xml清单文件的包。

ament Python package

遵循ament打包指南的Python package。

ament_cmake代码库

位于GitHub的ament/ament_cmake,这个库提供了在CMake中创建“ament CMake”package所需的基础设施,包含许多“ament CMake”和纯CMake package。“ament CMake” package指的是:使用CMake构建的ament package。因此,这个库中的包提供了必要的CMake函数/宏和CMake模块,以便创建更多的“ament CMake”(或ament_cmake)包。这种类型的包在package.xml文件用<export><build_type>ament_cmake</build_type>tag进行标记。

上述代码库中的包是非常模块化的,只有一个“瓶颈”包ament_cmakeament_cmake包聚合了这个代码库中所有包的功能。该库中包含有以下包:

  • ament_cmake

    • 聚合此存储库中的所有其他包的功能,用户只需要依赖于此。
  • ament_cmake_auto
    • 提供了方便的CMake函数,可以自动编写包的CMakeLists.txt文件的许多繁琐部分
  • ament_cmake_core
    • ament提供所有内置的核心概念,例如环境钩子、资源索引、符号链接安装等
  • ament_cmake_gmock
    • 为基于gmock的单元测试添加的功能
  • ament_cmake_gtest
    • 为基于gtest的自动化测试添加的功能
  • ament_cmake_nose
    • 为基于nosetests的python自动化测试添加的功能
  • ament_cmake_python
    • 为包含Python代码的包提供CMake函数
  • ament_cmake_test
    • 使用CTest在单个目标下聚合不同种类的测试,例如gtest和nosetests

ament_cmake_core包中包含大量的CMake基础设施,使包之间能够轻易地通过传统接口传递信息。这使得包之间的构建更为解耦,促进了包的重用,并鼓励不同包的构建系统中的约定。例如,它提供了在包之间传递包含目录、库、定义和依赖项的标准方法,以便该信息的使用者可以以传统方式访问该信息。

ament_cmake_core包还提供了ament构建系统的特性,比如符号链接安装,它允许您象征性地将文件从源空间或构建空间链接到安装空间,而无需复制它们。这允许您仅需进行一次安装,然后改动非生成的资源,如Python代码和配置文件,而无需重新运行安装步骤就可使其生效。这一功能本质上取代了catkin中的“devel space”,因为它带来了大量的优点和很少的复杂性或缺点。

ament_cmake_core提供的另一个特性是包资源索引,这为包提供了一种表明它们包含某种类型的资源的方法。这个特性的设计使它可以更有效地回答一些简单的问题,比如这个前缀中有哪些包(例如/usr/local),他只需要你列出该前缀下单个可能位置中的文件。你可以在资源索引的设计文档中关于这个特性的内容。

catkin一样,ament_cmake_core也提供了环境设置文件和包特定的环境钩子。常见的环境设置文件如setup.bash,是包开发人员定义使用其包所需的环境更改。开发人员可以使用“环境钩子”来实现这一点,它基本上是一个任意的shell代码,可以设置或修改环境变量,定义shell函数,设置自动完成规则等等。这个特性提供了类似于在catkin不知道ROS的发布版本的情况下,使ROS 1设置ROS_DISTRO环境变量。

ament_lint代码库

这个代码库位于GitHub的ament/ament_lint,它以方便和一致的方式提供了几个检测和测试服务的包。目前有一些包支持使用uncrustify进行C++风格检测,使用cppcheck进行静态c++代码检查,检查源代码版权,使用pep8进行Python风格检测,以及其他功能。helper包的列表将来可能会增长。

构建工具

构建工具通过一次调用来执行一次构建包工作区的任务。从ROS 2发行Ardent版本开始提供了构建工具ament_tools。从ROS 2 Bouncy开始,ament_tools已经被colcon取代,这在通用构建工具中有所描述。

参考

ROS2学习(十六).ROS概念 - 构建系统相关推荐

  1. PyTorch框架学习十六——正则化与Dropout

    PyTorch框架学习十六--正则化与Dropout 一.泛化误差 二.L2正则化与权值衰减 三.正则化之Dropout 补充: 这次笔记主要关注防止模型过拟合的两种方法:正则化与Dropout. 一 ...

  2. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  3. Python的学习(十六):对文件的操作

    Python的学习(十六):对文件的操作 编码格式的介绍 Python中的解释器使用的是Unicode(内存) .py文件在磁盘上使用UTF-8存储(外存) 如何修改文件格式?不写的话默认为UTF-8 ...

  4. 强化学习(十六) 深度确定性策略梯度(DDPG)

    在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...

  5. ROS2学习(六).ROS概念 - 服务质量设置

    ROS Quality of Service settings QoS策略[^1] 同ROS 1比较 QoS配置文件 QoS兼容性 ROS1的QoS体系 QoS事件 发布者相关事件 订阅者相关事件 参 ...

  6. ROS2学习(十).ROS概念 - 主题的统计

    主题统计 概述 如何计算统计数据 统计数据种类 行为 同ROS 1的比较 支持 参考 概述 ROS 2为任何订阅所接收的消息提供综合统计功能.这允许用户收集订阅统计信息,同时可以更好地描述系统的性能或 ...

  7. Shell脚本学习-阶段十六-备份和恢复系统权限

    文章目录 前言 1.安装ACL工具 2.备份当前目录下(包括子目录)所有文件权限 3.修改某一文件权限,如:修改linuxprobe.txt及install.txt权限 4.恢复原有权限 总结 前言 ...

  8. tensorflow学习笔记(二十六):构建TF代码

    如何构建TF代码 batch_size: batch的大小 mini_batch: 将训练样本以batch_size分组 epoch_size: 样本分为几个min_batch num_epoch : ...

  9. 【第十六篇】商城系统-认证系统构建

    商城认证服务 一.搭建认证服务环境   结合我们前面介绍的商城的架构我们需要单独的搭建一个认证服务. 1.创建项目   首先创建一个SpringBoot项目,然后添加对应的依赖 <?xml ve ...

最新文章

  1. F5 云应用服务促进公共云、私有云及混合云应用部署
  2. php中一个经典的!==的用法
  3. Luogu P1262 间谍网络 【强连通分量/缩点】By cellur925
  4. tinyhttpd源码详解
  5. .NET Core前后端分离快速开发框架(Core.3.1+AntdVue)
  6. 获取linux数据段地址,获取kernel各个数据段,代码段的地址及范围
  7. selenium与python自动化测试模拟登录百度
  8. whitepages 爬取_运营笔记:是时候了解蜘蛛爬取原理了!揭秘收录难题!
  9. ROS2 Galactic teb_local_planner
  10. mysql的驱动jar包下载
  11. 第四章 爬取西刺免费代理ip 并应用到scrapy
  12. 批量打印图片不显示的问题
  13. 数据挖掘之七种常用的方法
  14. 键盘部分失灵/被锁定解决办法
  15. vue3使用dayjs
  16. android之设置app背景图片
  17. 七彩背景(Background)
  18. word图片被文字覆盖一部分的解决方法
  19. LWP 与 WEB 的基本使用
  20. spring security中Authority、Role的区别

热门文章

  1. micropython 实时音频传输_在线实时合唱的实现原理与难点是什么?
  2. c#使用正则表达式获取TR中的多个TD_PHP正则表达式技术心得与使用技巧完全详解 第3节...
  3. 利用SAML证书登陆vCenter
  4. linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...
  5. java 将一张图片切割成n个小图片,任意切割一张图片成新图片
  6. java delphi 三层_三层架构delphi+Java+Oracle模式的实现
  7. 基于PHP MySQL在线考试系统,基于PHP和MySQL的考试系统的研究
  8. linux下screen版本,在Linux (RHEL/CentOS 7/8 )中,如何使用4个简单步骤安装Screen命令
  9. 洛谷——P1194 买礼物
  10. [翻译]NUnit---String Collection File Directory Assert (七)