ROS 2边学边练(21)-- 用rosdep管理依赖项

        从此篇开始,我们即将告别入门阶段,走上进阶之路,还是要照常hold住信心啊!作为进阶篇的开始,我们今天轻松点,只动眼不动手,周末了稍稍躺平一下。

rosdep是啥

        还记得之前在构建一个包之前都被建议要检查下依赖项吗,rosdep install --from-paths src -y --ignore-src,就是这串有点脸熟的命令,这里面就出现了rosdep,那这个rosdep到底是个啥呢?其实大家应该也能七七八八猜个大谱,但更官方更专业的叫法,它被称之为依赖关系管理实用程序(dependency management utility),又被称之为元包管理器(meta-package manager),与通常意义上的软件包管理器可不一样(比如Ubuntu里面的apt就是一种软件包管理器),它只负责根据它对系统和依赖关系了解到的规则去寻找适合目标平台安装的包,真正的安装动作则是由真正的软件包管理器来实施。它不但能够应用于单个的包还能应用到包的目录上(如工作空间)。

        虽然rosdep里面带了个ros,貌似专为ROS定制的,但是呢,它居然还能被用到非ROS的软件工程项目上,具体用法后面如果有幸碰到类似的案例,我们再来研究,这不是当前阶段的重点。

package.xml的一点内容

        package.xml是rosdep查找依赖关系的文件,在我们构建包的过程中,该文件里面的依赖列表是需要我们手动添加的,而且可千万别发生遗漏或不正确的情况,否则种瓜得瓜种豆得豆,不但导致构建时出现问题,即使侥幸构建成功但别人也用不了你的包,更别提包的发布了。

        package.xml文件中的依赖项通常被称为“rosdep-keys”。这些依赖项由包的创建者手动填充到package.xml文件中,并且应该是所需的任何非内置库和包的详尽列表。

        下面列举出一些比较有代表性的标签(详细说明请参考REP-149):

<depend>

        此标签内的依赖项是那些在包构建时和运行时都要用的,对于C++包来说,最保险的做法就是添加上这个标签(有钱没钱回家过年),而对于纯python写的包,因为python是解释型语言,没有编译构建这一步骤,所以只在运行时需要用到依赖,可以替代为<exec_depend>这个标签。

<build_depend>

        如果运行时用不到依赖,只在编译构建时需要一个特别的依赖项,那我们就可以用这个标签。那么这样此包的二进制安装时就不需要再安装这个特别的包了(因为在构建时已经被包含编译进去了)。

        然而,如果你的包导出了一个包含来自某个依赖项的头文件的头文件,这可能会引发一个问题。在这种情况下,我们还需要一个<build_export_depend>(构建导出依赖)标签来解决问题。

<build_export_depend>

        如果你导出一个头文件,该头文件又包含了来自一个依赖项的头文件,那么其他<build_depend>(构建依赖)于你的包的包也将需要这个头文件。这主要适用于头文件和CMake配置文件。你所导出的库所引用的库包应该通常指定<depend>(依赖),因为它们也需要在执行时使用(是不是有点绕,后面具体使用时再加体会即可,此时不理解没关系)。

<exec_depend>

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

<test_depend>

        此标记声明仅测试所需的依赖项。此处的依赖项不应与<build_depend>、<exec_depend>或<dependent>指定的键重复。

rosdep如何工作

        rosdep 会在其路径中或针对特定包检查 package.xml 文件,并查找其中存储的 rosdep 键。然后,这些键会与中央索引进行交叉引用,以在各种包管理器中找到适当的 ROS 包或软件库。最后,一旦找到这些包,它们就会被安装并准备就绪!

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

这个中央索引被称为 rosdistro,可以在线找到。我们将在下一节更详细地探讨它。

        简而言之,rosdep 是一个工具,它使用中央索引(rosdistro)来解析和安装 ROS 包的依赖项。它通过读取 package.xml 文件中的 rosdep 键,然后查找和安装相应的依赖包,使 ROS 开发者能够更方便地管理和构建他们的项目。通过将索引存储在本地,rosdep 可以在不依赖网络连接的情况下运行,提高了工作效率。

