moveit的仓库源码编译的时候使用的是wstool来拉取仓库的所有内容文件,其命令流程如下:

wstool init src
wstool merge -t src https://raw.githubusercontent.com/moveit/moveit/master/moveit.rosinstall
wstool update -t src
rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO}

这四条命令是 ROS (特别是 ROS 1) 中从源代码构建复杂项目(如 MoveIt)的经典标准流程。让我们在这篇文章中一步一步、非常详细地拆解它们。

宏观目标

这组命令的最终目标是:在一个干净的工作空间中,下载著名机器人运动规划库 MoveIt 的所有源代码包,并安装编译这些源代码所需要的全部系统依赖。

这为你接下来运行 catkin build 编译整个 MoveIt 套件做好了万全的准备。


命令逐条详解

1. wstool init src
  • 命令拆解:

    • wstool: 调用 “Workspace Tool” 这个工具。它的专长是管理工作空间中的多个源代码仓库。
    • init: 是 wstool 的一个子命令,意为 “initialize” (初始化)。
    • src: 是 init 命令的目标参数,指定了要在哪个目录下进行初始化。通常在 ROS 工作空间中,所有源代码都放在 src 目录里。
  • 作用与效果:
    这条命令会在 src 目录下创建一个隐藏的配置文件.rosinstall
    此时,这个文件几乎是空的。它的存在告诉 wstool:“这个 src 目录现在是一个由我管理的源代码空间了。”

  • 通俗比喻:
    想象你准备去超市大采购,src 目录是你的购物车。运行 wstool init src 就好比在你的购物车里放了一张空白的购物清单 (.rosinstall 文件)。你还没有往清单上写任何东西,但清单已经准备好了。


2. wstool merge -t src https://raw.githubusercontent.com/moveit/moveit/master/moveit.rosinstall
  • 命令拆解:

    • wstool merge: merge (合并) 是 wstool 的另一个子命令。它的作用是将一个外部的 .rosinstall 文件的内容合并到你本地的 .rosinstall 文件中。
    • -t src: -t--target-workspace 的缩写。这个参数告诉 wstool 你的本地工作空间(也就是 .rosinstall 文件所在的位置)是 src 目录。
    • https://.../moveit.rosinstall: 这是一个 URL,直接指向 MoveIt 项目官方维护的一个 .rosinstall 文件。这个文件里详细列出了构成完整 MoveIt 所需的所有独立 Git 仓库的地址和版本信息
  • 作用与效果:
    wstool 会下载这个 URL 指向的 moveit.rosinstall 文件,读取里面的所有条目(比如 moveit_core, moveit_ros, srdfdom 等仓库的 Git 地址和要使用的分支),然后把这些条目全部添加到你本地的 src/.rosinstall 文件中。
    请注意:这一步只更新了清单,还没有下载任何代码!

  • 通俗比喻:
    你找到了 MoveIt 官方提供的“标准采购清单”。运行 wstool merge 就好比把你购物车里那张空白的购物清单拿出来,然后把 MoveIt 官方清单上的所有商品条目(“A仓库的xx分支”、“B仓库的yy标签”…)都抄写到了你自己的清单上。现在,你的购物清单已经写满了。


3. wstool update -t src
  • 命令拆解:

    • wstool update: update (更新) 是 wstool 最核心的命令之一。
    • -t src: 同样,指定 wstool 的工作目录。
  • 作用与效果:
    这是真正开始干活的命令。wstool 会读取 src/.rosinstall 文件(现在已经填满了来自 MoveIt 的条目),然后:

    1. 遍历清单上的每一个条目。
    2. 对于每一个条目,它会检查 src 目录下是否已经有对应的代码库。
    3. 如果没有,它会根据清单上的地址和版本控制系统(通常是 Git)执行 git clone,将整个仓库下载到 src 目录下。
    4. 如果已经存在,它会执行 git pull 或类似操作,确保本地代码库更新到清单上指定的分支或标签的最新状态。

    执行完毕后,你的 src 目录里会多出十几个甚至几十个新的文件夹,每一个都是 MoveIt 的一个源代码包。

  • 通俗比喻:
    这是**“开始采购!”的时刻。你拿着写满商品的清单,在超市里穿梭。wstool update 就是那个根据清单,把货架上所有对应的商品(源代码)一件件地拿下来,放进你的购物车(src 目录)的过程**。


