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 的条目),然后:- 遍历清单上的每一个条目。
- 对于每一个条目,它会检查
src
目录下是否已经有对应的代码库。 - 如果没有,它会根据清单上的地址和版本控制系统(通常是 Git)执行
git clone
,将整个仓库下载到src
目录下。 - 如果已经存在,它会执行
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
会执行一个复杂的查找和安装过程:- 遍历
src
目录下的所有package.xml
文件。 - 汇总所有在
<depend>
或<build_depend>
等标签中声明的依赖项。 - 剔除掉那些已经存在于
src
目录中的包(因为--ignore-src
)。 - 对于剩下的依赖项(例如
libbullet-dev
,libeigen3-dev
,ros-noetic-octomap
等),它会查询一个在线数据库,找到这些 ROS 依赖名对应到你操作系统(如 Ubuntu)上的具体软件包名。 - 最后,调用系统的包管理器(如
sudo apt-get install ...
)来安装所有缺失的软件包。
- 遍历
-
通俗比喻:
你已经把所有宜家家具的平板包装(源代码)买回了家。现在,rosdep install
就是拿出所有包装里的安装说明书 (package.xml
),把需要用到的所有工具(螺丝刀、扳手、胶水等,即系统库lib-xxx
和其他基础 ROS 包)列成一个清单,然后去五金店(apt
仓库)把家里没有的工具一次性全部买齐。
总结
这个流程是一个逻辑清晰、分工明确的过程:
wstool init
: 准备一个容器(src
目录)和清单。wstool merge
: 将项目所需的源代码列表填入清单。wstool update
: 根据清单,下载所有源代码。rosdep install
: 检查所有下载的源代码,并为其安装所有外部的编译依赖。
完成这四步之后,所有的“原材料”和“工具”都已经备齐,你就可以在工作空间的根目录运行 catkin build
来启动“总装工程”了。