Up:Tutorial? Previous:メッセージ送受信
※このチュートリアルはSIGVerse v2.1.0以降対応です。
エンティティに設置されているカメラの画像データ、距離センサデータをサービスプロバイダで取得するサンプルを紹介します。
これによりクライアント側で画像処理ができるようになります。
サーバ側でコントローラを作成します。
$ emacs captureService.cpp
captureService.cpp
このコントローラは1秒ごとにサービスプロバイダに"capture"というメッセージを送信します。
コンパイルします。
$ sigmake.sh captureService.cpp
世界ファイル作成します。
$ emacs captureService.xml
ロボットだけが登場するシンプルな世界ファイルです。
クライアント側でメッセージ送信ツールの作成?と同様、VC++2008を使って新しくプロジェクトを立ち上げます。
以下のソースコードを追加します。
MyService.cpp
"hostname"は自分の環境に書き換えます。
このサービスプロバイダは"capture"というメッセージを受け取るとViewerにcaptureViewリクエストを送りカメラ画像データを取得します。そしてcaptureViewに成功すると"succeeded" というメッセージをコントローラに返します。
captureViewの最初の引数にはカメラを持ったエンティティ名、2番目以降の引数はコントローラで使用するcaptureViewの1番目以降の引数と同じです。エージェント視点の画像取得?参照。
それでは実行してみます。
$ sigserver.sh -p 9001 -w ./captureService.xml
サーバを立ち上げた状態でビューワーで接続します。 シミュレーションをスタートした後、MyServiceを起動します。
サーバ側で以下のようなメッセージが表示されたら成功です。
[MSG] robot(0.0.0.0) [MyService] succeeded [MSG] robot(0.0.0.0) [MyService] succeeded [MSG] robot(0.0.0.0) [MyService] succeeded
サービスプロバイダ実行フォルダの中にtest.bmpが保存されていることを確認してみてください。
距離センサデータを取得する場合はMyServiceを以下のように修正します。
↓
実行すると取得した距離データがクライアント側で表示されます。
distance 155 distance 155 distancd 155
distanceSensor1D, distanceSensor2Dも同様にサービスプロバイダで利用できます。 第一引数にエンティティ名を指定するということ以外はコントローラAPIのdistanceSensor, distanceSensor1D, distanceSensor2Dと使い方は同じです(距離センサ? 参照)。