使用rosdep管理依赖关系

目标: 使用``rosdep``管理外部依赖项。

教程级别: 中级

时间: 5分钟

本教程将解释如何使用``rosdep``管理外部依赖项。

警告

目前,rosdep 仅在 Linux 和 macOS 上运行;不支持 Windows。有长期计划将 Windows 添加到 https://github.com/ros-infrastructure/rosdep 的支持范围内。

什么是rosdep?

rosdep 是一种依赖管理工具,可以与包和外部库一起工作。它是用于识别和安装依赖项以构建或安装包的命令行实用程序。rosdep 不是一个独立的包管理器;它是一个元包管理器,使用其对系统和依赖项的了解来查找适合在特定平台上安装的包。实际的安装是使用系统包管理器完成的(例如,在 Debian/Ubuntu 上是 apt,在 Fedora/RHEL 上是 dnf 等)。

通常在构建工作空间之前调用它,用于安装工作空间内包的依赖项。

它具有在单个软件包或软件包目录(例如工作空间)上工作的能力。

注解

尽管名称表明它是为 ROS 设计的,但 rosdep 对 ROS 半不可知。您可以将这个强大的工具用于非 ROS 软件项目,通过将其安装为独立的 Python 包。成功运行 rosdep 依赖于 rosdep keys 是否可用,这些 keys 可以通过几个简单的命令从一个公共的 git 存储库中下载。

关于 package.xml 文件的一点说明

package.xml 是您的软件中 rosdep 查找依赖项集的文件。package.xml 中依赖项列表完整且正确非常重要,这允许所有工具确定软件包的依赖关系。缺少或不正确的依赖关系可能会导致用户无法使用您的软件包,工作空间中的软件包构建顺序不正确,或无法发布软件包。

package.xml 文件中的依赖关系通常被称为"rosdep keys"。这些依赖关系由软件包的创建者手动填充在 package.xml 文件中,应该是它所需的所有非内置库和软件包的详尽列表。

这些依赖关系在以下标签中表示(查看 REP-149 以获取完整规范):

<depend>

这些是应该在软件包的构建时间和运行时间都提供的依赖关系。对于 C++ 软件包,如果不确定,请使用此标签。纯 Python 软件包通常没有构建阶段,因此不应使用此标签,而应改用 <exec_depend>

<build_depend>

如果您的软件包仅在构建时使用特定的依赖项,而在执行时不需要,您可以使用 <build_depend> 标签。

对于此类依赖关系,安装的二进制文件不要求安装该特定软件包。

但是,如果您的软件包导出了一个包含此依赖项的头文件,那么在这种情况下,您还需要使用 <build_export_depend>

<build_export_depend>

如果您导出了一个包含依赖关系的头文件,那么依赖于您的软件包的其他软件包将需要该头文件。这主要适用于头文件和 CMake 配置文件。由您导出的库所引用的库通常应该指定 <depend>,因为它们在执行时也是必需的。

<exec_depend>

这个标签声明了共享库、可执行文件、Python 模块、启动脚本以及运行您的软件包时所需的其他文件的依赖关系。

<test_depend>

此标签声明仅在测试时需要的依赖关系。此处的依赖项不应与 <build_depend><exec_depend><depend> 指定的关键字重复。

``rosdep``是如何工作的?

``rosdep``将在其路径或特定软件包中检查``package.xml``文件,并查找其中存储的rosdep键。然后,这些键将与中央索引进行交叉引用,以在各种软件包管理器中找到适当的ROS软件包或软件库。最后,一旦找到这些软件包,它们将被安装并准备就绪!

rosdep 通过将中央索引检索到本地计算机上来工作,以便在每次运行时都无需访问网络(在 Debian/Ubuntu 上,它的配置存储在 /etc/ros/rosdep/sources.list.d/20-default.list 中)。

中央索引称为 rosdistro,可以在线找到 <https://github.com/ros/rosdistro>。我们将在下一节中详细探讨这个问题。

我怎么知道要在我的``package.xml``文件中放入哪些键呢?

