前回の続き。
前編で下準備が完了したので、後半は実装のお話し。
使用したソースコードはGitHubに後でおく予定。
前編で下準備が完了したので、後半は実装のお話し。
使用したソースコードはGitHubに後でおく予定。
Implementing a Service
service_server.py
callbackで指定された文の単語数を返す。
注意点
- WordCountResponseとWordCountをimportする。
- ノードを活かしておくためにrospy.spin()使う。手っ取りばやい。
Checking That Everything Works as Expected
作成したノードを実行してみる。
$ rosrun service_sample service_server.py
service_sampleの部分はcatkin_create_pkgで指定したパッケージ名になります。
ちゃんと動いてるか確認するのに、以下を実行。
$ rosservice list
これで/word_countが表示されることを確認。
さらに、追加で情報が欲しい場合は、以下を実行。
$ rosservice info word_count
これでノード名や型、引数等の情報が表示される。
Other Ways of Returning Values from a Service
戻り値、いろんな形式で指定できますよ、の説明。3通り。省略
Using a Service
server側の実装はできたので、コマンドラインから以下で確認することも可能。
$ rosservice call word_count 'one two three'
count: 3
でも通常は別のノードから呼び出すので、client側のサンプル作りましょー。
service_client.py
ポイント
- rospy.wait_for_service('word_count')でサービスが開始するのを待つ。
サービスが開始する前の呼び出すと、exceptionで落ちる。
- word_counter = rospy.ServiceProxy('word_count', WordCount)で指定したword_counterに
引数(文字数確認対象の文字列)を指定して呼び出す。
Checking That Everithing Works as Expected
コマンドラインから動作確認。
$ rosrun service_sample service_client.py these are some words
these are some words -> 4
注意点
何かしらサーバーに問題があると永遠にclientが待ち続けることがあるよ、と。(まじか。。)
Other Ways to Call Service
- 戻り値2個のケース。戻り値を受ける変数がc, iとかだと、srvで定義した順に戻り値が返る。
例: c, i = word_count(words, 3) だと、count, ignoreの順。
- serviceを使うのに、WordCountRequestを使って以下のように書くこともできる。
request = WordCountRequest('one two three', 3)
count, ignored = word_counter(request)
この書き方をする場合は、WordCountRequestをimportするのを忘れないこと。
- 引数にword_counter(words='one two three')みたいにキーワードを指定することもできます。
ただし、この書き方の場合指定しない引数は不定とかになるのをちゃんと注意しましょうね。
Summary
- serviceの使い方、実装の仕方を一通り確認しました。
- 全部はカバーしてないのでwikiを見ましょうね。http://wiki.ros.org/Services?distro=indigo
- 同期の返事が必要なとき、とか必要なときに使いましょう。
基本replyはすぐ返ることを想定しているので、長時間replyにかかる場合はChapter5の
action を使ったほうがいいかもしれません。
=============================================================================
ということで、一通りServiceについて終了。
どういうときに使うかは使いながら覚えていこうと思います。
せっかくだからactionについても勉強してみる。近々。