Up:[[Tutorial]]     Previous:[[エージェント間のメッセージのやりとり]]     Next:[[サービスプロバイダの使用方法]]

----

#contents


*視覚に関する操作方法 [#f37ce459]

※v2.1.0以降対応

視覚に関する操作方法を説明します。~
//なお、ここで説明する機能はSIGViewer1.3.5以降のバージョンでは、サポートされていません。
**周りを見渡す [#scce7ec9]
エージェントがいろいろな方向を見渡すことができるサンプルを紹介します。

***コントローラ作成 [#t10e6f74]
 $ cd ~/MyWorld
 $ emacs WatchController.cpp

WatchController.cpp

#highlight(cpp){{
#include "Controller.h"
#include "Logger.h"
#include "ControllerEvent.h"

#define PI 3.141592
#define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 )

class WatchController : public Controller
{
public:
  void onRecvMsg(RecvMsgEvent &evt);
};

void WatchController::onRecvMsg(RecvMsgEvent &evt)
{
  SimObj *my = getObj(myname());

  //受け取ったメッセージをint型に変換します
  const char *value = evt.getMsg();
  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;
}
}}

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

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

***コンパイル [#ebdcf9b7]
コンパイルします。
 
 $ ./sigmake.sh  WatchController.cpp


***リビングルームの世界ファイル作成 [#iea3d264]
新しく世界ファイルを作成します。

 $ emacs WatchWorld.xml

WatchWorld.xml

#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld5">

  <gravity x="0.0" y="-980.7" z="0.0"/>

  <!--エージェントRobot-niiの設定-->
  <instanciate class="Robot-nii.xml">

    <!--エージェント名-->
    <set-attr-value name="name" value="robot_000"/>

    <!--C++言語の指定-->
    <set-attr-value name="language" value="c++"/>

    <!--コントローラの指定-->
    <set-attr-value name="implementation"
                    value="./WatchController.so"/>

    <!--動力学演算をfalseに設定-->
    <set-attr-value name="dynamics" value="false"/>

    <!--エージェントの位置(x,y,z)-->
    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="54.0"/>
    <set-attr-value name="z" value="-40.0"/>

    <!--カメラのID番号,リンク名、方向、位置の設定-->
    <camera id="1"
            link="HEAD_LINK"
            direction="0 -1 1"
            aspectRatio="1.5"
            fov="45"
            position="0.0 0.0 5.0"/>
  </instanciate>

  <!--リビングルーム-->
  <instanciate class="seTV.xml">
    <set-attr-value name="name" value="TV_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="-20.0"/>
    <set-attr-value name="y" value="87.5"/>
    <set-attr-value name="z" value="-250.0"/>
    <set-attr-value name="visStateAttrName" value="switch"/>
    <set-attr-value name="switch" value="on"/>
  </instanciate>

  <instanciate class="seDoll_Bear.xml">
    <set-attr-value name="name" value="kuma_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="9.9"/>
    <set-attr-value name="z" value="0.0"/>
  </instanciate>

  <instanciate class="seToy_D.xml">
    <set-attr-value name="name" value="penguin_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="50.0"/>
    <set-attr-value name="y" value="6.15"/>
    <set-attr-value name="z" value="-40.0"/>
  </instanciate>

  <instanciate class="seSofa_2seater.xml">
    <set-attr-value name="name" value="sofa_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="-200.0"/>
    <set-attr-value name="y" value="31.85"/>
    <set-attr-value name="z" value="-100.0"/>
    <set-attr-value name="qw" value="0.707"/>
    <set-attr-value name="qx" value="0.0"/>
    <set-attr-value name="qy" value="0.707"/>
    <set-attr-value name="qz" value="0.0"/>
  </instanciate>

  <instanciate class="seTVbass_B.xml">
    <set-attr-value name="name" value="TVdai_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="-20.0"/>
    <set-attr-value name="y" value="25.1"/>
    <set-attr-value name="z" value="-250.0"/>
  </instanciate>

  <instanciate class="sePlant_B.xml">
    <set-attr-value name="name" value="ki_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="100.0"/>
    <set-attr-value name="y" value="56.5"/>
    <set-attr-value name="z" value="-250.0"/>
  </instanciate>

  <instanciate class="seSidetable_B.xml">
    <set-attr-value name="name" value="sidetable_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="-100.0"/>
    <set-attr-value name="y" value="16.0"/>
    <set-attr-value name="z" value="-100.0"/>
    <set-attr-value name="qw" value="0.707"/>
    <set-attr-value name="qx" value="0.0"/>
    <set-attr-value name="qy" value="0.707"/>
    <set-attr-value name="qz" value="0.0"/>
  </instanciate>
  <instanciate class="seApple.xml">
    <set-attr-value name="name" value="apple_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="-50.0"/>
    <set-attr-value name="y" value="3.875"/>
    <set-attr-value name="z" value="30.0"/>
  </instanciate>

  <instanciate class="seOrange.xml">
    <set-attr-value name="name" value="orange_0"/>
    <set-attr-value name="dynamics" value="false"/>
    <set-attr-value name="x" value="70.0"/>
    <set-attr-value name="y" value="2.215"/>
    <set-attr-value name="z" value="-30.0"/>
  </instanciate>

</world>

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

この世界ファイルではロボットエージェントにカメラが設置されています。カメラの位置や方向などは以下のように設置しました。

#highlight(xml:firstline[28]){{
    <camera id="1"
            link="HEAD_LINK"
            direction="0 -1 1"
            aspectRatio="1.5"
            fov="45"
            position="0.0 0.0 5.0"/>
}}

linkでカメラを設置するパーツ名を指定します。このサンプルではを"HEAD_LINK"に設置しました。ヒューマノイドロボットのパーツ名は[[Joint定義一覧]]のLink名を参照してください。関節やパーツを持たないエンティティにカメラを設置する場合はlink名を設定することはできません。

カメラの位置はlinkを設定した場合はlinkの位置からの相対位置となります。

direction, position でカメラの方向ベクトル、位置を設定します。このサンプルではまっすぐ前を向いた方向から、下方向45°に目線があるということになります。

同様にaspectRatio, fov でカメラのアスペクト比、視野角(y方向)なども設定できます。

これらのパラメータを設定しなかった場合はデフォルト値が設定されます。

|パラメータ名|デフォルト値|
|position| "0 0 0"|
|direction| "0 0 1" |
|link   | "(Root link name)" |
|aspectRatio | "1.5" |
|fov     |   "45" (degree)|

1エージェントに複数個のカメラを設置する場合は以下のようにidを1,2,3と順番につけていきます。

#highlight(xml:firstline[28]){{
    <camera id="1"
            :
                
    <camera id="2"
            :
}}
***起動 [#s12fde3f]
それでは起動してみましょう。

 $ sigserver.sh -w ./WatchWorld.xml

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

#ref(視覚に関する操作(v2.0系)/watch_1.PNG,40%)

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

#ref(視覚に関する操作(v2.0系)/watch_2.PNG)

さらにその枠の右上にあるボタンを押すとロボットから見た映像がメイン画面に切り替わります。

#ref(視覚に関する操作(v2.0系)/watch_3.PNG,40%)

元に戻したい場合はもう一度左上のサブウィンドウの右上にあるボタンを押します。

カメラの位置や視線方向を確認したい場合はビューワーの右下のトレイにあるEntityDataをクリックし、エンティティをクリックします。

#ref(./Watch_7.PNG,40%)

カメラの位置とカメラの視線方向がオレンジ色で示されています。

次に右下のトレイにある"Message"ボタンをクリックして、ヒューマノイド型ロボットのエージェントに回転する角度を指定して、メッセージを送信します。例えば90を送信します。

#ref(視覚に関する操作(v2.0系)/watch_4.PNG,80%)

するとロボットが90°回転してロボットの視線からはオレンジやペンギンのおもちゃが見えているのがわかります。


#ref(視覚に関する操作(v2.0系)/watch_5.PNG,40%)


*Old Version [#e5d66315]
-[[視覚に関する操作(v2.0系)]]
-[[視覚に関する操作(v120330, v1.4.8)]] 

----
#highlight(end)
Up:[[Tutorial]]     Previous:[[エージェント間のメッセージのやりとり]]     Next:[[サービスプロバイダの使用方法]]

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