Up:Tutorial?     Previous:音声認識?     Next:複数個のカメラ設置

視覚に関する操作方法

視覚に関する操作方法を説明します。

周りを見渡す

エージェントがいろいろな方向を見渡すことができるサンプルコードを紹介します。(バージョン110830以降正常に動作)

コントローラ作成

$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs WatchController.cpp

WatchController.cpp

これは回転する角度をメッセージとして受信して、その角度だけ体を回転させるサンプルです。

z軸方向(ロボットが最初に前を向いている方向)からの角度を指定します。回転する角度は-180°から180°まで指定することができます。

それではコンパイルします。

$ emacs Makefile

変更前

#オブジェクトファイルの指定
OBJS     = SendText.so RecvText.so

変更後

#オブジェクトファイルの指定
OBJS     = WatchController.so
$ make

リビングルームの世界ファイル作成

新しく世界ファイルを作成します。

$ cd ~/sigverse-<version>/bin
$ emacs xml/WatchWorld.xml

WatchWorld.xml

これはリビングルームにヒューマノイドロボット(Robot-nii.xml)が立っているというxmlファイルです。リビングルームにはテレビやソファなどがおかれています。

このxmlファイルではエージェントの視点の位置や、視点の向きの設定がされています。 視点の位置は"elnk1"でカメラを設置するリンク名を指定することができます。(デフォルトでは"elnk1"は"HEAD_LINK"に設定されています。つまりエージェントの顔にカメラが設置されています。リンク名はJoint定義一覧?を参照してください。次に"epx1","epy1","epz1"でカメラの位置を指定します。これらはすべてエージェント座標系で設定されます。エージェント座標系とはエージェントが基準となる座標系で、x軸がエージェントから見て左右(左が正方向)、y軸が上下(上が正方向)、z軸が前後(前が正方向)となります。このとき原点はリンクの位置になります。

視点の向きはベクトルで表されます。今回視点の向きを(evx1,evy1,evz1)=(0,-1,1)と設定しました。つまりエージェントはまっすぐ前を向いた方向から、下方向45°に目線があるということになります。

また、ヒューマノイド以外のエージェント(ここではseToy_D.xml)のカメラの位置、方向を設定するときは位置(vpx,vpy,vpz), 視線(vvx,vvy,vvz)で設定します。このときの原点はエージェントの位置になります。

起動

それでは起動してみましょう。

$ ./sigserver.sh -w WatchWorld.xml -p 9001

SIGViewerでサーバに接続して、シミュレーションを開始します。リビングルームに立っているヒューマノイドロボット型のエージェントが見えると思います。

watch_1.jpg

次に、ヒューマノイドロボットをクリックすると、左上の小さい画面にロボットの目線から見た映像が表示されます。

Watch_3.jpg

ロボットの目線からはりんごが見えているのがわかります。右のDetected Entitiesを見てみると、ロボットから見て、りんごが検出されているのがわかります。

watch_2.jpg

次に右側のコマンドタブをクリックして、ヒューマノイド型ロボットのエージェントに回転する角度を指定して、実行ボタンを押し、メッセージを送信します。例えば180を送信します。

watch_3_5.jpg
 
watch_4.jpg

ロボットが180°回転して今度はテレビや、木、テーブルなどが検出されているのがわかります。

オブジェクトの検出(detectEntities)

次にオレンジを見つけたら手を挙げるサンプルを紹介します。

※注意)このサンプルはポートフォワーディングによる接続の場合、SIGViewerのバージョン1.3以上で動作します。また、サービスプロバイダを利用するため、双方向のポートフォワーディングが必要です。クライアントpcのファイアーウォールの設定によっては正常に動作しない場合があります。

コントローラ作成

コントローラを作成します。

$ cd ..
$ emacs WatchOrange.cpp

WatchOrange.cpp

これはオレンジを見つけたら手を挙げるサンプルです。detectEntitiesで視野内にあるエンティティを検出します。

それではコンパイルします。

$ emacs Makefile

編集前

#オブジェクトファイルの指定
OBJS     = WatchController.so

編集後

#オブジェクトファイルの指定
OBJS     = WatchOrange.so
$ make

世界ファイル編集

次に世界ファイルを編集します。

$ cd ..
$ emacs xml/WatchWorld.xml

WatchWorld.xml

     ↓

実行

それでは実行してみましょう。

$ ./sigserver.sh -w WatchWorld.xml -p 9001
watch_5.jpg

オレンジを見つけたら手を挙げます。

複数カメラの場合

エージェントに複数のカメラを設置することができます。複数個のカメラ設置方法については次のページ複数個のカメラ設置を参考にしてください。

このときdetectEntitiesの最後の引数にカメラ番号を指定することができます。

以下はカメラ番号2を指定する場合

    bool b = detectEntities(ent);

      ↓

    bool b = detectEntities(ent, 2);

何も指定しない場合は自動的にデフォルトで設置されているカメラ1が指定されます。

Up:Tutorial?     Previous:音声認識?     Next:複数個のカメラ設置


Attach file: filewatch_3_5.jpg 2710 download [Information] filewatch_4.jpg 2713 download [Information] filewatch_1.jpg 2651 download [Information] filewatch_5.jpg 2644 download [Information] filewatch_2.jpg 2668 download [Information] fileWatch_3.jpg 2586 download [Information]

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2011-10-28 (Fri) 13:10:02 (4563d)