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.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;矩形工具是使用率極高的基礎工具之一。無論是…