您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.

迁移软件包

有两种不同的软件包迁移:

  • 将现有软件包的源代码从 ROS 1 迁移到 ROS 2,目的是使源代码的大部分保持不变或至少相似。例如 插件库 在这种情况下,源代码保存在同一版本库的不同分支中,必要时可在这些分支之间移植通用补丁。

  • 为 ROS 2 实现与 ROS 1 软件包相同或相似的功能,但假设源代码会有很大不同。例如 roscpp 在 ROS 1 和 rclcpp 在 ROS 2 中,它们是独立的软件源,不共享任何代码。

先决条件

在将 ROS 1 软件包迁移到 ROS 2 之前,其所有依赖项都必须在 ROS 2 中可用。

软件包格式版本

ROS 2 不支持软件包规范的格式 1,只支持较新的格式版本(2 及更高)。因此 package.xml 由于 ROS 1 支持所有格式,因此在 ROS 1 软件包中执行转换是安全的。

从软件包格式 1 迁移到 2+

格式 1 和格式 2 之间的差异只影响 package.xml 及其依赖项。 REP-0140 定义了这些差异并提供了其理由。

参见 ROSDEP 文件 了解有关各种标记的更多信息。

<package>;

<package>标记决定使用哪种格式,请像这样更改:

<package 格式="2";>;

<依赖>;

这是一个新标签,旨在减少不必要的重复。如果您的格式 1 软件包包含

构建依赖关系;动物</build_depend>;
<run_depend>;动物</run_depend>;

应改为

<依赖>;动物依赖</depend>;

在格式 2 中,这相当于

构建依赖关系;动物</build_depend>;
构建_导出_依赖>;动物</build_export_depend>;
执行依赖关系;动物</exec_depend>;

<run_depend>;

不再允许使用该标签。无论在哪里发现,都必须更换:

<run_depend>;动物</run_depend>;

在格式 2 中,这相当于这两个新标签:

构建_导出_依赖>;动物</build_export_depend>;
执行依赖关系;动物</exec_depend>;

如果依赖关系仅在运行时使用,则只有 执行依赖关系; 需要。如果只是为了满足其他软件包的编译依赖而导出,则使用 构建_导出_依赖>;.如果两者都需要,这可能是更好的选择:

<依赖>;动物依赖</depend>;

<test_depend>;

在格式 2 中,该标记可以满足构建依赖项,而不仅仅是执行测试所需的依赖项。与格式 1 不同、 <test_depend>; 现在也可以引用声明为其他类型依赖关系的软件包。

一些仅用于测试的依赖项以前需要 构建依赖关系;现在应该用 <test_depend>;.例如

构建依赖关系;试吃</build_depend>;

成为:

<test_depend>;试吃</test_depend>;

在 CMakeLists.txt 中,确保只在条件测试块中引用测试依赖项:

如果 (构建测试)
  查找软件包(试吃 要求)
endif()

<doc_depend>;

该标签定义了构建文档所需的依赖项:

<doc_depend>;源代码</doc_depend>;
<doc_depend>;python3-sphinx</doc_depend>;

这不会创建二进制包依赖关系,除非这些依赖关系也是使用其他依赖关系标记声明的。

依赖关系名称

来自 rosdep 无需更改,因为 ROS 1 和 ROS 2 共享这些内容。

一些发布到 ROS 中的软件包在 ROS 2 中可能有不同的名称,因此可能需要相应地更新依赖关系。

元软件包

ROS 2 并没有为元软件包提供特殊的软件包类型。元软件包仍然可以作为只包含运行时依赖关系的普通软件包存在。从 ROS 1 迁移元软件包时,只需移除 元软件包 />; 标签。请参见 使用变体 元软件包/变体的更多信息。

许可

在 ROS 1 中,我们推荐的许可证是 3 条款 BSD 许可.在 ROS 2 中,我们推荐使用 Apache 2.0 许可.

对于任何新项目,无论是 ROS 1 还是 ROS 2,我们都建议使用 Apache 2.0 许可。

不过,在将代码从 ROS 1 移植到 ROS 2 时,我们不能简单地更改许可证。任何已有的贡献都必须保留现有的许可证。

为此,如果要迁移软件包,我们建议保留现有许可证,并继续根据现有的 OSI 许可证为该软件包做出贡献,我们希望该许可证成为核心元素的 BSD 许可证。

这将使事情清晰易懂。

更改许可证

更改许可证是可能的,但需要联系所有贡献者并获得许可。对于大多数软件包来说,这可能是一项艰巨的工作,不值得考虑。如果软件包的贡献者较少,则可能可行。