Up:Tutorial? Previous:複数個のカメラ設置 Next:エージェントの衝突 エージェント視点の画像取得 (captureView) †ここではエージェント視線や視点を変化させその時の画像を取得するサンプルを紹介します。 ※ここで使用するcaptureViewはSIGViewerのサービスプロバイダ機能を使用するため、ポートフォワーディングによる接続の場合は双方向のポートフォワーディングが必要になります。双方ポートフォワーディングの方法はこちら? コントローラ作成 †まずコントローラを作成します。 $ cd ~/sigverse-<version>/bin/NewWorld $ emacs captureView.cpp captureView.cpp
このサンプルは定期的に呼び出される関数onActionで視線を常に変化させています。変化する視線の範囲は視線ベクトルのx成分が-1.0~1.0です。視線ベクトルのz成分が1, y成分が0の時エージェントの視線はまっすぐ前を向いた方向から左方向に45°、右方向に45°視線を行ったり来たりします。
エージェントが"capture"というメッセージを受信するとcaptureViewを実行しエージェント視点の画像を取得します。この時、実行時のディレクトリにview000.bmp, view001.bmpといったようにcaptureするたびに画像ファイルが保存されます。
このエージェントはメッセージ"move"を受信すると現在向いている方向に進みます。"rotation"を受信するとエージェントは向きを変えます。 コンパイル †それではコンパイルします。 $ emacs Makefile オブジェクトファイルの指定を修正します。 #オブジェクトファイルの指定 OBJS = captureView.so $ make 世界ファイル作成 †$ cd .. $ emacs xml/captureView.xml 世界ファイルは前節(視覚に関する操作)で使用したリビングルームの世界ファイルとほとんど同じものを使います。 captureView.xml 画像取得 †それでは実行してみましょう $ ./sigserver.sh -p 9001 -w captureView.xml SIGViewerで接続してみるとリビングルームにロボットが立っているのが見えます。 "start"ボタンを押してシミュレーションを開始して、ロボットをクリックすると左上の画像でエージェントの視線が動いているのがわかると思います。 次にSIGViewerからエージェントに"rotation"や"move"などのメッセージを送信してエージェントが向きを変えたり、移動したりすることを確認してみてください。 キャプチャしたいタイミングで"capture"を送信するとエージェント視線の画像が得られます。 複数カメラの場合 †上のサンプルではエージェント設置されたカメラは一つでしたが、エージェントに複数個カメラが設置されている場合はcaptureViewするときにカメラ番号を指定することができます。 世界ファイルの編集 †$ emacs xml/captureView.xml ヒューマノイドロボットにカメラ2を追加します。 ヒューマノイドロボットのカメラ設定の箇所を以下のように変更します。 captureView.xml ↓ カメラ1とカメラ2で微妙に位置と方向をずらしました。つまりカメラ1が左目、カメラ2が右目に対応します。 コントローラ修正 †次にカメラが2つある場合に対応したコントローラに修正します。 $ cd NewWorld $ emacs captureView.cpp captureViewの最後の引数にカメラ番号を指定します。指定がなければ自動的にカメラ1の画像を取得します。このコントローラは受信したメッセージが"capture1"であればカメラ1、"capture2"であればカメラ2の画像を取得します。 SIGViewerで表示 †それではコンパイルして実行してみましょう。 $ make $ cd .. $ ./sigserver.sh -p 9001 -w captureView.xml SIGVerseを実行してSIGViewerで確認してみます。ロボットをクリックすると、SIGViewerの左上にカメラが2つついているのが確認できます。 ロボットに"capture1"または"capture2"を送ってそれぞれ別のカメラの画像が習得できることを確認してみてください。 |