您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.

使用 rosdep 管理依赖关系

目标 使用 rosdep.

辅导水平: 中级

时间 5 分钟

本教程将介绍如何使用 rosdep.

警告

目前,rosdep 只能在 Linux 和 macOS 上运行,不支持 Windows。长期计划是在 https://github.com/ros-infrastructure/rosdep.

什么是 rosdep?

rosdep 是一个依赖性管理工具,可以处理软件包和外部库。它是一种命令行工具,用于识别和安装依赖项,以构建或安装软件包。 rosdep 它本身就是一个包管理器;它是一个元软件包管理器,利用自身对系统和依赖关系的了解,找到要在特定平台上安装的适当软件包。实际安装是通过系统软件包管理器(如 适切 在 Debian/Ubuntu 上、 dnf 在 Fedora/RHEL 等系统上)。

它通常在构建工作区之前被调用,用于安装工作区中软件包的依赖包。

它可以在单个软件包或软件包目录(如工作区)上运行。

备注

顾名思义,它是用于 ROS 的、 rosdep 与 ROS 半相关。您可以将其安装为独立的 Python 软件包,在非 ROS 软件项目中使用这一强大工具。成功运行 rosdep 依赖于 rosdep 钥匙 只需几个简单的命令就能从公共 git 仓库下载。

关于 package.xml 文件的小知识

"(《世界人权宣言》) package.xml 是软件中的文件,其中 rosdep 查找依赖项集。重要的是,依赖项列表中的 package.xml 完整且正确,这样所有工具才能确定软件包的依赖关系。缺少或不正确的依赖关系会导致用户无法使用你的软件包,工作区中的软件包被无序构建,以及软件包无法发布。

中的依赖关系 package.xml 文件通常被称为 "rosdep keys"。这些依赖关系在 package.xml 文件,并应详尽无遗地列出该软件包所需的所有非内置库和软件包。

这些标记用以下标记表示(见 REP-149 的完整说明):

<依赖>;

这些是软件包在构建和运行时都应提供的依赖项。对于 C++ 软件包,如果有疑问,请使用此标记。纯 Python 软件包通常没有联编阶段,因此不应使用此标记,而应使用 执行依赖关系; 而不是

构建依赖关系;

如果您只在构建软件包时而不是在执行时使用特定的依赖关系,可以使用 构建依赖关系; 标签

有了这种依赖关系,安装软件包的二进制文件就不需要安装特定的软件包。

但是,如果您的软件包导出的头包含了该依赖项的头,就会产生问题。在这种情况下,您还需要一个 构建_导出_依赖>;.

构建_导出_依赖>;

如果导出的头包含依赖包中的头,那么其他软件包也会需要该头。 构建依赖关系; 上。这主要适用于头文件和 CMake 配置文件。您导出的库所引用的库包通常应指定 <依赖>;因为在执行时也需要它们。

执行依赖关系;

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

<test_depend>;

此标签仅声明测试所需的依赖项。此处的依赖项应 指定的密钥复制 构建依赖关系;, 执行依赖关系;<依赖>;.

rosdep 如何工作?

rosdep 将检查 package.xml 或特定软件包的文件,并找到其中存储的 rosdep 密钥。然后将这些密钥与中央索引相互参照,在各种软件包管理器中找到相应的 ROS 软件包或软件库。最后,一旦找到软件包,它们就会被安装并准备就绪!

rosdep 的工作原理是在本地计算机上检索中央索引,这样它就不必在每次运行时都访问网络(在 Debian/Ubuntu 上,其配置存储在 /etc/ros/rosdep/sources.list.d/20-default.list).

中心指数被称为 rosdistro其中 可在线查阅.我们将在下一节进一步探讨。

如何知道在 package.xml 中输入哪些键?

问得好,很高兴你这么问!

  • 如果您想在软件包中依赖的软件包是基于 ROS 的,并且已发布到 ROS 生态系统中 [1]例如 导航仪 2_bt_navigator您可以直接使用软件包的名称。所有已发布的 ROS 软件包列表请参见 https://github.com/ros/rosdistro<distro>/distribution.yaml 例如 humble/distribution.yaml),用于给定的 ROS 分布。

  • 如果要依赖非 ROS 软件包(通常称为 "系统依赖"),就需要找到特定库的密钥。一般来说,有两个文件值得关注:

要查找密钥,请在这些文件中搜索您的资料库并找到名称。这就是要放入 package.xml 锉刀

例如,假设一个软件包依赖于 源代码 因为它是一款注重文档质量的优秀软件(提示提示)。我们会搜索 rosdep/base.yaml 对于 源代码 和遇到:

源代码:
  拱门: [源代码]
  菜鸟: [源代码]
  联邦帽: [源代码]
  freebsd: [源代码]
  gentoo: [app-doc/doxygen]
  宏港: [源代码]
  尼克斯: [源代码]
  开放式嵌入: [doxygen@meta-oe]
  开用: [源代码]
  rhel: [源代码]
  乌托邦: [源代码]

这意味着我们的 rosdep 密钥是 源代码,在不同操作系统的软件包管理器中会解析为不同的名称,以便安装。

如果我的图书馆不在 rosdistro 中怎么办?

如果您的图书馆不在 rosdistro现在,您可以体验开源软件开发的伟大之处:您可以自己添加!对 rosdistro 的拉取请求通常会在一周内顺利合并。

详细说明见此处 了解如何贡献新的 rosdep 密钥。如果由于某种原因无法公开贡献这些密钥,也可以 fork rosdistro 并维护一个备用索引以供使用。

如何使用 rosdep 工具?

ROSDEP 安装

如果您使用 rosdep 它与 ROS 的发行版一起打包,非常方便。这是获得 rosdep.您可以使用

apt-get 安装 python3-rosdep

备注

在 Debian 和 Ubuntu 上,还有一个名称相似的软件包,名为 python3-rosdep2.如果安装了该软件包,请确保在安装之前将其移除。 python3-rosdep.

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

核心 安装 rosdep

运行

现在我们对 rosdep, package.xmlrosdistro然后,我们就可以使用工具本身了!首先,如果这是第一次使用 rosdep,必须通过以下方式进行初始化:

苏都 rosdep 启动 更新

这将初始化 rosdep 和 更新 将更新本地缓存的 rosdistro 索引。最好 更新 rosdep,以获取最新索引。

最后,我们可以运行 rosdep 安装 来安装依赖包。通常情况下,这需要在包含许多软件包的工作区中运行一次调用,以安装所有依赖包。如果工作区的根目录为 来源 包含源代码。

rosdep 安装 --从路径 来源 -y --忽略源代码

分解一下:

  • --从路径 来源 指定检查 package.xml 文件来解决

  • -y 是指对软件包管理器的所有提示都默认为 "是",以便在没有提示的情况下进行安装

  • --忽略源代码 意味着如果软件包本身也在工作区中,即使存在 rosdep 密钥,也会忽略安装依赖项。

还有其他参数和选项可供选择。使用 rosdep -h 查看它们,或者在以下网址查看更完整的 rosdep 文档 https://ros-2.com/independent/api/rosdep/html/ .