很好的问题,我很高兴你问了!

  • 如果您的软件包想要依赖于另一个基于 ROS 的软件包,并且该软件包已发布到 ROS 生态系统 1,例如 nav2_bt_navigator,则可以简单地使用软件包的名称。您可以在 https://github.com/ros/rosdistro<distro>/distribution.yaml``(例如 ``humble/distribution.yaml)中找到您所选择的 ROS 发行版的所有已发布 ROS 软件包的列表。

  • 如果您想要依赖于一个非 ROS 软件包,通常称为“系统依赖项”,则需要找到特定库的关键字。一般来说,有两个感兴趣的文件:

要找到一个关键字,可以在这些文件中搜索您的库,并找到其名称。这就是要放在 package.xml 文件中的关键字。

例如,假设一个软件包依赖于 doxygen,因为它是一款关注文档质量的出色软件(提示提示)。我们可以在 rosdep/base.yaml 中搜索 doxygen 并找到如下内容:

doxygen:
  arch: [doxygen]
  debian: [doxygen]
  fedora: [doxygen]
  freebsd: [doxygen]
  gentoo: [app-doc/doxygen]
  macports: [doxygen]
  nixos: [doxygen]
  openembedded: [doxygen@meta-oe]
  opensuse: [doxygen]
  rhel: [doxygen]
  ubuntu: [doxygen]

这意味着我们的rosdep键是``doxygen``,在不同操作系统的软件包管理器中,它会解析为不同的名称进行安装。

如果我的库不在rosdistro中怎么办?

如果你的库不在``rosdistro``中,你可以体验开源软件开发的伟大之处:你可以自己添加!通常,针对rosdistro的拉取请求在一周内就会合并。

关于如何贡献新的rosdep键,可以在此处找到详细说明:<https://github.com/ros/rosdistro/blob/master/CONTRIBUTING.md#rosdep-rules-contributions>。如果由于某些原因无法公开贡献,也可以fork rosdistro并维护一个备用索引供使用。

如何使用rosdep工具?

rosdep 安装

如果您正在使用 ROS,可以方便地将 rosdep 与 ROS 发行版一起打包安装。这是获取 rosdep 的推荐方法。您可以使用以下命令进行安装:

apt-get install python3-rosdep

注解

在 Debian 和 Ubuntu 上,还有一个名字类似的软件包叫做 python3-rosdep2。如果已安装该软件包,请确保在安装 python3-rosdep 之前将其卸载。

如果您在 ROS 之外使用 rosdep,系统软件包可能无法使用。在这种情况下,您可以直接从 https://pypi.org 安装它:

pip install rosdep

rosdep 操作

现在我们对``rosdep``、package.xml``和``rosdistro``有了一些了解,我们准备好使用这个工具了!首先,如果这是第一次使用``rosdep,必须通过以下命令进行初始化:

sudo rosdep init
rosdep update

这将初始化``rosdep``,``update``将更新本地缓存的``rosdistro``索引。定期执行``update``命令以获取最新的索引是一个好主意。

最后,我们可以运行``rosdep install``来安装依赖项。通常,我们会在一个工作空间上运行此命令,通过单个调用安装所有依赖项。如果在包含源代码的``src``目录下的工作空间根目录运行该命令,命令如下所示:

rosdep install --from-paths src -y --ignore-src

对此进行解释:

  • ``--from-paths src``指定要检查以解析键的``package.xml``文件的路径

  • ``-y``表示在包管理器的提示中默认全部回答为“是”,无需提示即可安装

  • --ignore-src 表示忽略安装依赖项,即使存在 rosdep 键,也会忽略,如果包本身也在工作空间中。

还有其他可用的参数和选项。使用 rosdep -h 查看它们,或查看 rosdep 的更完整文档,网址是 http://docs.ros.org/en/independent/api/rosdep/html/

1

“在 ROS 生态系统中发布” 意味着该软件包在 rosdistro 数据库 中的一个或多个 <distro>/distribution.yaml 目录中列出。