サービスの理解
目標: コマンドラインツールを使用してROS 2のサービスについて学習します。
チュートリアルレベル: 初心者
所要時間: 10分
背景
サービスは、ROSグラフ内のノード間の通信のもう1つの方法です。サービスは、トピックのパブリッシャー-サブスクライバーモデルに対して、コール・アンド・レスポンスモデルに基づいています。トピックはノードがデータストリームにサブスクライブして継続的な更新を取得することを可能にしますが、サービスはクライアントによって特定に呼び出された場合にのみデータを提供します。


前提条件
このチュートリアルで言及されているノードやトピックなどの概念は、シリーズの前のチュートリアルで扱われています。
turtlesimパッケージが必要です。
いつものように、開く新しいターミナルごとにROS 2をソースすることを忘れないでください。
タスク
1 セットアップ
2つのturtlesimノード、/turtlesimと/teleop_turtleを起動します。
新しいターミナルを開いて実行します:
$ ros2 run turtlesim turtlesim_node別のターミナルを開いて実行します:
$ ros2 run turtlesim turtle_teleop_key2 ros2 service list
新しいターミナルでros2 service listコマンドを実行すると、現在システムでアクティブなすべてのサービスのリストが返されます:
$ ros2 service list
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically両方のノードが名前にparametersを含む同じ6つのサービスを持っていることがわかります。ROS 2のほぼすべてのノードには、パラメータが構築されるこれらのインフラストラクチャサービスがあります。パラメータについては次のチュートリアルで詳しく説明します。このチュートリアルでは、パラメータサービスは議論から除外します。
今のところ、turtlesim固有のサービス、/clear、/kill、/reset、/spawn、/turtle1/set_pen、/turtle1/teleport_absolute、/turtle1/teleport_relativeに焦点を当てましょう。turtlesim、ros2、rqtの使用チュートリアルでrqtを使用してこれらのサービスの一部と対話したことを思い出すかもしれません。
3 ros2 service type
サービスには、サービスのリクエストとレスポンスデータがどのように構成されているかを記述するタイプがあります。サービスタイプは、トピックタイプと同様に定義されますが、サービスタイプには2つの部分があります:リクエスト用の1つのメッセージとレスポンス用のもう1つです。
サービスのタイプを調べるには、次のコマンドを使用します:
$ ros2 service type <service_name>turtlesimの/clearサービスを見てみましょう。新しいターミナルで、次のコマンドを入力します:
$ ros2 service type /clear
std_srvs/srv/EmptyEmptyタイプは、サービス呼び出しがリクエストを行うときにデータを送信せず、レスポンスを受信するときにデータを受信しないことを意味します。
3.1 ros2 service list -t
すべてのアクティブなサービスのタイプを同時に確認するには、listコマンドに--show-typesオプション(略して-t)を追加できます:
$ ros2 service list -t
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...4 ros2 service find
特定のタイプのすべてのサービスを見つけたい場合は、次のコマンドを使用できます:
$ ros2 service find <type_name>例えば、すべてのEmptyタイプのサービスは次のように見つけることができます:
$ ros2 service find std_srvs/srv/Empty
/clear
/reset5 ros2 interface show
コマンドラインからサービスを呼び出すことができますが、まず入力引数の構造を知る必要があります。
$ ros2 interface show <type_name>/clearサービスのタイプEmptyでこれを試してみてください:
$ ros2 interface show std_srvs/srv/Empty
------は、リクエスト構造(上)とレスポンス構造(下)を分離します。しかし、先ほど学んだように、Emptyタイプはデータを送受信しません。したがって、当然ながら、その構造は空白です。
/spawnのようにデータを送受信するタイプのサービスを調べてみましょう。ros2 service list -tの結果から、/spawnのタイプはturtlesim/srv/Spawnであることがわかります。
/spawnサービスのリクエストとレスポンス引数を確認するには、次のコマンドを実行します:
$ ros2 interface show turtlesim/srv/Spawn
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name---行の上の情報は、/spawnを呼び出すために必要な引数を教えてくれます。x、y、thetaはスポーンされるタートルの2Dポーズを決定し、nameは明らかにオプションです。
行の下の情報は、この場合知る必要はありませんが、呼び出しから得られるレスポンスのデータタイプを理解するのに役立ちます。
6 ros2 service call
サービスタイプとは何か、サービスのタイプの見つけ方、そのタイプの引数の構造の見つけ方がわかったので、次を使用してサービスを呼び出すことができます:
$ ros2 service call <service_name> <service_type> <arguments><arguments>部分はオプションです。例えば、Emptyタイプのサービスには引数がないことがわかります:
$ ros2 service call /clear std_srvs/srv/Emptyこのコマンドは、タートルが描いた線をturtlesimウィンドウからクリアします。

次に、/spawnを呼び出して引数を設定することで、新しいタートルをスポーンしましょう。コマンドラインからのサービス呼び出しの<arguments>入力は、YAML構文である必要があります。
次のコマンドを入力します:
$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
response:
turtlesim.srv.Spawn_Response(name='turtle2')何が起こっているかのメソッドスタイルビューが表示され、その後サービスレスポンスが表示されます。
turtlesimウィンドウは、新しくスポーンされたタートルですぐに更新されます:

まとめ
ROS 2では、ノードはサービスを使用して通信できます。トピック(ノードが情報を公開し、1つ以上のサブスクライバーが消費できる一方向通信パターン)とは異なり、サービスはクライアントがサービスを提供するノードにリクエストを行い、サービスがリクエストを処理してレスポンスを生成するリクエスト/レスポンスパターンです。
一般的に、継続的な呼び出しにはサービスを使用したくありません。トピックやアクションの方が適しているでしょう。
このチュートリアルでは、コマンドラインツールを使用してサービスの識別、検査、呼び出しを行いました。
次のステップ
次のチュートリアル「パラメータの理解」では、ノード設定の構成について学習します。
関連コンテンツ
このチュートリアルをチェックしてください。Robotisロボットアームを使用したROSサービスの優れた現実的な応用例です。