独自のサービスファイルの作り方
ROSチュートリアルの流れ
独自のサービスファイルの作り方 ←今ここ
はじめに
この章では、独自のサービスファイルを作成し、ROSで使用する方法を解説します。
独自のメッセージファイルの作り方で作成した日付と時間を配信するトピックを改良して、日付と時間を返すサービスを作成してみたいと思います。
サービスファイルの書き方
独自のサービスファイルは、srvディレクトリに置きます。 無い場合はsrvディレクトリを作りましょう。
roscd ros_tutorial/
mkdir srv要求に対し日時と時間を返すサービスを作成してみましょう。
DateTrigger.srvの中はこのように書きます。
これは入力は何もなく、出力はboolのsuccessとint32のdate、float64のtimeを定義しています。
つまりサービスに対して、要求があったらsuccessとdate、timeを返すということです。
次にCMakeLists.txtを編集します。
57行目からのadd_service_filesのコメントアウトを外し、59行目にDateTrigger.srvを追加します。

catkin_wsに移動し、catkin_makeを行います。
これで準備完了です。
DateTrigger.srvが使用できるか確認していきます。
以下のように表示されたら、正しく作成できています。
プログラムを改良
サーバ
まずros_tutorialパッケージに移動します。
time_pub2.pyをコピーしてdate_server.pyという名前で保存しましょう。
プログラムを以下のように改良します。
実行権限を与えます。
コード解説
time_pub2.pyから変更したところを解説していきます。
今回作成したサービスファイルをインポートします。
callback_srvという関数名で定義してます。
DateTriggereResponseをdという名前でインスタンス化しています。
処理自体は同じですが、最後にreturn dでDateTriggerResponseを返しています。
失敗の場合はFalseを返します。
クライアント
10カウントごとに時刻を取得するプログラムを書きます。
date_client.pyという名前で作成しましょう。
実行権限を与えます。
コード解説
まずClientクラスから説明していきます。
__init__関数では今回呼び出すサービスのdate_callをself.callという名前で宣言しています。 self.resはself.callで呼び出したサービスのレスポンスを受け取るための変数です。
date_call関数では10カウントした後、self.res = self.call()で結果を受け取り表示させています。
date_clientというノード名で宣言し、date_callが立ち上がるのを待っています。
Clientクラスをcという名前でインスタンス化し、プログラムが終了するまでcall関数を呼び出しています。
実行方法
それぞれ別のターミナルで実行してください。
実行結果
date_client.pyを実行したターミナルで以下のように表示されたら正しく実行できています。
2018年11月14日の12時33分4.60767秒を指しています。
Last updated
Was this helpful?