※このチュートリアルはv2.2.0以降対応しています。また、少なくとも、http://wiki.ros.orgのチュートリアル・http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 (catkin) まで実施済みの環境を想定しています。
ここでは既存のROSノードをSIGVerseで利用する方法を紹介します。ROSのサンプルプログラムTurtleSimで使用されている亀アバターの制御ノードをほぼそのまま用いて、SIGVerse内のロボットを操作することを目的とします。
まずコントローラを作成します。
$ emacs captureView.cpp
captureView.cpp
50行目の関数captureViewで画像データをビューワーから取得します。
1番目の引数は取得したいカメラのID番号を指定します。ここではID番号2を指定しました。2番目と3番目に1ピクセルあたりのビット深度と画像サイズを指定します。(※v2.1.0ではビット深度24, 画像サイズ320×240のみ取得可)
取得したViewImageから画像データを取り出すには関数getBuffer()を用います。
このサンプルではエージェントに"capture"というメッセージを送信するとエージェントは画像を取得することができます。
captureViewが成功すると実行ディレクトリにview000.bmp, view001.bmp...というようにbmp形式の画像ファイルが保存されます。
このエージェントはメッセージ"move"を受信すると現在向いている方向に進みます。"rotation"を受信するとエージェントは向きを変えます。
$ ./sigmake.sh captureView.cpp
$ emacs captureView.xml
世界ファイルは前ページ視覚に関する操作で使用したリビングルームの世界ファイルとほとんど同じものを使います。
captureView.xml
エージェントに2つのカメラを設置し、2つのカメラで微妙に位置と方向をずらしました。
カメラID番号1が右目、2が左目に相当します。
それでは実行してみましょう
$ sigserver.sh -w ./captureView.xml
SIGViewerで接続してみるとリビングルームにロボットが立っているのが見えます。
シミュレーションを開始して"rotation"や"move"などのメッセージを送信するとエージェントが向きを変えたり、移動したりして自由に部屋の中を移動できるようになります。
キャプチャしたいタイミングで"capture"を送信するとエージェントに設置されたカメラ(ID番号2)で撮影した画像が得られます。
サーバ側の実行ディレクトリにカメラ2でcaptureした画像ファイルが保存されていれば成功です。
Up:Tutorial? Previous:サービスプロバイダの使用方法 Next:エージェントの衝突