目录
rosdep 是什么?
关于 package.xml 文件的一点说明
<depend>
<build_depend>
<build_export_depend>
<exec_depend>
<test_depend>
rosdep 是如何工作的?
我怎么知道要在 package.xml 中放哪些键?
如果我的库不在 rosdistro 中怎么办?
如何使用 rosdep 工具?
rosdep 安装
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 是半不可知的。您可以通过将其作为独立的 Python 包安装,以在非 ROS 软件项目中使用这个强大的工具。成功运行 rosdep
依赖于 rosdep keys
的可用性,可以通过几个简单的命令从公共 git 仓库下载。https://github.com/ros-infrastructure/rosdep
https://docs.ros.org/en/independent/api/rosdep/html/
关于 package.xml 文件的一点信息
package.xml
是您软件中 rosdep
找到依赖项集的文件。确保 package.xml
中的依赖项列表完整且正确非常重要,这允许所有工具确定包的依赖项。缺失或错误的依赖项可能导致用户无法使用您的包,工作区中的包构建顺序错误,以及包无法发布。
在 package.xml
文件中的依赖项通常被称为“rosdep key”。这些依赖项由包的创建者手动填充在 package.xml
文件中,应该是它所需的任何非内置库和包的详尽列表。
这些在以下标签中表示(请参阅 REP-149 https://ros.org/reps/rep-0149.html 获取完整规范):
<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 key。这些键随后会与中央索引进行交叉引用,以在各种包管理器中找到合适的 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 包,通常被称为“系统依赖”,您将需要找到特定库的键。一般来说,有两个文件是感兴趣的:
rosdep/base.yaml 包含
apt
系统依赖项rosdep/python.yaml 包含了 Python 依赖项
要找到密钥,请在这些文件中搜索您的库并找到名称。这是放在 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 的拉取请求通常在一周内合并。
详细说明可以在此处 https://github.com/ros/rosdistro/blob/master/CONTRIBUTING.md#rosdep-rules-contributions 找到,说明如何贡献新的 rosdep 键。如果由于某种原因这些不能公开贡献,可以分叉 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 以获取最新索引是一个好主意。
最后,我们可以运行 rosdep install
来安装依赖项。通常,这是在一个工作区上运行的,通过一次调用安装所有包的依赖项。如果在包含源代码的工作区根目录的 src
目录中,那么这样的调用会显示如下。
rosdep install --from-paths src -y --ignore-src
拆分它:
--from-paths src
指定了检查package.xml
文件以解析键值的路径-y
表示默认回答包管理器的所有提示为“是”,以便无提示安装--ignore-src
表示即使存在 rosdep key,如果工作区中也有该软件包,则忽略安装依赖项。
有额外的参数和选项可用。使用 rosdep -h
查看它们,或查看 rosdep 的更完整文档,网址为 http://docs.ros.org/en/independent/api/rosdep/html/。
[1]“released into the ROS ecosystem” means the package is listed in one or more of the <distro>/distribution.yaml
directories in the rosdistro database. https://github.com/ros/rosdistro