使用 rosdep 管理 ROS 2 依赖项

系列文章目录


文章目录

  • 系列文章目录
  • 前言 清华源镜像使用
  • 一、什么是 `rosdep`?
  • 二、关于 `package.xml` 文件的一些小知识
  • 三、`rosdep` 是如何工作的?
  • 四、如何知道在 `package.xml` 中输入哪些 `key` ?
  • 五、如何使用 rosdep 工具?
    • 5.1 rosdep 安装
    • 5.2 rosdep 使用
  • 六、rosdep 说明
  • `如果觉得内容不错,请点赞、收藏、关注`


前言 清华源镜像使用

本教程将介绍如何使用 rosdep 管理外部依赖关系。

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

在 rosdep 使用流程中,我们会有如下两个步骤

sudo rosdep init
rosdep update

我们替换为以下步骤

# 手动模拟 rosdep init
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
# 为 rosdep update 换源
export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
rosdep update# 每次 rosdep update 之前,均需要增加该环境变量
# 为了持久化该设定,可以将其写入 .bashrc 中,例如
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc

一、什么是 rosdep

rosdep 是一种依赖性管理工具,可以处理软件包和外部库。rosdep 本身并不是一个软件包管理器;它是一个元软件包管理器,利用自身对系统和依赖关系的了解,在特定平台上找到合适的软件包进行安装。实际安装是通过系统软件包管理器(如 Debian/Ubuntu 上的 apt、Fedora/RHEL 上的 dnf 等)完成的。

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

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

从名字上看,rosdep 是为 ROS 设计的,但其实它与 ROS 是半对立的。你可以将它作为一个独立的 Python 软件包安装,在非
ROS 软件项目中使用这个强大的工具。成功运行 rosdep 依赖于可用的 rosdep 密钥,只需几条简单的命令就能从公共 git
仓库下载。

二、关于 package.xml 文件的一些小知识

package.xml 是软件中的一个文件,rosdep 会在其中找到一系列依赖项。package.xml 中的依赖关系列表必须完整、正确,这样所有工具才能确定软件包的依赖关系。缺少或不正确的依赖关系会导致用户无法使用软件包,工作区中的软件包被无序构建,以及软件包无法发布。

package.xml 文件中的依赖关系通常被称为 “rosdep keys”。这些依赖关系由软件包的创建者手动填充到 package.xml 文件中,并应详尽无遗地列出软件包所需的所有非构建库和软件包。

它们用以下标记表示(完整规范请参见 REP-149):

  1. <depend>
    这些是软件包在构建和运行时都应提供的依赖项。对于 C++ 软件包,毫无疑问,请使用此标记。纯 Python 软件包通常没有联编阶段,因此不应使用此标记,而应使用 <exec_depend>
  2. <build_depend>
    如果只在构建软件包时而不是在执行时使用特定的依赖关系,可以使用 <build_depend> 标签。
    有了这种依赖关系,软件包的已安装二进制文件就不需要安装该特定软件包了。
    不过,如果你的软件包导出的头文件包含了该依赖的头文件,那就会产生问题。在这种情况下,您还需要使用 <build_export_depend>
  3. <build_export_depend>
    如果您导出的头文件包含依赖包中的头文件,那么其他 <build_depend> 依赖于您的软件包也会需要该头文件。这主要适用于头文件和 CMake 配置文件。由您导出的库引用的库包通常应指定 ,因为在执行时也需要它们。
  4. <exec_depend>
    该标签声明了运行软件包时所需的共享库、可执行文件、Python 模块、启动脚本和其他文件的依赖关系。
  5. <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,可以在网上找到。我们将在下一节进一步探讨。

四、如何知道在 package.xml 中输入哪些 key

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

如果您想在软件包中依赖的软件包是基于 ROS 的,并且已经发布到 ROS 生态系统 1 中,例如 nav2_bt_navigator,那么您只需使用软件包的名称即可。你可以在 https://github.com/ros/rosdistro 的 <distro>/distribution.yaml (例如 humble/distribution.yaml)中找到所有已发布的 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,它可以在不同操作系统的软件包管理器中解析为不同的名称进行安装。

