安曇野の森から > ROS(Robot Operating System)を使う > サービス

サービス

サービスはクライアントサーバー型の同期通信の仕組みです。

クライアントがサーバーへリクエストを送り、サーバーがそれを受け取ったらリクエストの処理を行い、結果をレスポンスとしてクライアントへ返します。

以下ではサービス用のクライアントとサーバーをプログラムで実現する例を説明します。


サービスクライアント

サービスクライアントはサービスサーバーへリクエストを送信し、サービスサーバーからレスポンスが戻るのを待ち、その結果で、なんらかの処理を行うプログラムです。


クライアントプログラム

以下はサービスクライアントのサンプルプログラム(clt_test.cpp)です。
このサンプルプログラムはリクエストを送信しレスポンスが戻ったら、"Recive response!"を表示します。


クライアントプログラムの説明

次の2行はノードを作る際に、お約束で必ず呼び出さないといけないAPIです。
詳しくは「簡単なプログラムを作って動かしてみる」の「プログラムの簡単な説明」を見てください。


次のAPIでノードハンドルからサービスクライアントオブジェクトtestClientを生成しています。
ここで送信するサービスは標準で定義されている中身の無いサービスです。このサービスは単にイベントを伝えるだけのために使います。
ここでクライアント生成時にサービスには"test"という名称を付けています。


次のAPIでリクエストオブジェクトとレスポンスオブジェクトを生成します。


次のAPIでリクエストreqをサーバーに投げています。
サーバーからレスポンスが正常に戻ると戻り値がtrueになりレスポンスrespに結果が入ります。


サーバーからレスポンスが正常の場合には"Recive response!"を表示し、異常の場合には"Error!"を表示します。


サービスサーバー

サービスサーバーはサービスクライアントからのリクエストを受信したら、なんらかの処理を行い、その結果をレスポンスとしてサービスクライアントへ返すプログラムです。


サーバープログラム

以下はサービスサーバーのサンプルプログラム(srv_test.cpp)です。
このサンプルプログラムはリクエストを受信したら"Recive Request!"を表示をし、レスポンスを返します。





サーバープログラムの説明

次のAPIでノードハンドルからサービスサーバーオブジェクトを生成し、クライアントからリクエストが来た際に呼び出すコールバック関数を登録しています。


次のAPIでクライアントからのリクエストを無限ループで待ちに入ります。


以下がリクエスト受信時に呼ばれるコールバック関数です。リクエストを受け取ったらの文字列"Recive Request!"を表示し、レスポンスとしてtrueを返します。


サンプルプログラムの実行

今回はサービスパッケージを使いますのでCMakeLists.txtの以下の部分に"std_srvs"を追加してください。


上記以外は通常のビルド方法と同じです。
サンプルプログラムのビルド後、以下のようなローンチファイル(srv_test.launch)を作成します。

最初にクライアントを起動してしまうとクライアントからのリクエストを受け取る相手がいないためにエラーになります。

最初にサーバーを起動し、次にクライアントを起動すサンプルプログラムの実行る順番でローンチファイルを構成します。


上記ローンチファイルを以下のコマンドで実行します。


実行結果(一部)は以下のようになります。

クライアントからのリクエストがサーバーに渡り、サーバーがレスポンスを返し、クライアントがレスポンスを受け取っていることがわかります。




inserted by FC2 system