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でサーバに接続して、シミュレーションを開始します。リビングルームに立っているヒューマノイドロボット型のエージェントが見えると思います。
#ref(): File not found: "watch_1.jpg" at page "視覚に関する操作(v2.0系)"
次に、ヒューマノイドロボットをクリックすると、左上の小さい画面にロボットの目線から見た映像が表示されます。
#ref(): File not found: "Watch_3.jpg" at page "視覚に関する操作(v2.0系)"
ロボットの目線からはりんごが見えているのがわかります。右のDetected Entitiesを見てみると、ロボットから見て、りんごが検出されているのがわかります。
#ref(): File not found: "watch_2.jpg" at page "視覚に関する操作(v2.0系)"
次に右側のコマンドタブをクリックして、ヒューマノイド型ロボットのエージェントに回転する角度を指定して、実行ボタンを押し、メッセージを送信します。例えば180を送信します。
#ref(): File not found: "watch_3_5.jpg" at page "視覚に関する操作(v2.0系)"
#ref(): File not found: "watch_4.jpg" at page "視覚に関する操作(v2.0系)"
ロボットが180°回転して今度はテレビや、木、テーブルなどが検出されているのがわかります。
次にオレンジを見つけたら手を挙げるサンプルを紹介します。
※注意)このサンプルはポートフォワーディングによる接続の場合、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
#ref(): File not found: "watch_5.jpg" at page "視覚に関する操作(v2.0系)"
オレンジを見つけたら手を挙げます。
エージェントに複数のカメラを設置することができます。複数個のカメラ設置方法については次のページ複数個のカメラ設置を参考にしてください。
このときdetectEntitiesの最後の引数にカメラ番号を指定することができます。
以下はカメラ番号2を指定する場合
bool b = detectEntities(ent);
↓
bool b = detectEntities(ent, 2);
何も指定しない場合は自動的にデフォルトで設置されているカメラ1が指定されます。