我如何知道我该添加什么键(依赖项)到package.xml

        这个问题连官方原文的作者都报以慈祥的微笑(●'◡'●),官方是这么回答的:

  • 如果你想在你的包中依赖一个基于ROS的包,并且这个包已经被发布到ROS生态系统中,例如nav2_bt_navigator,你可以直接使用该包的名称。你可以在https://github.com/ros/rosdistro(添加到浏览器收藏夹啊)上找到所有已发布的ROS包的列表的<distro>/distribution.yaml文件(例如humble/distribution.yaml)。
  • 如果你想依赖一个非ROS的包,通常被称为“系统依赖”,你需要找到特定库的键。一般来说,有两个文件值得关注:

        rosdep/base.yaml包含了apt系统的依赖项

        rosdep/python.yaml包含了python的依赖项

        举个例子,方便理解。假设一个包依赖于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会根据不同的操作系统的包管理器将其解析为相应的安装名称。这样,无论是在Ubuntu、Debian还是其他支持的操作系统上,rosdep都能确保使用正确的包名来安装doxygen。这使得开发者可以更方便地跨平台管理依赖关系,而无需关心每个系统具体的包名差异。

如果rosdistro里面找不到我的库呢

        那就手动添加到里面,贡献新键的方法大家可以看看,众人拾柴火焰高,这就是开源的魅力。如果出于某种原因,这些索引可能没有公开提供,则可以派生一个rosdistro并维护备用索引以供使用。

如何使用rosdep工具       

安装rosdep

$apt-get install python3-rosdep

        但是有点需要注意,在Debian/Ubuntu还有一个差不多名字的包,叫python3-rosdep2,如果我们之前已经安装了这个rosdep2,记得在安装rosdep之前将rosdep2卸载掉。

        如果是在ROS之外的环境使用rosdep,那么像上面那种常规的方法安装的ROS包是不能使用的,我们得从https://pypi.org直接安装:

$pip install rosdep

rosdep的操作

        行文至此,我们已经对rosdep、package.xml、rosdistro有了一点了解,我们现在可以开始介绍下rosdep的使用了。如果是第一次运行rosdep,我们得先初始化并刷新(保证有同步更新最新的内容索引)一下:

$sudo rosdep init
$rosdep update

        还记得之前的一篇文章有介绍如何解决rosdep失败的问题吗(主要是国内网络环境问题引起)?如果你们在执行上面的命令出现超时等失败情况,记得翻回那篇文章参考解决一下。

        最后我们就可以通过rosdep install命令安装针对很多包的所有依赖项了(在工作空间上执行)。如果我们需要针对工作空间根路径下的src路径进行依赖项检查安装(这里面一般包含了该工作空间所包含包的所有依赖项),我们一个经典的语法如下:

$rosdep install --from-paths src -y --ignore-src

从 src 目录中的 ROS 包中查找依赖(但忽略源代码中的依赖),然后自动安装这些依赖。 

  • --from-path src :依赖关系查找路径,指定检查package.xml文件以解析其键的路径(src);
  • -y:依赖安装过程中的所有提示选项都选择yes,省的手动去选择确认的麻烦;
  • --ignore-src:忽略安装依赖项,这个参数告诉 rosdep 在查找依赖时忽略 src 目录中的源代码。这通常用于避免因为源代码的更改而引入不必要的依赖。

        还有其他关于rosdep的用法,我们可以通过rosdep -h进行查找,也可以参考ROS packages — rosdep 0.22.2 documentation这个文档学习到更多的操作。

        今天内容虽然有些概念还是不那么清晰,但是随着后面学习的深入,接触的多了,便会柳暗花明啦。

本篇完。

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

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

相关文章

Coding and Paper Letter(八十九)

CPL之第八十九期。 1 Coding: 1.openai通用代理转换是一个用于将其他厂商服务转为openai 标准接口相应的工具. 通过该工具, 可以将其他厂商的服务转为openai 标准接口. 讯飞星火,通义千问,gemini,openai,copilot,double&#xff0c;kimi&#xff0c;智谱清言 使用spring2webf…

电源监视继电器HRTH-J-2H2D AC220V 导轨安装 JOSEF约瑟

系列型号&#xff1a; HRTH-Y-2H2D-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-Y-2Z-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-Y-2H-X-T跳位监视、合位监视、电源监控继电器&#xff1b; HRTH-J-2H2D-X-T跳位监视、合位监视、电源监控继电器…

数学基础:矩阵

来自: https://www.shuxuele.com/algebra/matrix-determinant.html 一、矩阵的行列式 二、矩阵简单知识 三、矩阵乘法 四、单位矩阵 五、逆矩阵一&#xff1a;简单2阶矩阵求法 六、逆矩阵二&#xff1a;3、4阶逆矩阵求法 6.1 求余子式矩阵 6.2 求代数余子式矩阵 6.3 求伴随矩阵…

pyplot+pandas实现操作excel及画图

1、安装jupyter lab pip install jupyterlab # 启动 建议在指定的项目文件夹下 开启cmd窗口并执行 jupyter lab 启动后会自动打开浏览器访问 2、安装依赖 pip install matplotlib pip install xlrd pip install pandas 3、读取excel import pandas as pddf pd.read_excel(hi…

conda activate xxx-env出现错误CommandNotFoundError

