警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

关于 ament 和 catkin(柔荑)的混合

接下来的所有内容都是实验性和推测性的。

背景介绍

曾经有一种东西叫做 红砖.然后出现了一种叫做 柔荑花序在很大程度上取代了 红砖.最近推出了一种叫做 动情有朝一日可能取代 柔荑花序.

这三种工具都可以被视为 "元编译系统"。它们位于其他构建系统(如 CMake、Python setuptools)之上,提供额外的功能,旨在使这些构建系统更易于使用,尤其是在管理多个软件包的依赖关系以及在单个工作区构建多个软件包时。

每个元构建系统都有两个功能:

  1. 为底层构建系统(如 CMake)添加 API,用于简化常见任务(如在构建可执行文件时提供依赖软件包导出的所有标志)。通常会有钩子允许核心元构建系统之外的软件包注入额外的 API。

    • 红砖: mk/cmake.mk, rosbuild_init(), rosbuild_add_executable()等等

    • 柔荑花序: catkin_package(), catkin_install_python()等等

    • 动情: ament_target_dependencies(), ament_export_dependencies(), ament_package()等等

  2. 提供一种工具,用于按依赖顺序遍历装满软件包的工作区,构建并安装每个软件包。

    • 红砖: 玫瑰

    • 柔荑花序: 柔荑花序 构建, catkin_make, catkin_make_isolated等等

    • 动情: 动情 构建

将所有这些系统联系在一起的共同点是将代码分为以下几个部分 套餐,每个软件包都包含一个清单文件 (manifest.xmlpackage.xml).元构建系统的两个部分(应用程序接口和构建工具)都需要这个清单(除个别情况外)才能运行。

假设

  1. 虽然我们通常认为元构建系统的两个方面是耦合的,但其实不必如此。 软件包内部使用的应用程序接口和迭代软件包的工具在很大程度上是独立的,软件包清单构成了它们之间的接口。举例来说,原则上没有理由不这样做、 玫瑰 无法修改,以遍历一个装满了 柔荑花序 软件包,按依赖顺序进入这些软件包,并执行通常的 mkdir 建设; CD 建设; cmake ..; 生产 安装 例程(将适当的标记传递给 cmake生产).

  2. 应尽量减少从一个元构建系统迁移到另一个元构建系统所需的工作量。红砖柔荑花序 这很困难,而且仍然是社区中许多人的痛点。虽然要求开发人员做出改变以换取使用新功能的权利是合理的,但所要求的改变应尽可能小,同时又不影响新系统的有效性。当旧系统被广泛使用时,这一点尤为重要。

    1. 推论 在没有充分理由的情况下,不应要求迁移到新的元构建系统。 如果开发人员不需要新系统提供的功能,那么就不应该强迫她从旧系统迁移,除非旧系统存在不可逆转的缺陷(例如,开发人员不需要新系统提供的功能,那么就不应该强迫她从旧系统迁移,除非旧系统存在不可逆转的缺陷)、 红砖的源代码内构建模式和缺少 "安装 "步骤)。

  3. 互操作性是件好事。 在可能的情况下(并非所有组合都切实可行),开发人员应该能够混合和匹配元构建系统,包括混合它们的不同方面(即使用一个系统的构建工具和另一个系统的应用程序接口)。当开发人员希望使用一个元构建系统来组合一个庞大的现有代码库时,这种混合和匹配就显得尤为重要(例如,ROS 与 柔荑花序)与使用另一种元构建系统的代码库提供的新库和工具(例如,ROS 2 与 动情).理想情况下,这种组合无需更改任何一个代码库使用的应用程序接口,也无需告诉开发人员使用哪种构建工具。

    1. 推论 工作空间不必千篇一律。 我们没有理由不能自由混合,比如说、 柔荑花序动情 在一个工作区中,只要使用的构建工具知道如何构建这两个软件包,它们就可以双向依赖。软件包(至少是 CMake 控制的软件包)之间的主要接口是 CMake 配置文件。只要配置文件遵循标准协议(设置 foo_LIBRARIES等),那么谁写的文件就不重要了。它可以由 柔荑花序动情,甚至是由开发者手动制作的,他希望在自己的软件包中使用纯 CMake,但该软件包仍由 柔荑花序动情 打包。

