ROS2 HumbleでSubscriberノードの構築と通信方法を解説

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

この記事は、Raspberry Pi 4にインストールしたROS2 HumbleでSubscriberノードを作成し、Publisherノードとの通信に成功するまでの全ての手順を、準備から実行までを解説します。

実際に発生した問題と解決方法も追加しているため、同じようなエラーに直面しても安心して進められる内容になっています。

目次

環境

ハードウェア:
Publisherノード→x86PC(Intel NUC)
Subscriberノード→Raspberry Pi 4
OS:Ubuntu22.04LTS

準備:Publisherノードの作成

まずPC側のPublisherノードの作成を行います。手順は以下の記事で解説していますので、あらかじめ済ませておいてください。

Subscriberノード:ワークスペースの作成

ROS2のプロジェクト開発では、専用のワークスペースを作成してその中にパッケージを配置して管理する方法が一般的です。

環境設定の読み込み

ROS2環境を有効にするために、以下のコマンドを実行します。

source /opt/ros/humble/setup.bash

このコマンドにより、ROS2に関する各種設定や実行パスが適用されます。以降、ROS2コマンドが正しく動作するようになります。

ワークスペースの作成

開発用のディレクトリ「ros2_ws」を作成します。以下のコマンドを実行します。

mkdir -p ~/ros2_ws/src
  • mkdir -p は、ディレクトリの親フォルダ(ros2_ws)と子フォルダ(src)をまとめて作成するコマンドです。
  • ~ はホームディレクトリを表しています。Raspberry Piのデフォルトユーザーの場合は/home/pi/~に対応します。

srcフォルダ内に移動するため、以下を実行します。

cd ~/ros2_ws/src

Subscriberノード:パッケージの作成

ROS2のノードを作成するためには「パッケージ」が必要です。パッケージはPythonやC++のノードを含むフォルダ構造で、ライブラリの依存関係などを定義します。

パッケージ作成コマンド

以下のコマンドでPythonタイプのパッケージを作成します。

ros2 pkg create --build-type ament_python py_pubsub
  • --build-type ament_python は、Pythonパッケージとして作成することを意味します。
  • py_pubsub はパッケージ名です。自由に名前を変更しても構いません。

ディレクトリ確認

作成後に以下のコマンドで中身を確認しましょう。

ls

作成されたパッケージは以下のようなディレクトリ構成になっています。

py_pubsub/
├── package.xml
├── py_pubsub
│   ├── __init__.py
│   └── ...
└── setup.py

この時点でパッケージが正しく作成されていれば、次に進む準備が完了です。

Subscriberノード:ノードの作成

ここからは実際にSubscriberノードをPythonで実装する方法について解説します。

Pythonコードファイルの作成

cd ~/ros2_ws/src/py_pubsub/py_pubsub touch subscriber_member_function.py

touch コマンドで空のsubscriber_member_function.pyを作成します。

Pythonコードの記述

ファイルに以下のコードを記述します:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class MinimalSubscriber(Node):
    def __init__(self):
        super().__init__('minimal_subscriber')
        self.subscription = self.create_subscription(
            String,
            'topic',
            self.listener_callback,
            10
        )
        self.subscription

    def listener_callback(self, msg):
        self.get_logger().info(f'I heard: "{msg.data}"')

def main(args=None):
    rclpy.init(args=args)
    minimal_subscriber = MinimalSubscriber()
    rclpy.spin(minimal_subscriber)
    minimal_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

Subscriberノード:setup.pyの設定

ソースコードを作成したら、続いてsetup.pyの内容を編集します。

setup.pyの修正

entry_points に次の行を追加します:

entry_points={
    'console_scripts': [
        'listener = py_pubsub.subscriber_member_function:main',
    ],
},
  • listener は実行時のコマンド名です。
  • py_pubsub.subscriber_member_function:main はPythonパッケージ内の実行対象を指定しています。

Subscriberノード:依存関係の確認と解決方法

依存関係の確認方法を解説します。

依存関係のチェックとインストール

sudo rosdep init  # 初期化 (初回のみ)
rosdep update  # 依存関係のデータベースを更新
rosdep install -i --from-path src --rosdistro humble -y  # 必要な依存パッケージを自動インストール
  • rosdep init: rosdep(依存関係管理ツール)の初期化を行います。初回のみ必要です。
  • rosdep update: ROSの依存情報を最新に更新します。
  • rosdep install: srcフォルダ内の全パッケージを対象に、必要なパッケージを自動インストールします。
  • --rosdistro humble: ROS2のディストリビューション(今回はhumble)を指定しています。

依存関係のエラー

以下のようにエラーが出る場合があります。

reading in sources list data from /etc/ros/rosdep/sources.list.d
ERROR: unable to process source [file:///usr/share/python3-rosdep2/debian.yaml]:
        <urlopen error [Errno 2] No such file or directory: '/usr/share/python3-rosdep2/debian.yaml'> (file:///usr/share/python3-rosdep2/debian.yaml)
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml
Skip end-of-life distro "ardent"
Skip end-of-life distro "bouncy"
Skip end-of-life distro "crystal"
Skip end-of-life distro "dashing"
Skip end-of-life distro "eloquent"
Skip end-of-life distro "foxy"
Skip end-of-life distro "galactic"
Skip end-of-life distro "groovy"
Add distro "humble"
Skip end-of-life distro "hydro"
Skip end-of-life distro "indigo"
Skip end-of-life distro "iron"
Skip end-of-life distro "jade"
Add distro "jazzy"
Skip end-of-life distro "kinetic"
Skip end-of-life distro "lunar"
Skip end-of-life distro "melodic"
Add distro "noetic"
Add distro "rolling"
updated cache in /home/pi/.ros/rosdep/sources.cache
ERROR: Not all sources were able to be updated.
[[[
ERROR: unable to process source [file:///usr/share/python3-rosdep2/debian.yaml]:
        <urlopen error [Errno 2] No such file or directory: '/usr/share/python3-rosdep2/debian.yaml'> (file:///usr/share/python3-rosdep2/debian.yaml)
]]]

以下の方法を試してみてください。

  1. キャッシュ削除: sudo rm -rf /home/pi/.ros/rosdep/sources.cache
  2. rosdepの更新: rosdep update
  3. rosdep2の再インストール: sudo apt update sudo apt install --reinstall python3-rosdep2

Subscriberノードのビルドとノード実行

Subscriberノードのビルド

依存関係のインストール:

rosdep install -i --from-path src --rosdistro humble -y

パッケージのビルド:

colcon build --packages-select py_pubsub

環境設定の反映:

source install/setup.bash

Subscriberノードの実行

Subscriberノードの起動:

ros2 run py_pubsub listener

Publisherノードの実行 (talker)

PC側でマシンで以下を実行します:

ros2 run py_pubsub talker

おわりに

これでROS2のPublisherノードとSubscriberノードが通信し、ログに「I heard: Hello World: X」が表示されたら成功です。これをもとに、独自のメッセージを作成するシステムや、サービス通信・アクション通信に挑戦してみてください!

お読みいただきありがとうございました!疑問や質問があれば気軽にコメントしてください。プロジェクトを楽しんでください!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次