Skip to content

パッケージの作成

目標: 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フォルダにいることを確認してください。

bash
cd ~/ros2_ws/src

ROS 2で新しいパッケージを作成するコマンド構文は以下の通りです:

CMakeパッケージ:

bash
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>

Pythonパッケージ:

bash
ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>

このチュートリアルでは、パッケージ内にシンプルなHello Worldタイプの実行可能ファイルを作成する--node-nameオプション引数を使用します。

ターミナルで以下のコマンドを入力してください:

CMakeパッケージ:

bash
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package

Pythonパッケージ:

bash
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.cpp

Pythonパッケージ:

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を実行することで、多くのパッケージを一度にビルドできるからです。 そうでなければ、各パッケージを個別にビルドする必要があります。

ワークスペースのルートに戻ります:

bash
cd ~/ros2_ws

これでパッケージをビルドできます:

bash
colcon build

前回のチュートリアルから、ros2_wsros_tutorialsパッケージもあることを思い出してください。 colcon buildを実行するとturtlesimパッケージもビルドされたことに気づいたかもしれません。 ワークスペースにパッケージが少ない場合は問題ありませんが、多くのパッケージがある場合、colcon buildには長時間かかることがあります。

次回my_packageパッケージのみをビルドするには、以下を実行できます:

bash
colcon build --packages-select my_package

3 セットアップファイルのソース

新しいパッケージと実行可能ファイルを使用するには、まず新しいターミナルを開いてメインのROS 2インストールをソースします。

次に、ros2_wsディレクトリ内から以下のコマンドを実行してワークスペースをソースします:

bash
source install/local_setup.bash

これで、ワークスペースがパスに追加され、新しいパッケージの実行可能ファイルを使用できるようになります。

4 パッケージの使用

パッケージ作成中に--node-name引数を使用して作成した実行可能ファイルを実行するには、以下のコマンドを入力します:

bash
ros2 run my_package my_node

これにより、ターミナルにメッセージが返されます:

CMakeパッケージ:

hello world my_package package

Pythonパッケージ:

Hi from my_package.

5 パッケージ内容の確認

ros2_ws/src/my_package内で、ros2 pkg createが自動生成したファイルとフォルダを確認できます:

CMakeパッケージ:

CMakeLists.txt  include  package.xml  src

Pythonパッケージ:

my_package  package.xml  resource  setup.cfg  setup.py  test

CMakeパッケージの場合: my_node.cppsrcディレクトリ内にあります。ここが将来的にすべてのカスタムC++ノードが配置される場所です。

Pythonパッケージの場合: my_node.pymy_packageディレクトリ内にあります。ここが将来的にすべてのカスタムPythonノードが配置される場所です。

6 package.xmlのカスタマイズ

パッケージ作成後の返信メッセージで、descriptionlicenseフィールドにTODOノートが含まれていることに気づいたかもしれません。 これは、パッケージの説明とライセンス宣言が自動的に設定されず、パッケージをリリースしたい場合には必須だからです。 maintainerフィールドも入力する必要がある場合があります。

ros2_ws/src/my_packageから、お好みのテキストエディタでpackage.xmlを開きます:

CMakeパッケージ:

xml
<?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
<?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行を編集してパッケージを要約します:

xml
<description>初心者クライアントライブラリチュートリアル練習パッケージ</description>

次に、license行を更新します。 オープンソースライセンスについて詳しくはこちらで読むことができます。 このパッケージは練習用のみなので、どのライセンスを使用しても安全です。 Apache License 2.0を使用します:

xml
<license>Apache License 2.0</license>

編集が完了したら保存することを忘れないでください。

ライセンスタグの下に、_dependで終わるタグ名が表示されます。 ここがpackage.xmlが他のパッケージへの依存関係をリストし、colconが検索するための場所です。 my_packageはシンプルで依存関係がありませんが、今後のチュートリアルでこのスペースが利用されるのを見ることになります。

これで今のところすべて完了です!

まとめ

コードを整理し、他の人が簡単に使用できるようにするためのパッケージを作成しました。

パッケージは必要なファイルで自動的に追加され、その後colconを使用してビルドしたので、ローカル環境でその実行可能ファイルを使用できます。

次のステップ

次は、パッケージに意味のあるものを追加しましょう。 シンプルなパブリッシャー/サブスクライバーシステムから始めます。これはC++またはPythonのいずれかで書くことができます。

Released under the MIT License.