4. rosdep install -y --from-paths src --ignore-src --rosdistro ${ROS_DISTRO}
  • 命令拆解:

    • rosdep: 调用 “ROS Dependency” 工具。它的工作是解决 ROS 包的系统依赖。它不关心源代码本身,只关心编译这些代码需要先在系统上安装什么。
    • install: 子命令,表示要安装依赖。
    • -y: 自动对所有安装提示回答 “yes”。这在自动化脚本中很方便,避免了手动确认。
    • --from-paths src: 这是一个关键参数。它告诉 rosdep:“请扫描 src 目录下的所有包,读取它们各自的 package.xml 文件,并找出它们声明的所有依赖项。”
    • --ignore-src: 这是另一个至关重要的参数。它告诉 rosdep:“在分析依赖关系时,如果你发现一个包的依赖项本身就已经存在于 src 目录中(即我们刚刚下载的源代码),请忽略它,不要尝试用系统的包管理器(如 apt)去安装它。” 这是为了避免你试图用 apt install ros-noetic-moveit-core 来满足依赖,而实际上你正准备从源码编译它。
    • --rosdistro ${ROS_DISTRO}: 明确指定你当前的 ROS 发行版(比如 noetic, humble 等)。${ROS_DISTRO} 是一个环境变量,通常在你 source ROS 的 setup.bash 后会自动设置。依赖项在不同 ROS 版本中可能不同,所以这个参数是必需的。
  • 作用与效果:
    rosdep 会执行一个复杂的查找和安装过程:

    1. 遍历 src 目录下的所有 package.xml 文件。
    2. 汇总所有在 <depend><build_depend> 等标签中声明的依赖项。
    3. 剔除掉那些已经存在于 src 目录中的包(因为 --ignore-src)。
    4. 对于剩下的依赖项(例如 libbullet-dev, libeigen3-dev, ros-noetic-octomap 等),它会查询一个在线数据库,找到这些 ROS 依赖名对应到你操作系统(如 Ubuntu)上的具体软件包名。
    5. 最后,调用系统的包管理器(如 sudo apt-get install ...)来安装所有缺失的软件包。
  • 通俗比喻:
    你已经把所有宜家家具的平板包装(源代码)买回了家。现在,rosdep install 就是拿出所有包装里的安装说明书 (package.xml),把需要用到的所有工具(螺丝刀、扳手、胶水等,即系统库 lib-xxx 和其他基础 ROS 包)列成一个清单,然后去五金店(apt 仓库)把家里没有的工具一次性全部买齐

总结

这个流程是一个逻辑清晰、分工明确的过程:

  1. wstool init: 准备一个容器(src 目录)和清单。
  2. wstool merge: 将项目所需的源代码列表填入清单。
  3. wstool update: 根据清单,下载所有源代码。
  4. rosdep install: 检查所有下载的源代码,并为其安装所有外部的编译依赖。

完成这四步之后,所有的“原材料”和“工具”都已经备齐,你就可以在工作空间的根目录运行 catkin build 来启动“总装工程”了。

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

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

相关文章

对数函数分段定点实现

目录 一、原理介绍 二、代码实现 三、结果显示 四、移植到C语言中的应用 4.1. 定义定点数配置和参数 4.2. 实现分段查找函数 4.3. 实现 log10 近似计算函数 4.4. &#xff08;可选&#xff09;定点数转浮点数 一、原理介绍 之前的博文对数函数分段线性实…

qt系统--事件

文章目录qt系统事件处理鼠标事件鼠标移动事件处理键盘事件定时器事件窗口移动和大小改变事件结语很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 作者&#xff1a;٩( ‘ω’ )و260 我的专栏&#xff1a…

Linux机器可直接使用的自动化编译文件

还在为了Linux机器上一遍遍输入编译指令苦恼吗&#xff1f;你需要make指令以及自己的makefile文件&#xff01;在makefile中写入自己的个性化指令&#xff0c;让编译速度飞起&#xff0c;支持多文件编译一下文件为个人应用&#xff0c;可以直接cp到相应项目的目录&#xff0c;每…

Linux学习-数据结构(哈希表)

1.哈希表1.哈希算法将数据通过哈希算法映射成一个关键值&#xff0c;存放都在同一位置实现数据的高效存储和查找&#xff0c;将时间复杂度尽可能降低至O&#xff08;1&#xff09;2.哈希碰撞多个数据通过哈希算法得到的键值相同&#xff0c;称为产生哈希碰撞3.哈希表构建哈希表…

Google Chrome <139.0.7236.0 UAF漏洞

【高危】Google Chrome <139.0.7236.0 UAF漏洞 漏洞描述 Google Chrome 是美国谷歌&#xff08;Google&#xff09;公司的一款Web浏览器。 受影响版本中&#xff0c;OpenscreenSessionHost::ReportAndLogError 方法的参数使用了 std::string_view 类型来接收错误消息。当一…

CentOS8 Stream 网卡配置及重启

在 CentOS 8 Stream 中&#xff0c;网卡配置已由 NetworkManager 管理&#xff0c;传统的 ifcfg-eth0 文件仍然支持&#xff0c;但推荐使用 nmcli 或 nmtui 工具进行网络配置和管理。以下是网卡配置及重启的详细步骤&#xff1a;1. 查看当前网卡状态列出所有网卡bash复制nmcli …

SpringMvc的原理深度剖析及源码解读

一、springmvc启动加载流程1、引入spring-web.jar包时&#xff0c;在这个包的META-INF/services/javax.servlet.ServletContainerInitializer文件中定义的加载类SpringServletContainerInitializer,提供给springmvc实现初始化的操作。2、在SpringServletContainerInitializer类…

【ESP32-menuconfig(1) -- Build Type及Bootloader config】

