使用 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)容:
- CMake:
-
package.xml文件,其中包含有關(guān)程序包的元信息 -
CMakeLists.txt文件,描述如何在包中構(gòu)建代碼
- 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):
- CMake:
my_package/
CMakeLists.txt
package.xml
- 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ǔ)法為:
- CMake:
$ ros2 pkg create --build-type ament_cmake <package_name>
- 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_py 與 my_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)完善一下。您可能在返回消息中注意到字段 description 和 license 包含 TODO 注釋。這是因?yàn)檐浖?description 和 license 聲明不會(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.py。setup.py 文件包含與 package.xml 相同的description,license和 maintainer,因此您也需要進(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í)行文件。