当前位置: 首页 > news >正文

wstool的一个完整的工作流解析

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.dtcms.com/a/320989.html

相关文章:

  • 安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击
  • 【Day 19】Linux-网站操作
  • mac笔记本如何重新设置ssh key
  • 使用 ECharts GL 实现 3D 中国地图点位飞线效果
  • GoLand 项目从 0 到 1:第六天 —— 权限接口开发与问题攻坚
  • 笔试——Day32
  • pycharm常见环境配置和快捷键
  • 微软XBOX游戏部门大裁员
  • vue项目常见BUG和优化注意事项
  • HTTP 请求返回状态码和具体含义?200、400、403、404、502、503、504等
  • OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制
  • 智能厨具机器人的革命性升级:Deepoc具身模型外拓板技术解析
  • 【Rust】多级目录模块化集成测试——以Cucumber为例
  • 服务器登上去,显示 failed to send WATCHDOG 重启有效吗?
  • 当服务器多了时,如何管理?
  • 机柜内部除了服务器还有哪些组件?
  • 防火墙概述
  • 手动开发一个TCP服务器调试工具(四):构建完整的UI与功能联合的TCP服务器应用
  • 脚本统计MongoDB集合结构信息
  • 从0开始的中后台管理系统-5(userList动态展示以及上传图片和弹出创建用户表单)
  • 【MongoDB学习笔记1】MongoDB的常用命令介绍-数据库操作、集合操作、文档操作、文档分页查询、高级查询
  • 操作系统: 线程(Thread)
  • Lazada东南亚矩阵营销破局:指纹手机如何以“批量智控+数据中枢”重构运营生态
  • Android 之 OOM的产生和解决办法
  • Android 之 ANR问题的全面解析与优化方案
  • 综合项目记录:自动化备份全网服务器数据平台
  • 日本站群服务器与普通日本服务器对比
  • 深入解析C++流运算符(>>和<<)重载:为何必须使用全局函数与友元机制
  • [论文阅读] 人工智能 + 软件工程 | LLM协作新突破:用多智能体强化学习实现高效协同——解析MAGRPO算法
  • 在发布应用程序内测时如何选择合适的分发上架方式?