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

19 篇文章 10 订阅

构建系统是一切的基石。在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 127140中进行了描述,并有可能在未来的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取代,这在通用构建工具中有所描述。

参考

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值