Build Type Bootloader configmenuconfig介绍Build typeCONFIG_APP_BUILD_TYPECONFIG_APP_BUILD_TYPE_PURE_RAM_APPCONFIG_APP_REPRODUCIBLE_BUILDCONFIG_APP_NO_BLOBSCONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSCONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSBootloader config…

C++信息学奥赛一本通-第一部分-基础一-第3章-第1节

C信息学奥赛一本通-第一部分-基础一-第3章-第1节 2051 偶数 #include <iostream>using namespace std;int main() {int number; cin >> number;if (number % 2 0) {cout << "yes";} }2052 范围判断 #include <iostream>using namespace std…

自由学习记录(79)

PBRBRDF原理&Unity实现深入浅出_哔哩哔哩_bilibili 进行改进 一个像素点对应一个范围内的 一个微表面--一个由无数个起起伏伏的结构组成的物理结构 屏幕上的每一个像素点&#xff0c;在渲染时通常会被视为一个“微表面”的代表 比如在这个图中&#xff0c;只关心红色的区…

复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​

一、行业痛点&#xff1a;动态交通场景的识别困境据《2024中国智慧交通白皮书》统计&#xff0c;城市核心路段违停误报率高达35%&#xff0c;主要源于两大难点&#xff1a;​​短暂停靠干扰​​&#xff1a;出租车临时停靠与违停行为特征重叠​​复杂背景干扰​​&#xff1a;树…

大语言模型提示工程与应用:提示词基础使用方式

提示词使用方式 学习目标 在本课程中&#xff0c;我们将学习更多关于提示词使用方式。 相关知识点 提示词使用 学习内容 1 提示词使用 1.1 文本摘要 语言模型最典型的应用场景之一就是文本摘要。我们可以通过以下提示实现基础摘要功能&#xff1a; 提示: 解释抗生素是什么回答&…

常见命令-资源查看-iostat命令实践

文章目录 系统中未安装 iostat 命令 1. 监控CPU与磁盘的基础负载 2. 诊断I/O性能瓶颈 3. 实时监控与动态采样 4. 特定设备或分区的精细化监控 5. 性能测试与基准数据生成 6. 结合其他工具进行综合调优 总结 结果输出速查表 第一部分:CPU统计信息 第二部分:设备/磁盘统计信息(…

WinForm 实战 (进度条):用 ProgressBar+Timer 打造动态进度展示功能

目录 核心控件解析​ ProgressBar 进度条​ Timer 定时器​ 实战案例 常见应用场景​ 总结​ 在 WinForm 桌面应用开发中&#xff0c;进度反馈是提升用户体验的关键环节。无论是文件处理、数据加载还是复杂计算&#xff0c;一个直观的进度条能让用户清晰了解任务状态&…

使用 ast-grep 精准匹配指定类的方法调用(以 Java 为例)

使用 ast-grep 精准匹配指定类的方法调用&#xff08;以 Java 为例&#xff09; 在代码重构、安全审计或静态分析的场景中&#xff0c;我们常常需要匹配某个特定类中定义的方法调用。而 ast-grep 作为一款基于语法树的代码搜索工具&#xff0c;提供了强大的模式匹配功能&#…

Dijkstra?spfa?SPstra?

带负权的无负环最短路问题 对于一张有负边权的图&#xff0c;普通 Dijkstra 就不能用了&#xff0c;比如&#xff1a;正常的 Dijkstra 扩散的节点依次为 1,3,2,41,3,2,41,3,2,4。 这时候可以发现&#xff0c;当点 222 扩散的时候&#xff0c;原本达到点 333 的路径长度是 111&a…

React函数组件灵魂搭档:useEffect深度通关指南!

你以为它只是替代componentDidMount&#xff1f;数据抓取、事件绑定、定时清理...&#xff1f;事实上&#xff0c;useEffect才是函数组件的“幕后操控者”&#xff01;但依赖数组的坑、闭包的陷阱&#xff0c;你真的玩转了吗&#xff1f; 告别“能用就行”&#xff0c;今天带你…

LabVIEW实验室测试框架

在实验室测试场景中&#xff0c;选用合适的 LabVIEW 框架能够极大提升测试效率、优化测试流程并保障测试结果的准确性。介绍几款常用且功能强大的 LabVIEW 测试框架&#xff1a;​TestStand​框架概述​TestStand 是 NI 公司专为测试系统开发设计的一款测试执行管理框架。它能够…

Kiro :从“规范”到“实现”的全流程 AI 助手

为什么是 Kiro Kiro 是一款面向“规范驱动开发”&#xff08;Spec-Driven Development&#xff09;的 AI 开发助手。与只在“写代码”环节辅助不同&#xff0c;Kiro 将“从需求到设计再到实现”的完整链路显性化&#xff0c;把需求、设计、任务分解、代码与测试、文档等全部纳…

【0基础PS】PS工具详解--矩形工具

目录前言一、矩形工具的基础认知​二、矩形工具的选项栏详解​三、矩形工具的绘制技巧​四、矩形工具的实际应用场景​五、常见问题与解决方案​总结前言 在 Photoshop&#xff08;简称 PS&#xff09;的众多绘图工具中&#xff0c;矩形工具是使用率极高的基础工具之一。无论是…