1.问题描述&#xff1a; conda激活虚拟环境时&#xff0c;出现如下错误&#xff1a; conda activate baseCommandNotFoundError: Your shell has not been properly configured to use conda activate. To initialize your shell, run$ conda init <SHELL_NAME>Currentl…

harbor容器删除失败解决办法

docker中harbor容器删除失败 出现的问题以及解决方法 [rootk8s-master-node1 harbor]# docker-compose down [] Running 8/8⠿ Container nginx Removed 0.1s…

区块链游戏:探索未来的可能性与挑战

区块链游戏是一种将区块链技术应用于游戏领域的创新产品&#xff0c;它为游戏行业带来了全新的模式和可能性。本文将深入探讨区块链游戏的优点、挑战和未来趋势&#xff0c;帮助读者了解这一新兴领域。 一、区块链游戏的优点 1. 公平性&#xff1a;区块链技术保证了游戏中的物…

享元模式:优化资源利用的高效策略

在面向对象的软件开发中&#xff0c;享元模式是一种结构型设计模式&#xff0c;旨在减少内存使用&#xff0c;通过共享尽可能多的相似对象来提高应用程序的效率。本文将详细介绍享元模式的定义、实现、应用场景以及优缺点。 1. 享元模式的定义 享元模式&#xff08;Flyweigh…

Rust---方法(Method)

目录 与其他语言的不同函数和方法的不同简单示例self、&self 和 &mut self代码示例关联函数(Associated Functions)关联函数与方法的区别举例说明---关联函数的方法的使用举例说明---关联函数需要使用实例数据实现构造函数方法(为枚举实现方法)在Rust中,方法是与结…

什么是物理服务器?

物理服务器又叫做独立服务器&#xff0c;指物理上的单独服务器&#xff0c;是有着实体的服务器并不是虚拟的&#xff0c;物理服务器也可以理解成一台超大的电脑&#xff0c;但是对于普通的家用电脑来说&#xff0c;物理服务器需要长期处于开机的状态&#xff0c;对于硬件性能消…

Flume实时读取目录文件到HDFS案例

【尚硅谷】大数据技术之Flume教程从入门到实战_哔哩哔哩_bilibili 目录 flume简介 flume案例 1、监控端口数据官方案例 2、实时读取目录文件到HDFS案例 flume简介 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系…

服务限流--一起学习吧之架构

一、主要算法&#xff1a; 计数器算法&#xff1a;该算法定义了一个单位时间&#xff08;如1秒&#xff09;的阈值&#xff0c;每收到一次请求&#xff0c;计数就增加一次。如果请求总数超过当前单位时间内的阈值&#xff0c;就触发限流处理。这种算法简单直观&#xff0c;但存…

代码随想录算法训练营第39天| 62.不同路径、63. 不同路径 II

62.不同路径 力扣题目链接 代码 示例代码 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> result(m, vector<int>(n, 0));for (int i 0; i < n; i) {result[0][i] 1;}for (int i 0; i < m; i) {result[i][0] 1;…

多因子模型的数据处理

优质博文&#xff1a;IT-BLOG-CN 数据处理的基本目的是从多量的、可能是杂乱无章的、难以理解的数据中抽取并推导出有价值、有意义的数据。特别是金融数据&#xff0c;存在数据缺失&#xff0c;不完整以及极端异常值等问题&#xff0c;对于我们的分析和建模影响很多。 对于我…

五、书架开发--3.弹出框功能开发、离线缓存功能开发

实现弹出框真实业务逻辑 私密阅读tab业务逻辑 1、根据点击的tab不同&#xff0c;从而展示出不同的popup弹窗 每个tab中都有自己的index&#xff0c;点击的时候获取这个index&#xff0c;就可以知道当前点击的是哪个tab&#xff0c;然后用switch-case来根据不同的index展示不…

SQL语言

一、DDL数据库定义语言 1、登录mySQL mysql -u"用户名" -p"密码" -h"登录地址 -h&#xff1a;默认为本机 示例&#xff1a; 2、查看当前存在的数据库 show databases; 示例&#xff1a; 3、创建数据库database create…

泰坦尼克号幸存者预测

泰坦尼克号幸存者预测 1、特征工程概述2、数据预处理3、特征选择与提取4、建模与预测 1、特征工程概述 在上篇 泰坦尼克号幸存者数据分析 中&#xff0c;我们对泰坦尼克号的幸存者做了数据分析&#xff0c;通过性别、年龄、船舱等级等不同维度对幸存者进行了分类统计&#xff0…

Leetcode算法训练日记 | day25

一、组合总和Ⅲ 1.题目 Leetcode&#xff1a;第 216 题 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺…

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21”空难的发生…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…