注目キーワード
  1. Photoshop
  2. Python
  3. Raspberry Pi
  4. Arduino

ROS2で単純なサービス-クライアント通信を試してみる

  • 2021年6月1日
  • 2021年6月2日
  • ROS2

この記事は

「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」というワークスペースを用意してあるので

cd ~/dev_ws/src

とディレクトリを移動し「src」下にservice-clientパッケージを作成します。

 

ros2 pkg create –build-type ament_python py_srvcli –dependencies rclpy example_interfaces

上記のように宣言し

パッケージ名:py_srvcli
package.xmlの依存関係:rclpy、example_interfaces

としてパッケージを作ります。

 

パッケージの作成ができたら

cd ~/dev_ws/src/py_srvcli

などでディレクトリを移動しフォルダの中身を確認しましょう。

ros2sercli_01

 

package.xml、setup.cfg、setup.py、py_srvcliなどパッケージに必要なファイルやフォルダがあることが分かりますね。

 

パッケージ作成ができたら、ライセンスなどの設定ファイルをアップデートしていきます。

description:client server

license:Apache License 2.0

として、package.xmlとsetup.pyをアップデートしていきます。

 

※ descriptionは任意で変えてOKです。

 

package.xml

ros2sercli_02

 

setup.py

ros2sercli_03

 

descriptionやlicenseの設定ができたら、service、clientのPythonプログラムを作成しましょう。

 

cd ~/dev_ws/src/py_srvcli/py_srvcli

と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__()で定義したコールバックの関数を定義しており

response.sum = request.a + request.b

で合計を算出し、get_logger().info()でコンソールに出力をします。

 

あとは、def main()文でプログラムの定義、ループ、シャットダウンをします。

 

service-clientの実行と図解

 

ROS2のサービス、クライアントを実行する

service、clientファイルの準備ができたら、実際に双方向通信を実行してみましょう。

 

作成したパッケージをビルドするために

cd ~/dev_ws

とディレクトリを移動し

 

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を実行したら

ros2 run py_srvcli client 2 3

とクライアント用のノードを実行させましょう。

 

ros2sercli_05

 

すると

サービス用ノード a: 2 b:3

クライアント用ノード 2 + 3 = 5

とノード間の双方向通信が行われます。

 

実行画面から

クライアントから送信されたa、bの値に対して

サービスが値を計算し、クライアントへ結果を返信

していることが分かります。

 

サービスをrqtで確認する

上記で、サービス・クライアントノードの説明をしましたが、これをグラフで確認もしてみます。

 

新しいターミナルを開き

rqt_graph

とコマンドを打ち込みましょう。

 

ros2sercli_04

コマンドを実行すると、新しくウィンドウが表示されサービスノードが動いていることが分かります。

 

この動いているノードに対し、クライアントノードで値を送信することで双方向通信がされるという仕組みです。

 

ROS2公式チュートリアルだけでは物足りないと感じた方は、GitHubやQiitaなどから他のサービス-クライアント間通信を試してみてください。

 

この記事が、サービス-クライアントの双方向通信理解のお役に立てれば幸いです。

お疲れ様でした。

ros2serclie_topthubnail
学びに関する情報をチェック!