迁移包
有两种不同类型的包迁移:
将现有包的源代码从ROS 1迁移到ROS 2,意味着源代码的重要部分将保持相同或至少相似。一个示例是 pluginlib,其中源代码在同一个存储库的不同分支中维护,通用补丁可以在必要时在这些分支之间进行移植。
在ROS 2中实现与ROS 1包相同或类似的功能,但假设源代码将会有明显的不同。一个示例是ROS 1中的 roscpp 和ROS 2中的 rclcpp,它们是分开的存储库,没有共享任何代码。
包格式版本
ROS 2不支持软件包规范的格式1,而仅支持更新的格式版本(2及更高)。因此,如果软件包使用格式1,则必须将``package.xml``文件更新至至少格式2。由于ROS 1支持所有格式,因此在ROS 1软件包中执行此转换是安全的。
从包格式1迁移到2+
格式1和格式2之间的区别仅影响 package.xml 及其依赖关系。REP-0140 定义了这些差异并提供了它们的基本原理。
有关各种标签的更多信息,请参阅 rosdep 文档。
<depend>
这是一个新标签,旨在减少不必要的重复。如果您的格式1包含以下内容:
<build_depend>foo</build_depend>
<run_depend>foo</run_depend>
应该替换为:
<depend>foo</depend>
在格式2中,这相当于:
<build_depend>foo</build_depend>
<build_export_depend>foo</build_export_depend>
<exec_depend>foo</exec_depend>
<run_depend>
不再允许使用此标签。无论在何处找到,都必须替换为:
<run_depend>foo</run_depend>
在格式2中,这相当于这两个新标签:
<build_export_depend>foo</build_export_depend>
<exec_depend>foo</exec_depend>
如果依赖项仅在运行时使用,只需使用 <exec_depend>
。如果它仅用于导出以满足其他软件包的构建依赖关系,请使用 <build_export_depend>
。如果两者都需要,这可能是更好的选择:
<depend>foo</depend>
<test_depend>
在格式2中,此标签可以满足构建依赖关系,不仅仅是执行测试所需的依赖关系。与格式1不同,<test_depend>
现在可以指代一个同时声明为其他类型依赖项的包。
以前需要 <build_depend>
的某些仅测试依赖项,现在应使用 <test_depend>
表示。例如:
<build_depend>testfoo</build_depend>
变成了:
<test_depend>testfoo</test_depend>
在您的 CMakeLists.txt 中,请确保您的测试依赖项只在条件测试块内引用:
if (BUILD_TESTING)
find_package(testfoo REQUIRED)
endif()
<doc_depend>
此标签定义了构建文档所需的依赖项:
<doc_depend>doxygen</doc_depend>
<doc_depend>python3-sphinx</doc_depend>
这不会创建二进制包依赖关系,除非它们还使用其他依赖标签声明。
依赖项名称
来自 rosdep 的依赖项名称不应该需要更改,因为它们在ROS 1和ROS 2之间是共享的。
在ROS 2中,一些发布到ROS的软件包可能在ROS 2中具有不同的名称,因此依赖关系可能需要相应更新。
元软件包
ROS 2没有用于元包的特殊包类型。元包仍然可以存在为仅包含运行时依赖项的常规包。从ROS 1迁移元包时,只需在包清单中删除 <metapackage />
标签。有关元包/变体的更多信息,请参阅 使用变体。
许可
在ROS 1中,我们推荐的许可证是 3-Clause BSD 许可证。在ROS 2中,我们推荐的许可证是 Apache 2.0 许可证。
对于任何新项目,我们建议无论是ROS 1还是ROS 2都使用Apache 2.0 License。
然而,当将代码从ROS 1迁移到ROS 2时,我们不能简单地更改许可证。必须保留现有许可证以供任何已有贡献使用。
为此,如果正在迁移某个软件包,我们建议保留现有许可证,并继续在现有的OSI许可证下为该软件包做出贡献,我们预计核心元素的许可证将是BSD许可证。
这将使事情清晰易懂。