用例及实验性实施

将 ROS 软件包添加到 ROS 2 工作区并使用 动情 构建

比方说,您想在 ROS 2 工作区中添加一些现有的 ROS 软件包,但不想将 ROS 软件包从 柔荑花序动情 (反之亦然)。这里有两个补丁可以让你做到这一点:

  • ament_package:添加对格式 1 软件包清单的支持,而不是要求格式 2。 柔荑花序动情因为格式 2 已经存在了一段时间,而且 柔荑花序 但有大量的 ROS 代码使用格式 1,所以我们应该支持它。我们还可以改进这种实现方式,例如对各种依赖性标签进行推理,以及它们在格式 1 和格式 2 之间的区别。

  • 工具:添加一个新的 柔荑花序 构建类型为 动情.这种实现方式只是将 柔荑花序 套餐与普通 cmake 软件包,似乎效果不错。它可以做得更复杂。

使用示例

  1. 像往常一样,使用上述分支获取 ROS 2 代码。

  2. 为您的工作区添加一些 柔荑花序 ROS 软件包,确保它们的所有依赖项都已满足要求(要么也存在于工作区中,要么已安装在其他地方,并获取了相应的设置 shell 文件)。

  3. 像往常一样构建(例如 ./src/ament/ament_tools/scripts/ament.by 构建).

瞧:你的现有代码不会因为使用了新的构建工具而突然被破坏。

变化:使用 动情 构建

假设您喜欢新的 动情 工具,并想用它来构建使用了 柔荑花序 在内部。下面举例说明如何做到这一点,只需安装一个最低限度的 动情 然后使用它来构建一个充满 ROS 柔荑花序 打包:

mkdir -p ~/ament_ws/src
CD ~/ament_ws/src git 复制 https://github.com/osrf/osrf_pycommon.git git 复制 https://github.com/ament/ament_package.git
CD ament_package git 销售点 柔荑花序
CD .. git 复制 https://github.com/ament/ament_tools.git
CD ament_tools git 销售点 柔荑花序
CD ../..
 ./src/ament_tools/scripts/ament.py 构建

现在构建 ROS 软件包:

. $HOME/ament_ws/install/setup.bash
CD ~/ros_catkin_ws ament 构建

瞧:您使用了 动情 构建工具来构建您的 柔荑花序 软件包,而无需迁移它们。

变化:使用 柔荑花序 ROS 2 软件包中的应用程序接口

比方说,你在 ROS 2 的基础上进行构建,而 ROS 2 内部使用了 动情 应用程序接口,并想使用 柔荑花序 应用程序接口。

为此,我们需要在 Python3 中安装 柔荑花序 (二进制 debians 使用 Python2.7)。下面是安装到 $HOME/catkin:

# 安装 catkin_pkg
笨蛋 复制 https://github.com/ros-infrastructure/catkin_pkg.git
CD catkin_pkg git 销售点 ament python3 setup.py 安装 --前缀 $HOME/catkin --单版本外部管理 --记录 动物 --安装--布局 辩论
# 安装 catkin
笨蛋 复制 https://github.com/ros/catkin.git
CD catkin git 销售点 ament mkdir 构建
CD 构建
飞龙之路=$HOME/catkin/lib/python3/dist-packages/ cmake .. -dcmake_install_prefix=$HOME/catkin -dpython_executable=/usr/bin/python3 make 安装

要使用该版本的 catkin,您只需将 $HOME/catkin/setup.bash 锉刀

让我们假定您的 ROS 2 工作区位于 ~/ros2_ws您在 柔荑花序 分支机构 ament_package工具.将 图像工具https://github.com/gerkey/catment.它是 ROS 2 的简单移植。 图像工具 软件包,将其从 动情 应用程序接口 柔荑花序 应用程序接口。要构建它

CD ~/ros2_ws . $HOME/catkin/setup.bash ./src/ament_tools/scripts/ament.py 构建

