ROS2学习(十六).ROS概念 - 构建系统
關于ROS 2的構建系統
- `ament_package`包
- **package.xml**
- **ament package**
- `ament_cmake`代碼庫
- `ament_lint`代碼庫
- 構建工具
- 參考
構建系統是一切的基石。在ROS生態中,我們從ROS 1 開始考慮構建系統。這一套構建系統相關的包從ROS 1的catkin迭代至今ament。將名字改為ament中的部分原因是我們希望它不會與catkin相沖突,以便我們需要混合使用它們,并防止與現有的catkin文檔混淆。ament的主要職責是使開發和維護ROS 2核心包變得更容易。當然,這種工具也可以提供給任何愿意遵循ROS構建系統約定和工具的用戶。此外,它可以使包更加規范的,這樣開發人員應該能夠挑選任何基于ament構建的包。此規范約束了包如何工作、如何檢查以及如何構建或使用。
ament由幾個重要的庫組成,它們都在GitHub的ament組織中:
- ament_package包
- ament_cmake庫
- ament_lint庫
- 構建工具
ament_package包
ament/ament_package庫包含了一個單獨的ament Python包,它為ament包提供了各種實用工具,例如環境hook的模板。
無論底層的編譯系統是什么,所有的組件包都必須在包的根目錄中包含一個package.xml文件。“manifest”文件package.xml包含處理和操作一個包所需的信息。其中包含了全局唯一的包名和包的依賴項。package.xml還可以作為標記文件,標明包在文件系統中的位置。
在ROS 1中,catkin_pkg提供了對package.xml文件的解析,解析后可以在文件系統中定位相關包。在ROS 2中構建工具(如colcon)負責對這些package.xml文件的解析。
package.xml
包清單文件,它描述了包的根目錄,包的元信息,包括它的名稱、版本、描述、維護者、許可證、依賴關系等等。清單的內容是機器可讀的XML格式,相關格式在REPs 127和140中進行了描述,并有可能在未來的REPs中進一步演進。
因此,每當某個包被稱為ament package時,這意味著它是使用package.xml清單文件描述的單個軟件單元(源代碼、構建文件、測試、文檔和其他資源)。
ament package
任何遵循ament打包指南的包,其中包含有package.xml文件。與底層構建系統無關。
由于ament package與構建系統無關,所以存在有ament CMake包、ament Python包等不同種類的ament包。
CMake package
包含普通CMake項目和package.xml清單文件的包。
ament CMake package
遵循ament打包指南的CMake package。
Python package
包含基于setuptools的Python項目和package.xml清單文件的包。
ament Python package
遵循ament打包指南的Python package。
ament_cmake代碼庫
位于GitHub的ament/ament_cmake,這個庫提供了在CMake中創建“ament CMake”package所需的基礎設施,包含許多“ament CMake”和純CMake package。“ament CMake” package指的是:使用CMake構建的ament package。因此,這個庫中的包提供了必要的CMake函數/宏和CMake模塊,以便創建更多的“ament CMake”(或ament_cmake)包。這種類型的包在package.xml文件用<export>的<build_type>ament_cmake</build_type>tag進行標記。
上述代碼庫中的包是非常模塊化的,只有一個“瓶頸”包ament_cmake。ament_cmake包聚合了這個代碼庫中所有包的功能。該庫中包含有以下包:
- ament_cmake
- 聚合此存儲庫中的所有其他包的功能,用戶只需要依賴于此。
- ament_cmake_auto
- 提供了方便的CMake函數,可以自動編寫包的CMakeLists.txt文件的許多繁瑣部分
- ament_cmake_core
- 為ament提供所有內置的核心概念,例如環境鉤子、資源索引、符號鏈接安裝等
- ament_cmake_gmock
- 為基于gmock的單元測試添加的功能
- ament_cmake_gtest
- 為基于gtest的自動化測試添加的功能
- ament_cmake_nose
- 為基于nosetests的python自動化測試添加的功能
- ament_cmake_python
- 為包含Python代碼的包提供CMake函數
- ament_cmake_test
- 使用CTest在單個目標下聚合不同種類的測試,例如gtest和nosetests
ament_cmake_core包中包含大量的CMake基礎設施,使包之間能夠輕易地通過傳統接口傳遞信息。這使得包之間的構建更為解耦,促進了包的重用,并鼓勵不同包的構建系統中的約定。例如,它提供了在包之間傳遞包含目錄、庫、定義和依賴項的標準方法,以便該信息的使用者可以以傳統方式訪問該信息。
ament_cmake_core包還提供了ament構建系統的特性,比如符號鏈接安裝,它允許您象征性地將文件從源空間或構建空間鏈接到安裝空間,而無需復制它們。這允許您僅需進行一次安裝,然后改動非生成的資源,如Python代碼和配置文件,而無需重新運行安裝步驟就可使其生效。這一功能本質上取代了catkin中的“devel space”,因為它帶來了大量的優點和很少的復雜性或缺點。
ament_cmake_core提供的另一個特性是包資源索引,這為包提供了一種表明它們包含某種類型的資源的方法。這個特性的設計使它可以更有效地回答一些簡單的問題,比如這個前綴中有哪些包(例如/usr/local),他只需要你列出該前綴下單個可能位置中的文件。你可以在資源索引的設計文檔中關于這個特性的內容。
像catkin一樣,ament_cmake_core也提供了環境設置文件和包特定的環境鉤子。常見的環境設置文件如setup.bash,是包開發人員定義使用其包所需的環境更改。開發人員可以使用“環境鉤子”來實現這一點,它基本上是一個任意的shell代碼,可以設置或修改環境變量,定義shell函數,設置自動完成規則等等。這個特性提供了類似于在catkin不知道ROS的發布版本的情況下,使ROS 1設置ROS_DISTRO環境變量。
ament_lint代碼庫
這個代碼庫位于GitHub的ament/ament_lint,它以方便和一致的方式提供了幾個檢測和測試服務的包。目前有一些包支持使用uncrustify進行C++風格檢測,使用cppcheck進行靜態c++代碼檢查,檢查源代碼版權,使用pep8進行Python風格檢測,以及其他功能。helper包的列表將來可能會增長。
構建工具
構建工具通過一次調用來執行一次構建包工作區的任務。從ROS 2發行Ardent版本開始提供了構建工具ament_tools。從ROS 2 Bouncy開始,ament_tools已經被colcon取代,這在通用構建工具中有所描述。
參考
總結
以上是生活随笔為你收集整理的ROS2学习(十六).ROS概念 - 构建系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu apt upgrade后黑
- 下一篇: python中出现TabError: i