その他

【ROS2】パッケージの構成と作り方

その他
この記事は約6分で読めます。

はじめに

こんにちは、株式会社インプルのTaroです。

先月末からロボット開発に関わることになり、わからないことだらけながらも毎日格闘しています。 

当チームではすでにROS2の基本を解説していますが、個人的に読んでいて「これ、どういうこと?」となった部分がありました。

今回はその中から気になったところを深掘りしていきます!

今回やること

テーマはROS2のパッケージについてです。主に構成や作り方について解説していきます。

 ロボットはモーター制御・ナビゲーション・カメラ制御など多くの機能を組み合わせて動いており、システムが複雑になりがちです。ROS2ではこの複雑さに対処するため、機能ごとにパッケージを分けるという設計思想が採られています。

この記事ではその仕組みと実践的な作り方を説明します。

パッケージとは?

概要

公式ドキュメントによれば、パッケージは「ROS2コードの組織単位(organizational unit)」と定義されています。

わかりやすい例として、「レゴブロック」と紹介している記事もありました。

一つ一つのブロック(パッケージ)には特定の機能があり、組み合わせることで複雑なロボットシステムを構築することができます。

設計思想

ROS2において、パッケージは機能ごとに分けることが良いとされています。

簡単な機能を数個程度であれば、パッケージを分けなくても問題ないかと思いますが、機能が追加されるにつれ、「分散処理ができない」「機能の再利用ができない」などの問題が発生してしまいます。

そこで、パッケージという単位で機能ごとに分けることで可用性や再利用性を高める事ができます。

ルール

設計思想に付随して、パッケージのネスト(入れ子)は禁止するというルールがあります。

これはビルドシステムであるcolconとパッケージ管理ツールであるrosdepの設計思想に基づいて、このようなルールが定められています。

パッケージのディレクトリ構成

パッケージのディレクトリ構成は以下になります。

my_py_pkg/
├── package.xml                 ← パッケージ情報と依存関係
├── setup.py                    ← Pythonインストール設定
├── setup.cfg                   ← ros2 runの実行ファイル探索設定
├── resource/my_py_pkg          ← パッケージ認識用マーカーファイル
├── my_py_pkg/                  ← Pythonソースコード(パッケージ名と同名)
│   ├── __init__.py
│   └── my_node.py
└── test/                       ← テストファイル
    ├── test_copyright.py
    ├── test_flake8.py
    └── test_pep257.py

各ファイルの役割

  • setup.py:
    インストール方法とエントリーポイント(実行可能なノード)を定義します。
    ros2 runで呼び出せるノードは、ここのconsole_scriptsで登録します。
  • setup.cfg:
    ros2 run コマンドが実行ファイルを発見するためのパス設定です。通常は自動生成されたままで良いです。
  • resource/my_py_pkg:
    中身は空になります。ROS2のament indexにパッケージを登録するためのマーカーファイルです。
  • package.xml:
    ROS2パッケージの身分証明書であり、format3(REP-149準拠)が標準となります。

コマンドでパッケージを一発作成

パッケージ作成は ros2 pkg createコマンド一つで完了します。

基本構文は以下になります。

ros2 pkg create --build-type ament_python [オプション] パッケージ名

ゼロから動くパッケージ作成手順

# 1. ワークスペースを作成
mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src

# 2. パッケージを作成
ros2 pkg create --build-type ament_python \
  --license Apache-2.0 \
  --node-name talker \
  --dependencies rclpy std_msgs \
  my_first_pkg

# 3. 依存関係をインストール
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y

# 4. ビルド(--symlink-installで開発を楽に)
colcon build --symlink-install --packages-select my_first_pkg

# 5. 環境を読み込み(新しいターミナルで)
source ~/ros2_ws/install/setup.bash

# 6. 実行
ros2 run my_first_pkg talker

まとめ

今回はROS2のパッケージについて、以下の内容を解説しました。

  • パッケージとは「ROS2コードの組織単位」であり、機能ごとに分けることが設計思想の基本
  • パッケージのネスト(入れ子)は禁止されており、colconとrosdepの仕様に基づくルール
  • Pythonパッケージの標準的なディレクトリ構成(package.xml、setup.py、setup.cfgなど)
  • 「ros2 pkg create」 コマンドで必要なファイルを一括生成できる

パッケージをうまく分割することで、機能の再利用性や分散処理のしやすさが大きく向上します。 最初は分けすぎず、機能が増えてきたタイミングで整理していくのも良いかと思います。

おわりに

いかがだったでしょうか。

今回は初投稿ということで、ROS2のパッケージの基本的な概念と作り方をまとめてみました。 

自分自身まだロボット開発を始めて日が浅く、つたない部分もあるかと思いますが、 同じように学んでいる方の参考になれば嬉しいです。 

参考URL

Creating a package — ROS 2 Documentation: Humble documentation
Create a ROS2 Python package - The Robotics Back-End
Learn how to create a ROS2 Python package. Setup the package, add nodes, launch files, YAML files, and see how everything works together.
ROS入門 (9) - ROS2のパッケージの作成|npaka
ROS2のパッケージの作成についてまとめました。 ・Galactic 前回 1. ワークスペースのセットアップ 「colcon」のワークスペースを作成します。「colcon」は、ROSのビルドシステムで、ROSのソースコードを実行ファイルに変換します。 (1) ワークスペースのフォルダを作成し移動。 ...