一個功能包可以被認為是ROS2程式碼的容器。如果希望能夠管理程式碼或與他人共享程式碼,那麼需要將其組織在一個包中。通過包,可以釋出ROS2工作,並允許其他人輕鬆地構建和使用它。
在ROS2中,建立功能包使用ament作為其構建系統,colcon作為其編譯工具。可以使用CMake或Python來建立包,都是官方支援的,不過也存在其他構建型別,本文僅針對CMake,即採用C++編寫程式進行討論。
1.什麼組成了ROS2功能包
ROS2 CMake包的最低要求內容為:
package.xml
包含關於包的元資訊的檔案CMakeLists.txt
描述如何在包中編譯程式碼
最簡單的包可能有如下的檔案結構:
my_package/
CMakeLists.txt
package.xml
2.工作空間中的包
一個工作空間可以包含任意多個包,每個包都在自己的資料夾中。同樣也可以在一個工作空間中擁有不同構建型別的包(CMake, Python等)。不能有巢狀包,即包裡有包。
最好的工程經驗是在工作空間中有一個src
資料夾,並在其中建立包。這保持了頂層工作空間的“乾淨”。
一個簡單的工作空間可能是這樣的:
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/package_2
...
package_n/
CMakeLists.txt
package.xml
3.建立一個功能包
首先,確定ROS2環境已經配置好,如果未配置,可以參考:ROS2環境配置
然後,建立dev_ws
工作空間,可以參考:ROS2工作空間建立
確保終端位於src
目錄下:
cd ~/dev_ws/src
ROS2中建立一個新的功能包的語法為:
ros2 pkg create --build-type ament_cmake <package_name>
在本文中,將使用可選引數——node-name
,它將在包中建立一個簡單的Hello World型別的可執行檔案。在終端中輸入如下命令:
ros2 pkg create --build-type ament_cmake --node-name my_node my_package
現在在工作空間的src
目錄中有一個名為my_package
的新資料夾。
執行該命令後,終端將返回訊息:
going to create a new package
package name: my_package
destination directory: /home/**/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['** <**@todo.todo>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp
可以看到新包自動生成的檔案。
4.編譯功能包
將包放到工作空間中特別有價值,因為可以通過在工作空間的根目錄中執行colcon build
來一次編譯多個包。否則,將不得不單獨編譯每個包。
返回工作空間的根目錄:
cd ~/dev_ws
現在編譯功能包:
colcon build
當工作空間中有許多包時,colcon build
可能需要很長時間,這是可以只編譯某個包。
當只編譯my_package
時,可以執行:
colcon build --packages-select my_package
5.soure setup檔案
要使用新的包和可執行檔案,首先開啟一個新的終端並source ROS2的安裝空間。
然後,在dev_ws
目錄中,執行以下命令來source工作空間:
. install/setup.bash
現在工作空間已經新增到環境中,可以使用新包中的可執行檔案。
6.使用功能包
為了執行剛剛建立的my_node
節點,在終端執行:
ros2 run my_package my_node
此時終端輸出:
hello world my_package package
7.檢視包的內容
在dev_ws/src/my_package
中,會看到ros2 pkg create
自動生成的檔案和資料夾:
其中,my_node.cpp
在src
目錄中。所有自定義的C++節點都存放在src
中。
8.定製package.xml
在建立包之後的返回訊息中,包括description
、license
和TODO
說明。這是因為描述和許可宣告並不是自動設定的,但是想要釋出包,它們是必需的,可能還需要填寫maintainer
欄位。
在dev_ws/src/my_package
目錄下,開啟package.xml
檔案:
1<?xml version="1.0"?>
2<?xml-model
3 href="http://download.ros.org/schema/package_format3.xsd"
4 schematypens="http://www.w3.org/2001/XMLSchema"?>
5<package format="3">
6 <name>my_package</name>
7 <version>0.0.0</version>
8 <description>TODO: Package description</description>
9 <maintainer email="[email protected]">user</maintainer>
10 <license>TODO: License declaration</license>
11
12 <buildtool_depend>ament_cmake</buildtool_depend>
13
14 <test_depend>ament_lint_auto</test_depend>
15 <test_depend>ament_lint_common</test_depend>
16
17 <export>
18 <build_type>ament_cmake</build_type>
19 </export>
20</package>
在第9行輸入姓名和電子郵件,然後,編輯第8行上的描述,以總結包的功能:
<description>Beginner client libraries tutorials practice package</description>
然後,在第10行更新license。
因為這個包僅用於練習,所以使用任何許可證都是安全的。這裡使用Apache License 2.0
:
<license>Apache License 2.0</license>
不要忘記儲存。
在license標記下面,看到一些以_depend
結尾的標記名稱。在這裡,package.xml
將列出對其他包的依賴關係,讓colcon
進行搜尋。my_package
很簡單,沒有任何依賴項。
9.總結
現在已經建立了一個包來組織程式碼,並使其易於他人使用。
包被自動填充了必要的檔案,然後使用colcon
來構建它,這樣就可以在本地環境中使用它的可執行檔案。
如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。