Contents
ROSは、ROSのserviceのタイプを記述する際に、簡略化されている記述言語である("srv")を使用します。これは、node間でのrequest/responseのような関係の通信を可能にするために、msg フォーマットに則って作られています。Serviceの記述は、packageのサブディレクトリであるsrv/のなかの.srvで行われます。ですので、.srvファイルを書く前に、msg フォーマットに慣れておくべきです。
Service の記述は、package resource namesという形で参照されて使われます。例えば、robot_srvs/srv/SetJointCmd.srvは一般的に robot_srvs/SetJointCmdと参照されるということです.
コマンドラインツール
rossrv はserviceの内容や、 .srvファイルを含むパッケージなどを表示したり、サービスのタイプを使っているソースファイルを見つけ出すこともできます。
サービスの書き方
サービスのファイルのは、request と response のmsg typeが'---'で分断されて構成されいる。二つの.msgファイルが'---'でつながっているのは、正しいサービスの書き方です。
以下に簡単なサービスの例として、stringを受けとり、stringを返すものを挙げてみます。:
string str --- string str
もちろんもっと複雑な形にすることは可能です。:
#request constants int8 FOO=1 int8 BAR=2 #request fields int8 foobar another_pkg/AnotherMessage msg --- #response constants uint32 SECRET=123456 #response fields another_pkg/YetAnotherMessage val uint32 an_integer
サービスの中に他のサービスを挿入することはできません
.srvファイルをビルドする
ROS Client Librariesは.srvファイルをソースコードに変換するサービスジェネレータを実行します。ほとんどの場合、詳細な内容は一般的なビルドルールを含むことによって解決されますが、これらのサービスジェネレータは、あなたのビルドスクリプトから実行される必要があります。慣習として、すべての.srvファイルは、srvと呼ばれるパッケージの中のディレクトリに蓄えられ、それらのファイルは、gensrv()をCMakeLists.txtに加えることでビルドされます。以下が例です:
cmake_minimum_required(VERSION 2.6) include(rosbuild) rospack(robot_srvs) gensrv()
クライアントライブラリサポート
Pythonでは、生成されるPythonのサービスタイプファイル(例えばfoo_srvs.srv.Foo)が、ほぼすべての必要となるであろう.srvファイルについての情報を提供してくれます。__slots__ や _slot_types、そのほかの変数を使って、requestやreplyメッセージについての情報を内観することができます。さらに、発展的なことを行えるユーザのために、roslibパッケージの中のroslib.srvsのモジュールが、.srvファイルをPythonでパースする機能をサポートしています。このライブラリは、サービスジェネレータを実行する人にのみ推奨されます。