瞧:在 ROS 2 上添加新软件包时,你可以在软件包中自由选择喜欢的 CMake API。

  • 注意事项:要求对使用 CATKIN_DEPENDS 内侧 catkin_package()因为在某个地方,有人对诸如 rclcpp 不是 柔荑花序 套餐。这种限制需要以某种方式放宽。

  • TODO:同样的演示,但有一个 动情 依赖于 柔荑花序 软件包(这很容易)。

  • TODO:同样的演示,但使用的软件包是 vanilla CMakeLists.txt 既不使用 动情 也不 柔荑花序并提供手动生成的 fooConfig.cmake 导出正确内容的文件,使其在外人看来是一样的。

使用 catkin_make_isolated

假设您已经熟悉 ROS 和 柔荑花序 您很想尝试 ROS 2,但您没有心情了解 动情.你更愿意坚持你所知道的,比如使用 catkin_make_isolated 来构建一切。这里有一个补丁,可以让你做到这一点:

  • 柔荑花序:为声明自己的构建类型为 ament_*.该实施方案呼吁 动情 来构建每个这样的软件包。虽然 ament_cmake 软件包可作为普通 cmake 包(就像我们在添加 柔荑花序 支持 动情), ament_python 包需要调用 Python 的一些复杂功能。与其试图在 柔荑花序,更容易让 动情 处理它。在此补丁中,我们还添加了 buildtool_export_depend 在构建时会考虑到该集合中的软件包。

  • catkin_pkg:在此补丁中,我们还添加了 buildtool_export_depend 在计算拓扑顺序时,会考虑到该集合的数据包。

因为我们要呼唤 动情 构建我们还需要安装 动情就像前面的例子一样:

mkdir -p ~/ament_ws/src
CD ~/ament_ws/src git 复制 https://github.com/osrf/osrf_pycommon.git git 复制 https://github.com/ament/ament_package.git
CD ament_package git 销售点 柔荑花序
CD .. git 复制 https://github.com/ament/ament_tools.git
CD ament_tools git 销售点 柔荑花序
CD ../..
 ./src/ament_tools/scripts/ament.py 构建

然后,我们需要在某个地方安装修改过的 catkin 版本:

# 安装 catkin_pkg
笨蛋 复制 https://github.com/ros-infrastructure/catkin_pkg.git
CD catkin_pkg git 销售点 ament python3 setup.py 安装 --前缀 $HOME/catkin --单版本外部管理 --记录 动物 --安装--布局 辩论
# 安装 catkin
笨蛋 复制 https://github.com/ros/catkin.git
CD catkin git 销售点 ament mkdir 构建
CD 构建
飞龙之路=$HOME/catkin/lib/python3/dist-packages/ cmake .. -dcmake_install_prefix=$HOME/catkin -dpython_executable=/usr/bin/python3 make 安装

现在构建 ROS 2 软件包:

. $HOME/catkin/setup.bash . $HOME/ament_ws/install/setup.bash
CD ~/ros2_ws touch src/eProsima/AMENT_IGNORE
飞龙之路=$PYTHONPATH:/home/gerkey/ros2_ws_catkin/install_isolated/lib/python3.5/site-packages catkin_make_isolated --安装

瞧:你已经使用熟悉的工具构建了 ROS 2。

  • 注意事项:我们忽略了 eProsima 工作区中的软件包,因为它们缺少 package.xml 文件,这意味着 柔荑花序 看不到他们。 动情 有一些处理此类软件包的启发式方法。选项:将这些启发式方法反向移植到 柔荑花序;切换到安装非package.xml-或在工作区外添加一个 package.xml 例如,在我们自己的分叉中)。

将所有 ROS 和 ROS 2 结合到一个工作区并构建它(TODO)

这一步需要理清一些事情,至少包括:

  • 软件包名称冲突。我们目前有 ROS 2 版本的 ROS 消息软件包,还有一些在 几何2.要么需要将这些功能合并到一个软件包中,使其同时支持两个系统,要么新版本需要不同的名称。

  • 信息生成。ROS 和 ROS 2 有不同的信息生成步骤,其输出结果可能有冲突,也可能没有冲突。我们需要做一些复杂的工作,以便从一个信息包中生成所有正确的工件(或者,如上所述,新的信息包需要不同的名称)。

使用 盛开 释放 动情 软件包(TODO)

似乎 盛开 应该能够发布使用 动情 CMake API,而且所生成的发布版本应能在农场上构建。我们可以修改 盛开ROS_BUILDFARM 根据需要启用此用例。