您正在阅读的是旧版本但仍受支持的 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 软件包(通常称为 "系统依赖"),就需要找到特定库的密钥。一般来说,有两个文件值得关注:
rosdep/base.yaml 包含
适切
系统依赖性rosdep/python.yaml 包含 Python 依赖项
要查找密钥,请在这些文件中搜索您的资料库并找到名称。这就是要放入 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.xml
和 rosdistro
然后,我们就可以使用工具本身了!首先,如果这是第一次使用 rosdep
,必须通过以下方式进行初始化:
苏都 rosdep 启动 更新
这将初始化 rosdep 和 更新
将更新本地缓存的 rosdistro 索引。最好 更新
rosdep,以获取最新索引。
最后,我们可以运行 rosdep 安装
来安装依赖包。通常情况下,这需要在包含许多软件包的工作区中运行一次调用,以安装所有依赖包。如果工作区的根目录为 来源
包含源代码。
rosdep 安装 --从路径 来源 -y --忽略源代码
分解一下:
--从路径 来源
指定检查package.xml
文件来解决-y
是指对软件包管理器的所有提示都默认为 "是",以便在没有提示的情况下进行安装--忽略源代码
意味着如果软件包本身也在工作区中,即使存在 rosdep 密钥,也会忽略安装依赖项。
还有其他参数和选项可供选择。使用 rosdep -h
查看它们,或者在以下网址查看更完整的 rosdep 文档 https://ros-2.com/independent/api/rosdep/html/ .