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
來啟動“總裝工程”了。