[[Tutorial]]

Up:[[Tutorial]]     Previous:[[エージェント間のメッセージのやりとり]]     Next:[[複数個のカメラ設置]]

----

#contents


**オブジェクトの検出(detectEntities) [#b15d4040]
ここではサービスプロバイダを使ってオレンジを見つけたら手を挙げるサンプルを紹介します。

このサンプルはサービスプロバイダ機能を使用します。SSH接続によりサーバに接続している場合には追加でサービスプロバイダ用のポートフォワーディングの設定が必要です。

※ビューワーによるSSH接続をしている場合はバージョン2.0.1ではサービスプロバイダ機能には対応しておりません。Cygwinによるポートフォワーディング設定を行ってください。

***コントローラ作成[#cef2b65c]
コントローラを作成します。
 $ cd ..
 $ emacs WatchOrange.cpp

WatchOrange.cpp

#highlight(cpp){{
 #include <string>
 #include <iostream>
 #include "Controller.h"
 #include "Logger.h"
 #include "ControllerEvent.h"
 
 #define PI 3.141592
 #define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 )
 
 //利用する名前空間の宣言
 using namespace std;
 
 class WatchController : public Controller
 {
 public:
   double onAction(ActionEvent &evt);
   void onRecvMessage(RecvMessageEvent &evt);
 };
 
 //能動的行動を行います。
 double WatchController::onAction(ActionEvent &evt)
 {
   try {
     SimObj *my = getObj(myname());
 
     //手をさげます。
      my->setJointAngle("LARM_JOINT2", DEG2RAD(0));
 
     //視野内のEntityを得ます。
      vector<string>  ent; 
     bool b = detectEntities(ent);
     if(b && ent.size() > 0) { 
 
      //検出したEntityの名前を取得します。
       vector<string>::iterator i;
      for ( i = ent.begin(); i!= ent.end(); i++) {
        string name = *i;
 
        //検出したEntityを表示します。
         LOG_MSG(("detected %s\n", name.c_str()));
 
        if (name == "orange_0"){
          LOG_MSG(("This is orange"));
 
          //オレンジを見つけると手を挙げます。
           my->setJointAngle("LARM_JOINT2", DEG2RAD(180));
         }
       }
     }
   } catch(SimObj::Exception &) {
     LOG_ERR(("Exception"));
   }
 
   return 1.0;
 }
 
 //受動的行動を行います。
 void WatchController::onRecvMessage(RecvMessageEvent &evt)
 {
   SimObj *my = getObj(myname());
   const char *value(evt.getString(0));
   int angle = atoi(value);
 
   if (angle <= 180 && angle >=-180){
       //体全体をz軸から指定した角度だけ回転します.
       my->setAxisAndAngle(0, 1.0, 0, DEG2RAD(angle));
 
     }
 }
 
 extern "C"  Controller * createController ()
 {
   return new WatchController;
 }
}}
これはオレンジを見つけたら手を挙げるサンプルです。detectEntitiesで視野内にあるエンティティを検出します。

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

 $ emacs Makefile

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

編集後
 
 #オブジェクトファイルの指定
 OBJS     = WatchOrange.so

 $ make

***世界ファイル編集 [#d02191e6]
次に世界ファイルを編集します。

 $ cd ..
 $ emacs xml/WatchWorld.xml

WatchWorld.xml

#highlight(cpp:firstline[15]){{
 <!--コントローラの指定-->
        <set-attr-value name="implementation"
 value="./NewWorld/WatchController.so"/>
}}
     ↓
#highlight(cpp:firstline[15]){{
 <!--コントローラの指定-->
        <set-attr-value name="implementation"
 value="./NewWorld/WatchOrange.so"/>
}}
***実行 [#i1a28c90]
それでは実行してみましょう。

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

#ref(watch_5.jpg)

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

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

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

以下はカメラ番号2を指定する場合
     bool b = detectEntities(ent);
      ↓
     bool b = detectEntities(ent, 2);
何も指定しない場合は自動的にデフォルトで設置されているカメラ1が指定されます。

*更新履歴 [#e5d66315]
-[[視覚に関する操作(v120330, v1.4.8)]] 


#highlight(end)
Up:[[Tutorial]]     Previous:[[音声認識]]     Next:[[複数個のカメラ設置]]


Front page   New List of pages Search Recent changes   Help   RSS of recent changes