什么是rosdep?
rosdep是一个依赖管理工具,可以与包和外部库一起工作。它是一个命令行实用程序,用于识别和安装构建或安装包的依赖项。rosdeep本身并不是一个包管理器,它是一个元包管理器,它使用自己对系统和依赖关系的了解来查找要在特定平台上安装的适当包。实际的安装是使用系统包管理器完成的(例如,在Debian/Ubuntu上使用apt,在Fedora/RHEL上使用dnf等)。
它最常在构建工作区之前被调用,用于在工作区中安装包的依赖项。
它能够在单个包或包目录(例如工作区)上工作。
简单介绍package.xml文件
package.xml文件中的依赖项通常被称为“rodep key”。这些依赖由包的创建者手动填充到package.xml文件中,并且应该是它所需的所有非内置库和包的详尽列表。
<depend>
这些是应该在构建时和运行时为包提供的依赖项。对于c++包应当使用<depend>标签声明依赖。纯Python包通常没有构建阶段,所以不应该使用这个,而应该使用<exec_depend>。
<build_depend>
有了这种类型的依赖,包的已安装二进制文件不需要安装特定的包。
但是,如果您的包导出的头文件包含来自此依赖项的头文件,则可能会产生问题。在这种情况下,您还需要一个<build_export_depend>。
<build_export_depend>
如果您导出的头文件包含来自依赖项的头文件,则<build_depend>依赖于该包的其他包将需要它。这主要适用于头文件和CMake配置文件。导出的库所引用的库包通常应该指定<depend>,因为在执行时也需要它们。
<exec_depend>
这个标签声明了共享库、可执行文件、Python模块、启动脚本和运行包时所需的其他文件的依赖关系。
<test_depend>
该标签声明仅测试需要的依赖项。这里的依赖项不应该与<build_depend>、<exec_depend>或<depend>指定的内容重复。
rosdeep是如何工作的?
rosdep将检查其路径中的package.xml文件或特定包,并查找其中存储的rosdep关键词。然后根据中心索引交叉引用这些关键词,以在各种包管理器中找到适当的ROS包或软件库。最后,一旦找到这些包,就可以安装它们了。
rosdep通过检索本地机器上的中央索引来工作,这样它就不必每次运行时都访问网络(在Debian/Ubuntu上,它的配置存储在/etc/ ross / rosdeep /sources.list.d/20-default.list中)。
如何知道在package.xml中放入哪些关键词?
如果你想要依赖的包是基于ROS的,并且已经发布到ROS生态系统中,例如nav2_bt_navigator,你可以简单地使用包的名称。您可以在<distro>/distribution的https://github.com/ros/rosdistro中找到所有已发布的ROS包的列表(例如humble/distribution.yaml)。
如果您希望依赖于非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]
这意味着我们的rodep关键词是doxygen,它将解析为不同操作系统的包管理器中的不同名称进行安装。
如何使用rodep工具?
rosdep安装
如果您将rosdep与ROS一起使用,那么它可以方便地与ROS发行版一起打包。这是获得rodep的推荐方法。你可以安装它:
apt-get install python3-rosdep
在Debian和Ubuntu上,有另一个类似命名的包python3-rosdep2。如果安装了该包,请确保在安装python3-rosdep之前将其删除。
如果您在ROS之外使用rosdep,则系统包可能不可用。在这种情况下,您可以直接从https://pypi.org:安装它
pip install rosdep
rosdep操作
现在我们已经对rosdep、package.xml和rosdistro有了一些了解,我们准备使用这个实用程序本身了!首先,如果这是第一次使用rodep,它必须通过以下方式初始化:
sudo rosdep init
rosdep update
这将初始化rosdep, update将更新本地缓存的rosdistro索引。偶尔更新rodep以获得最新的索引是一个好主意。
最后,我们可以运行rosdep install来安装依赖项。通常,这是在一个工作空间上运行的,在一个调用中有许多包来安装所有依赖项。如果在包含源代码的目录src的工作空间的根目录中,对它的调用将如下所示。
rosdep install --from-paths src -y --ignore-src
--from-paths SRC指定检查要解析key的package.xml文件的路径
-y表示对来自包管理器的所有提示默认为“是”,以便在没有提示的情况下安装
--ignore-src表示忽略安装依赖项,如果包本身也在工作区中,即使存在rodep关键词,也忽略安装。
还有其他可用的参数和选项。使用rosdep -h查看它们,或者在http://docs.ros.org/en/independent/api/rosdep/html/上查看更完整的rosdep文档。