パッケージの作成
目標: CMakeまたはPythonを使用して新しいパッケージを作成し、その実行可能ファイルを実行する。
チュートリアルレベル: 初心者
所要時間: 15分
背景
1 ROS 2パッケージとは何か?
パッケージは、ROS 2コードの組織単位です。 コードをインストール可能にしたり、他の人と共有したい場合は、パッケージに整理する必要があります。 パッケージを使用することで、ROS 2の作業をリリースし、他の人が簡単にビルドして使用できるようになります。
ROS 2でのパッケージ作成は、ビルドシステムとしてamentを使用し、ビルドツールとしてcolconを使用します。 公式にサポートされているCMakeまたはPythonを使用してパッケージを作成できますが、他のビルドタイプも存在します。
2 ROS 2パッケージの構成要素は何か?
ROS 2のPythonとCMakeパッケージには、それぞれ最低限必要な内容があります:
CMakeパッケージ:
- パッケージ内のコードをビルドする方法を説明する
CMakeLists.txtファイル - パッケージのパブリックヘッダーを含む
include/<package_name>ディレクトリ - パッケージに関するメタ情報を含む
package.xmlファイル - パッケージのソースコードを含む
srcディレクトリ
Pythonパッケージ:
- パッケージに関するメタ情報を含む
package.xmlファイル - パッケージのマーカーファイルを含む
resource/<package_name>ディレクトリ - セットアップ設定ファイル
setup.cfg - パッケージ情報と依存関係を含む
setup.pyファイル - Pythonモジュールを含む
<package_name>ディレクトリ
最もシンプルなパッケージの構造は以下のようになります:
CMakeパッケージ:
my_package/
CMakeLists.txt
include/my_package/
package.xml
src/Pythonパッケージ:
my_package/
package.xml
resource/my_package
setup.cfg
setup.py
my_package/3 ワークスペース内のパッケージ
単一のワークスペースには、それぞれが独自のフォルダに配置された任意の数のパッケージを含めることができます。 一つのワークスペースに異なるビルドタイプのパッケージ(CMake、Pythonなど)を持つこともできます。 ネストしたパッケージは持てません。
ベストプラクティスは、ワークスペース内にsrcフォルダを持ち、そこにパッケージを作成することです。 これにより、ワークスペースの最上位レベルが「クリーン」に保たれます。
簡単なワークスペースは以下のようになります:
workspace_folder/
src/
cpp_package_1/
CMakeLists.txt
include/cpp_package_1/
package.xml
src/
py_package_1/
package.xml
resource/py_package_1
setup.cfg
setup.py
py_package_1/
...
cpp_package_n/
CMakeLists.txt
include/cpp_package_n/
package.xml
src/前提条件
前のチュートリアルの手順に従った後、ROS 2ワークスペースが必要です。 このワークスペースでパッケージを作成します。
タスク
1 パッケージの作成
まず、ROS 2インストールをソースします。
前のチュートリアルで作成したワークスペースros2_wsを新しいパッケージ用に使用しましょう。
パッケージ作成コマンドを実行する前に、srcフォルダにいることを確認してください。
cd ~/ros2_ws/srcROS 2で新しいパッケージを作成するコマンド構文は以下の通りです:
CMakeパッケージ:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>Pythonパッケージ:
ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>このチュートリアルでは、パッケージ内にシンプルなHello Worldタイプの実行可能ファイルを作成する--node-nameオプション引数を使用します。
ターミナルで以下のコマンドを入力してください:
CMakeパッケージ:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_packagePythonパッケージ:
ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name my_node my_packageこれで、ワークスペースのsrcディレクトリ内にmy_packageという新しいフォルダができました。
コマンドを実行した後、ターミナルに以下のメッセージが返されます:
CMakeパッケージ:
going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['Apache-2.0']
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.cppPythonパッケージ:
going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['Apache-2.0']
build type: ament_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating folder ./my_package/my_package
creating ./my_package/my_package/__init__.py
creating ./my_package/my_package/my_node.py
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/setup.cfg
creating ./my_package/setup.py
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py新しいパッケージ用に自動生成されたファイルを確認できます。
2 パッケージのビルド
パッケージをワークスペースに配置することは特に価値があります。なぜなら、ワークスペースのルートでcolcon buildを実行することで、多くのパッケージを一度にビルドできるからです。 そうでなければ、各パッケージを個別にビルドする必要があります。
ワークスペースのルートに戻ります:
cd ~/ros2_wsこれでパッケージをビルドできます:
colcon build前回のチュートリアルから、ros2_wsにros_tutorialsパッケージもあることを思い出してください。 colcon buildを実行するとturtlesimパッケージもビルドされたことに気づいたかもしれません。 ワークスペースにパッケージが少ない場合は問題ありませんが、多くのパッケージがある場合、colcon buildには長時間かかることがあります。
次回my_packageパッケージのみをビルドするには、以下を実行できます:
colcon build --packages-select my_package3 セットアップファイルのソース
新しいパッケージと実行可能ファイルを使用するには、まず新しいターミナルを開いてメインのROS 2インストールをソースします。
次に、ros2_wsディレクトリ内から以下のコマンドを実行してワークスペースをソースします:
source install/local_setup.bashこれで、ワークスペースがパスに追加され、新しいパッケージの実行可能ファイルを使用できるようになります。
4 パッケージの使用
パッケージ作成中に--node-name引数を使用して作成した実行可能ファイルを実行するには、以下のコマンドを入力します:
ros2 run my_package my_nodeこれにより、ターミナルにメッセージが返されます:
CMakeパッケージ:
hello world my_package packagePythonパッケージ:
Hi from my_package.5 パッケージ内容の確認
ros2_ws/src/my_package内で、ros2 pkg createが自動生成したファイルとフォルダを確認できます:
CMakeパッケージ:
CMakeLists.txt include package.xml srcPythonパッケージ:
my_package package.xml resource setup.cfg setup.py testCMakeパッケージの場合: my_node.cppはsrcディレクトリ内にあります。ここが将来的にすべてのカスタムC++ノードが配置される場所です。
Pythonパッケージの場合: my_node.pyはmy_packageディレクトリ内にあります。ここが将来的にすべてのカスタムPythonノードが配置される場所です。
6 package.xmlのカスタマイズ
パッケージ作成後の返信メッセージで、descriptionとlicenseフィールドにTODOノートが含まれていることに気づいたかもしれません。 これは、パッケージの説明とライセンス宣言が自動的に設定されず、パッケージをリリースしたい場合には必須だからです。 maintainerフィールドも入力する必要がある場合があります。
ros2_ws/src/my_packageから、お好みのテキストエディタでpackage.xmlを開きます:
CMakeパッケージ:
<?xml version="1.0"?>
<?xml-model
href="http://download.ros.org/schema/package_format3.xsd"
schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>my_package</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="user@todo.todo">user</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>Pythonパッケージ:
<?xml version="1.0"?>
<?xml-model
href="http://download.ros.org/schema/package_format3.xsd"
schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>my_package</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="user@todo.todo">user</maintainer>
<license>Apache-2.0</license>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>自動的に入力されていない場合は、maintainer行に名前とメールアドレスを入力してください。 次に、description行を編集してパッケージを要約します:
<description>初心者クライアントライブラリチュートリアル練習パッケージ</description>次に、license行を更新します。 オープンソースライセンスについて詳しくはこちらで読むことができます。 このパッケージは練習用のみなので、どのライセンスを使用しても安全です。 Apache License 2.0を使用します:
<license>Apache License 2.0</license>編集が完了したら保存することを忘れないでください。
ライセンスタグの下に、_dependで終わるタグ名が表示されます。 ここがpackage.xmlが他のパッケージへの依存関係をリストし、colconが検索するための場所です。 my_packageはシンプルで依存関係がありませんが、今後のチュートリアルでこのスペースが利用されるのを見ることになります。
これで今のところすべて完了です!
まとめ
コードを整理し、他の人が簡単に使用できるようにするためのパッケージを作成しました。
パッケージは必要なファイルで自動的に追加され、その後colconを使用してビルドしたので、ローカル環境でその実行可能ファイルを使用できます。
次のステップ
次は、パッケージに意味のあるものを追加しましょう。 シンプルなパブリッシャー/サブスクライバーシステムから始めます。これはC++またはPythonのいずれかで書くことができます。