<> <> ROSは、ROSの[[ja/Services|service]]のタイプを記述する際に、簡略化されている記述言語である("srv")を使用します。これは、node間での''request/response''のような関係の通信を可能にするために、[[msg|msg フォーマット]]に則って作られています。Serviceの記述は、[[Packages|package]]のサブディレクトリである`srv/`のなかの`.srv`で行われます。ですので、`.srv`ファイルを書く前に、[[msg|msg フォーマット]]に慣れておくべきです。 Service の記述は、[[Names|package resource names]]という形で参照されて使われます。例えば、`robot_srvs/srv/SetJointCmd.srv`は一般的に `robot_srvs/SetJointCmd`と参照されるということです. == コマンドラインツール == [[rossrv]] はserviceの内容や、 `.srv`ファイルを含むパッケージなどを表示したり、サービスのタイプを使っているソースファイルを見つけ出すこともできます。 == サービスの書き方 == サービスのファイルのは、''request'' と ''response'' の[[msg|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|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でパースする機能をサポートしています。このライブラリは、サービスジェネレータを実行する人にのみ推奨されます。