この記事は、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)
]]]
以下の方法を試してみてください。
- キャッシュ削除:
sudo rm -rf /home/pi/.ros/rosdep/sources.cache
- rosdepの更新:
rosdep update
- 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
」が表示されたら成功です。これをもとに、独自のメッセージを作成するシステムや、サービス通信・アクション通信に挑戦してみてください!
お読みいただきありがとうございました!疑問や質問があれば気軽にコメントしてください。プロジェクトを楽しんでください!
コメント