ROS2學習之旅(13)——創建ROS2 功能包


一個功能包可以被認為是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自動生成的文件和文件夾:

image-20210714144217623

其中,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="user@todo.todo">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來構建它,這樣就可以在本地環境中使用它的可執行文件。

如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM