この記事は
「Ubuntu Server20.04.2 LTS」OSの「Raspberry Pi 4 Model B」を使って「ROS2 Foxy」の学習ログを書き記した自分用ノート
になります。
このページを読むことで
サービス-クライアント間の双方向通信
service、clientのPythonプログラムの要約
を知ることができます。
ROS2のサービス、クライアントについて基礎を学習したい方は是非ご覧ください!
また
ROS2公式チュートリアル:Writing a simple service and client (Python)
をベースに日本語訳をしているので、サービス、クライアントのPythonプログラム全文などはこちらを参照してください。
それでは早速始めていきましょう!
service-clientの準備
パッケージの作成と設定ファイルのアップデート
まずはservice-client用のパッケージを作成していきます。
今回はROS2パッケージ管理用として「dev_ws」というワークスペースを用意してあるので
とディレクトリを移動し「src」下にservice-clientパッケージを作成します。
上記のように宣言し
package.xmlの依存関係:rclpy、example_interfaces
としてパッケージを作ります。
パッケージの作成ができたら
などでディレクトリを移動しフォルダの中身を確認しましょう。
package.xml、setup.cfg、setup.py、py_srvcliなどパッケージに必要なファイルやフォルダがあることが分かりますね。
パッケージ作成ができたら、ライセンスなどの設定ファイルをアップデートしていきます。
description:client server
license:Apache License 2.0
として、package.xmlとsetup.pyをアップデートしていきます。
※ descriptionは任意で変えてOKです。
package.xml
setup.py
descriptionやlicenseの設定ができたら、service、clientのPythonプログラムを作成しましょう。
とpy_srvcliフォルダへディレクトリを移動し
sudo nano service_member_funct ion.py
sudo nano client_member_function.py
などでプログラムを作成します。(nanoで編集する場合は、公式チュートリアルからPythonプログラムをコピペします。)
※ プログラムだけを作成する場合は、touchコマンドを使用しましょう。
service、clientプログラムを理解する
公式チュートリアルからservice、clientのPythonプログラムをコピペしたら、どんなプログラムかを大まかなに理解しておきましょう。
ここではservice_member_function.pyのPythonプログラムを日本語訳で解説します。
from example_interfaces.srv import AddTwoInts import rclpy from rclpy.node import Node
一行目はexample_interfacesパッケージからAddTwoIntsサービスをインポートしており、二、三行目はrclパッケージからNodeをインポートしています。
def __init__(self): super().__init__('minimal_service') self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)
super().__init__()ではminimal_serviceとクラス名を宣言し、create_serviceでサービスタイプ、名前、コールバックを定義します。
def add_two_ints_callback(self, request, response): response.sum = request.a + request.b self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b)) return response
def add_two_ints_callbackは__init__()で定義したコールバックの関数を定義しており
で合計を算出し、get_logger().info()でコンソールに出力をします。
あとは、def main()文でプログラムの定義、ループ、シャットダウンをします。
service-clientの実行と図解
ROS2のサービス、クライアントを実行する
service、clientファイルの準備ができたら、実際に双方向通信を実行してみましょう。
作成したパッケージをビルドするために
とディレクトリを移動し
rosdep install -i –from-path src –rosdistro foxy -y
colcon build
とビルドします。
※ ビルドはcolcon build –packages-select py_srvcliと選択しても大丈夫です。
ビルドできたら、新しいターミナルを開き
. install/setup.bash
ros2 run py_srvcli service
とサービス用のノードを実行します。
同様に、新しいターミナルを開いて.install/setup.bashを実行したら
とクライアント用のノードを実行させましょう。
すると
サービス用ノード a: 2 b:3
クライアント用ノード 2 + 3 = 5
とノード間の双方向通信が行われます。
実行画面から
クライアントから送信されたa、bの値に対して
サービスが値を計算し、クライアントへ結果を返信
していることが分かります。
サービスをrqtで確認する
上記で、サービス・クライアントノードの説明をしましたが、これをグラフで確認もしてみます。
新しいターミナルを開き
とコマンドを打ち込みましょう。
コマンドを実行すると、新しくウィンドウが表示されサービスノードが動いていることが分かります。
この動いているノードに対し、クライアントノードで値を送信することで双方向通信がされるという仕組みです。
ROS2公式チュートリアルだけでは物足りないと感じた方は、GitHubやQiitaなどから他のサービス-クライアント間通信を試してみてください。
この記事が、サービス-クライアントの双方向通信理解のお役に立てれば幸いです。
お疲れ様でした。