創(chuàng)建 ROS2 功能包

使用 CMake 或 Python 創(chuàng)建一個(gè)新程序包,然后運(yùn)行其可執(zhí)行文件。

1 What is a ROS 2 package??

可以將包視為 ROS 2 代碼的容器。如果您希望能夠安裝代碼或與他人共享代碼,則需要將其組織在一個(gè)軟件包中。使用軟件包,您可以發(fā)布 ROS2 的工作,并允許其他人輕松構(gòu)建和使用它。

ROS2 中的軟件包創(chuàng)建使用 ament 作為其構(gòu)建系統(tǒng),并使用 colcon 作為其構(gòu)建工具。您可以使用官方支持的 CMake 或 Python 創(chuàng)建軟件包,盡管確實(shí)存在其他構(gòu)建類(lèi)型。

2 What makes up a ROS 2 package??

ROS 2 Python 和 CMake 軟件包各自具有自己的最低要求內(nèi)容:

  1. CMake:
  • package.xml 文件,其中包含有關(guān)程序包的元信息
  • CMakeLists.txt 文件,描述如何在包中構(gòu)建代碼
  1. Python:
  • package.xml 文件,其中包含有關(guān)程序包的元信息
  • setup.py 包含有關(guān)如何安裝軟件包的說(shuō)明
  • 軟件包包含可執(zhí)行文件時(shí),需要 setup.cfg,以便 ros2 run 可以找到它們
  • /<package_name>:ROS 2 工具用來(lái)查找軟件包的與軟件包同名的目錄包含__init__.py

最簡(jiǎn)單的包可能具有如下文件結(jié)構(gòu):

  1. CMake:
my_package/
     CMakeLists.txt
     package.xml
  1. Python:
my_package/
      setup.py
      package.xml
      resource/my_package

3 Packages in a workspace?

一個(gè)工作空間可以包含所需數(shù)量的程序包,每個(gè)程序包都位于其自己的文件夾中。您還可以在一個(gè)工作空間(CMake,Python等)中擁有不同構(gòu)建類(lèi)型的軟件包。您不能有嵌套的程序包。

最佳做法是在工作區(qū)中有一個(gè) src 文件夾,并在其中創(chuàng)建包。這樣可以使工作空間的頂層保持“干凈”。

典型的一個(gè)工作空間內(nèi)功能包的結(jié)構(gòu)如下:

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.1 Create a package?

首先,source 您的 ROS 2 installation。

創(chuàng)建的工作空間 dev_ws 用于新軟件包,運(yùn)行軟件包創(chuàng)建命令之前,請(qǐng)確保您位于 src 文件夾中。

在 ROS 2 中創(chuàng)建新程序包的命令語(yǔ)法為:

  1. CMake:
$ ros2 pkg create --build-type ament_cmake <package_name>
  1. Python:
$ ros2 pkg create --build-type ament_python <package_name>

接下來(lái)將使用可選參數(shù) --node-name,該參數(shù)在包中創(chuàng)建一個(gè)簡(jiǎn)單的 Hello World 類(lèi)型的可執(zhí)行文件。

在終端中輸入以下命令:

$ mkdir -p dev_ws/src
$ cd dev_ws/src
  • Python:
$ ros2 pkg create --build-type ament_python --node-name my_node my_package_py
  • CMake:
$ ros2 pkg create --build-type ament_cmake --node-name my_node my_package_cpp

現(xiàn)在,您將在工作區(qū)的 src 目錄中擁有一個(gè)名為 my_package_pymy_package_cpp 的新文件夾。運(yùn)行命令后,您的終端將返回以下消息:

  • CMake:
going to create a new package
package name: my_package
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
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
  • Python:
going to create a new package
package name: my_package
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['TODO: License declaration']
build type: ament_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source folder
creating folder ./my_package/my_package
creating ./my_package/setup.py
creating ./my_package/setup.cfg
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/my_package/__init__.py
creating folder ./my_package/test
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py
creating ./my_package/my_package/my_node.py

您可以看到為新軟件包自動(dòng)生成的文件。

3.2 Build a package?

將軟件包放在工作空間中特別有價(jià)值,因?yàn)槟梢酝ㄟ^(guò)在工作空間根目錄中運(yùn)行 colcon build 一次構(gòu)建許多軟件包。否則,您將必須分別構(gòu)建每個(gè)軟件包。

返回工作區(qū)的根目錄,現(xiàn)在您可以構(gòu)建軟件包:

$ cd ..
$ colcon build

這個(gè)命令會(huì)編譯工作空間中的所有功能包,如果只想編譯某一個(gè)包的話(huà),可以這樣:

$ colcon build --packages-select my_package

3.3 Source the setup file?

要使用新的程序包和可執(zhí)行文件,請(qǐng)先打開(kāi)一個(gè)新終端,然后獲取 ROS2 的主要安裝源。然后,從 dev_ws 目錄中,運(yùn)行以下命令來(lái)獲取您的工作空間:

# Linux
$ . install/setup.bash
# Windows
$ call install/local_setup.bat

現(xiàn)在您的工作區(qū)已添加到路徑中,您將可以使用新程序包的可執(zhí)行文件。

3.4 Use the package?

要在軟件包創(chuàng)建期間運(yùn)行使用--node-name參數(shù)創(chuàng)建的可執(zhí)行文件,請(qǐng)輸入以下命令:

$ ros2 run my_package_py my_node

3.5 Examine package contents?

不管你是用 CMake 還是 python 創(chuàng)建的包,打開(kāi)看一下,里邊有哪些默認(rèn)的文件:

3.6 Customize package.xml?

創(chuàng)建軟件包后,package.xml 文件需要我們手動(dòng)完善一下。您可能在返回消息中注意到字段 descriptionlicense 包含 TODO 注釋。這是因?yàn)檐浖?descriptionlicense 聲明不會(huì)自動(dòng)設(shè)置,但是如果您要釋放軟件包,則必須設(shè)置。maintainer 字段可能也需要填寫(xiě)。

完善以上描述信息、許可證和作者郵箱,關(guān)于許可證的詳細(xì)介紹可以參考 here。

由于此軟件包僅供練習(xí),因此可以安全使用任何許可證。我們使用 Apache License 2.0:

<license>Apache License 2.0</license>

在許可證標(biāo)簽下方,您會(huì)看到一些標(biāo)簽名稱(chēng)以 _depend 結(jié)尾。這是您的 package.xml 列出其對(duì)其他軟件包的依賴(lài)關(guān)系的地方,供 colcon 搜索。my_package_* 很簡(jiǎn)單,沒(méi)有任何依賴(lài)關(guān)系,但是您將在以后的教程中看到這個(gè)空間的使用。

如果使用的是 Python 包,還需要多修改一個(gè)文件 setup.pysetup.py 文件包含與 package.xml 相同的description,licensemaintainer,因此您也需要進(jìn)行設(shè)置。它們需要在兩個(gè)文件中完全匹配。版本和名稱(chēng)(package_name)也需要完全匹配,并且應(yīng)在兩個(gè)文件中自動(dòng)填充。

4 總結(jié)

您已經(jīng)創(chuàng)建了一個(gè)用于組織代碼并易于他人使用的程序包。您的軟件包將自動(dòng)填充必要的文件,然后使用 colcon 進(jìn)行構(gòu)建,以便可以在本地環(huán)境中使用其可執(zhí)行文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容