五、如何使用 rosdep 工具?

5.1 rosdep 安装

如果将 rosdep 与 ROS 结合使用,它将与 ROS 发行版一起打包,非常方便。这是获取 rosdep 的推荐方法,你可以用以下方法安装它:

apt-get install python3-rosdep

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

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

pip install rosdep

5.2 rosdep 使用

既然我们已经对 rosdep、package.xml 和 rosdistro 有了一定的了解,那么我们就可以使用该工具本身了!首先,如果这是第一次使用 rosdep,必须通过以下方式对其进行初始化:

sudo rosdep init
rosdep update

这将初始化 rosdep,而 update 将更新本地缓存的 rosdistro 索引。偶尔更新一下 rosdep 以获取最新索引是个好主意。

最后,我们可以运行 rosdep install 安装依赖包。通常情况下,我们会在一个包含许多软件包的工作区中一次性调用该程序,以安装所有依赖包。如果在工作区的根目录下,src 目录包含源代码,则会出现如下调用。

rosdep install --from-paths src -y --ignore-src
rosdep install -i --from-path src --rosdistro iron -y

如下:

  • –from-paths src 指定了检查 package.xml 文件的路径,以便为其解析密钥。

  • -y表示对软件包管理器的所有提示默认为 “是”,安装时无需提示

  • –ignore-src "表示如果软件包本身也在工作区中,即使存在 rosdep 密钥,也会忽略安装依赖包。

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

六、rosdep 说明

Usage: rosdep [options] <command> <args>Commands:rosdep check <stacks-and-packages>...check if the dependencies of package(s) have been met.rosdep install <stacks-and-packages>...download and install the dependencies of a given package or packages.rosdep dbgenerate the dependency database and print it to the console.rosdep initinitialize rosdep sources in /etc/ros/rosdep.  May require sudo.rosdep keys <stacks-and-packages>...list the rosdep keys that the packages depend on.rosdep resolve <rosdeps>resolve <rosdeps> to system dependenciesrosdep updateupdate the local rosdep database based on the rosdep sources.rosdep what-needs <rosdeps>...print a list of packages that declare a rosdep on (at leastone of) <rosdeps>rosdep where-defined <rosdeps>...print a list of yaml files that declare a rosdep on (at leastone of) <rosdeps>rosdep fix-permissionsRecursively change the permissions of the user's ros home directory.May require sudo.  Can be useful to fix permissions after calling"rosdep update" with sudo accidentally.Options:-h, --help            show this help message and exit--os=OS_NAME:OS_VERSIONOverride OS name and version (colon-separated), e.g.ubuntu:lucid-c SOURCES_CACHE_DIR, --sources-cache-dir=SOURCES_CACHE_DIROverride /home/kuanli/.ros/rosdep/sources.cache-v, --verbose         verbose display--version             print just the rosdep version, then exit--all-versions        print rosdep version and version of installers, thenexit--reinstall           (re)install all dependencies, even if alreadyinstalled-y, --default-yes     Tell the package manager to default to y or fail wheninstalling-s, --simulate        Simulate install-r                    Continue installing despite errors.-q                    Quiet. Suppress output except for errors.-a, --all             select all packages-n                    Do not consider implicit/recursive dependencies.  Onlyvalid with 'keys', 'check', and 'install' commands.-i, --ignore-packages-from-source, --ignore-srcAffects the 'check', 'install', and 'keys' verbs. Ifspecified then rosdep will ignore keys that are foundto be catkin or ament packages anywhere in theROS_PACKAGE_PATH, AMENT_PREFIX_PATH or in any of thedirectories given by the --from-paths option.--skip-keys=SKIP_KEYSAffects the 'check' and 'install' verbs. The specifiedrosdep keys will be ignored, i.e. not resolved and notinstalled. The option can be supplied multiple times.A space separated list of rosdep keys can also bepassed as a string. A more permanent solution tolocally ignore a rosdep key is creating a local rosdeprule with an empty list of packages (include it in/etc/ros/rosdep/sources.list.d/ before the defaults).--filter-for-installers=FILTER_FOR_INSTALLERSAffects the 'db' verb. If supplied, the output of the'db' command is filtered to only list packages whoseinstaller is in the provided list. The option can besupplied multiple times. A space separated list ofinstallers can also be passed as a string. Example:`--filter-for-installers "apt pip"`--from-paths          Affects the 'check', 'keys', and 'install' verbs. Ifspecified the arguments to those verbs will beconsidered paths to be searched, acting on all catkinpackages found there in.--rosdistro=ROS_DISTROExplicitly sets the ROS distro to use, overriding thenormal method of detecting the ROS distro using theROS_DISTRO environment variable. When used with the'update' verb, only the specified distro will beupdated.--as-root=INSTALLER_KEY:<bool>Override whether sudo is used for a specificinstaller, e.g. '--as-root pip:false' or '--as-root"pip:no homebrew:yes"'. Can be specified multipletimes.--include-eol-distrosAffects the 'update' verb. If specified end-of-lifedistros are being fetched too.-t DEPENDENCY_TYPES, --dependency-types=DEPENDENCY_TYPESDependency types to install, can be given multipletimes. Choose from {'exec', 'buildtool','buildtool_export', 'test', 'build_export', 'doc','build'}. Default: all except doc.

如果觉得内容不错,请点赞、收藏、关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针&#xff0c;快指针一次走两个&#xff0c;慢指针一次走一个&#xff0c;如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了&#xff0c;但是网络上找到的例程很多都额外增加了对time库的引用。只能说&#xff0c;这样不会出现错误&#xff0c;但是这样肯定会有一些计算资源上的消耗。 #!/u…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证&#xff0c;但这种信任策略存在一定的局限性。为了解决这一问题&#xff0c;零信任网络作为一种全新的网络安全架构&#xff0c;逐渐受到人们的关注。本文将对零信任网络的概念…

MATLAB算法实战应用案例精讲-【图像处理】数字图像处理

目录 几个高频面试题目 图像分类、图像识别、目标检测的优缺点分析与算法比较 知识储备

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具&#xff0c;在回答“同步网盘云盘哪个好用”这个问题之前&#xff0c;我们需要知道什么样的同步网盘、同步云盘算好用&#xff1f; 什么样的同步网盘云盘好用&#xff1f; 1、存储空间大 对于文件管理工具而言&#xff0c;存储空…

ORM-1 字段默认值

当在odoo页面新建一条记录的时候&#xff0c;前端会通过rpc调用后端模型的default_get 函数&#xff0c;根据前端传入的字段列表&#xff0c;来获取相对应的字段默认值。# odoo/models.pyapi.modeldef default_get(self, fields_list):""" default_get(fields_l…

[Hive] Map类型在表中是如何存储的

在 Hive 中&#xff0c;Map 类型是指键值对的集合&#xff0c;其中键和值都可以是任意数据类型。 在 Hive 表中&#xff0c;Map 类型通常被存储为结构体或者键值对列表。 具体来说&#xff0c;在表中&#xff0c;Map 类型通常分为以下两种存储方式&#xff1a; 文章目录 结构…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…

Go并发编程

一、goroutine 和 通道 在Go语言中&#xff0c;每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中&#xff0c;只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单&#xff0c;例如有一个函数&…

GZ035 5G组网与运维赛题第9套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

springboot actuator jvm监控丢失

1、背景 系统接入了监控prometheus和grafana&#xff0c;某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标&#xff0c;发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料&#xff0c;逐一…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年&#xff0c;Paas化刚刚提出不久时&#xff0c;基于部门内第一次Paas化热部署落地经验所写&#xff0c;主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先&#xff0c;确定领域服务所属的领域 2.其次&#xff0c;确定垂直…

leetcode经典面试150题---6.旋转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

2024上海国际合成生物学与绿色生物制造展览会8月7-9号上海举办

2024年8月7日至9日&#xff0c;一场生物制造领域的盛会将在上海新国际博览中心闪亮登场。那就是2024上海国际合成生物学与绿色生物制造展览会。这场盛会将同期举办2024第13届上海国际生物发酵展&#xff0c;形成了一个强大的“生物军团”&#xff0c;展现出生物科技领域的无限魅…