一個功能包可以被認為是ROS2程式碼的容器。如果希望能夠管理程式碼或與他人共享程式碼,那麼需要將其組織在一個包中。通過包,可以釋出ROS2工作,並允許其他人輕鬆地構建和使用它。

在ROS2中,建立功能包使用ament作為其構建系統,colcon作為其編譯工具。可以使用CMakePython來建立包,都是官方支援的,不過也存在其他構建型別,本文僅針對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.cppsrc目錄中。所有自定義的C++節點都存放在src中。

8.定製package.xml

在建立包之後的返回訊息中,包括descriptionlicenseTODO說明。這是因為描述和許可宣告並不是自動設定的,但是想要釋出包,它們是必需的,可能還需要填寫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來構建它,這樣就可以在本地環境中使用它的可執行檔案。

如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。

都看到這了,點個推薦再走吧~

未經允許,禁止轉載。