サービスの書き方

ROSチュートリアルの流れ

はじめに

この章では、サービスの書き方について説明したいと思います。

サービスにはデータを要求する「クライアント」と応答する「サーバ」があります。

これはトピックの「サブスクライバ」と「パブリッシャ」の関係に似ていますが、サービスは更に応答の成否を知ることができます。

またトピックではメッセージ(.msg)を使用しましたが、サービスではサービスのファイル(.srv)を使用します。

詳しくはROSでよく使用する用語を御覧ください。

サービスファイル

サービスでは.srvという拡張子になっているファイルを使用します。 まず標準のサービスstd_srvsSetBool.srvを見てみましょう。

以下のように表示されるはずです。

---の上が入力、下が出力になります。

サービスサーバ

最初にサーバ側から書いていきます。

server.pyを作成します。

実行権限を与えます。

コード解説

ここまで今までと同じです。

標準のサービスのstd_srvsの中にあるSetBoolとその出力に関するSetBoolResponseをインポートしています。

先にメイン関数について説明します。

srv_serverというノードの名前にしています。

ここでサービスをインスタンスしています。service_callがサービス名、SetBoolがサービスの型、callback_srvがサービスの引数を返すコールバック関数名になります。

一番最初はreadyと表示させておきます。

プログラムを終了させないようにしています。

最後にコールバック関数について解説します。

callback_srvという関数名で、受け取った値をdataという名前にしてます。

SetBoolResponserespという名前でインスタンス化しています。

Trueが入力された場合、つまり呼び出しがあった時、messageにcalledを書き込み、呼び出されたことを伝えるためsuccessにTrueを書き込んでいます。

それ以外の場合やFalseが入力された場合は、messageにreadyを書き込み、呼び出されていないことを伝えるためsuccessにFalseを書き込んでいます。

確認のため、messageを表示しています。

最後にサービスの型を返す必要があり、SetBoolResponseをインスタンス化したrespを返しています。

サービスクライアント

次にクライアント側を書いていきます。

client.pyを作成します。

実行権限を与えます。

コード解説

ここまで同じです。

SetBool型をインポートしています。

ここでservice_callというサービスが立ち上がるのを待ちます。

トピックを違い、サービスは一対一通信のため相手がいないとエラーを吐きます。 そのためサービスの立ち上がりを待っています。

sarvice_callという名前のSetBool型のサービスプロキシservice_clientを作成しています。

service_clientにTrueを与えています。

実行方法

それぞれ別のターミナルで実行してください。

実行結果

を実行した時、rosrun ros_tutorial server.pyを実行しているターミナルで、

と表示されたら、正常に動作しています。

別の方法

ここまで同じですが、こちらではrosserviceというコマンドを使用します。 このコマンドでもサーバに要求できます。

Last updated

Was this helpful?