Up:[[Tutorial]]     Previous:[[エージェント間のメッセージのやりとり]]     Next:[[サービスプロバイダの使用方法]]
Up:[[Tutorial]]     Previous:[[Exchange of messages between agents]]     Next:[[Image capture from agent's perspective]]

----

#contents


*Control method for vision sensor [#q54c34b0]

※This tutorial is compatible with v2.1.0 or later.
I will explain how to use the vision sensor.
//I will explain some functions after. It is not supporter by SIGViewer1.3.5 or later.
**Environment scanning by vision sensor [#ee622eab]
I will introduce the sample file for scanning the environment using the vision sensor.
I will introduce the sample file for the environment scanning using the vision sensor.

***Creation of the controller [#d49f13ea]
 $ 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型に変換します
  // Convert the received message into integer type
  const char *value = evt.getMsg();
  int angle = atoi(value);
  if (angle <= 180 && angle >=-180){

     //体全体をz軸から指定した角度だけ回転します
     // Rorate the body around z-axis with angle[deg]
    my->setAxisAndAngle(0, 1.0, 0, DEG2RAD(angle));
  }
}

extern "C"  Controller * createController ()
{
  return new WatchController;
}
}}

これは回転する角度をメッセージとして受信して、その角度だけ体を回転させるサンプルです。
This sample is used to rotate the body with an angle which is received as message. 
I will define the angle in z-axis direction, this angle must be defined between -180[deg] and 180[deg].

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

***Compiling [#z7c61992]
I will compile the cpp file
*** Compiling [#o5d13342]
 
 $ ./sigmake.sh  WatchController.cpp


***XML file for living room [#n170b769]
I will create a new world file.
*** A world file of a living room [#r7ff3041]

 $ 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の設定-->
  <!-- Configuration of the agent Robot-nii -->
  <instanciate class="Robot-nii.xml">

    <!--エージェント名-->
    <!-- Name of the avatar agent -->
    <set-attr-value name="name" value="robot_000"/>

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

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

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

    <!--エージェントの位置(x,y,z)-->
    <!-- Set the initial position of the agent(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番号,リンク名、方向、位置の設定-->
    <!-- Set ID, link name, direction, position of the camera -->
    <camera id="1"
            link="HEAD_LINK"
            direction="0 -1 1"
            aspectRatio="1.5"
            fov="45"
            position="0.0 0.0 5.0"/>
  </instanciate>

  <!--リビングルーム-->
  <!-- Environment of a living room -->
  <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>

}}

This is a world file of living room with humanoid robot (Robot-nii.xml), it includes also television and armchair.

In this world file the camera is attached to the robot's head. The direction and the position of the camera set as follows:

#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"/>
}}

You can attach the camera to a specific part of the robot by using link parameter. In this sample, "HEAD_LINK" is used. You can find all parts name of the humanoid robot in this page [[Joint定義一覧]]. If you attach the camera to the entity that doesn't have part or joint, the link cannot be used.

カメラの位置はlinkを設定した場合はlinkの位置からの相対位置となります。
The camera position is the relative position to the link.

direction, position でカメラの方向ベクトル、位置を設定します。このサンプルではまっすぐ前を向いた方向から、下方向45°に目線があるということになります。
The camera direction and position can be set. In the sample below, camera direction is set to 45 degrees downward.

同様にaspectRatio, fov でカメラのアスペクト比、視野角(y方向)なども設定できます。
The camera aspect ration and fov can be set as well.

これらのパラメータを設定しなかった場合はデフォルト値が設定されます。
If these parameters are not set the default values are used.

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

1エージェントに複数個のカメラを設置する場合は以下のようにidを1,2,3と順番につけていきます。
If several cameras are set to one agent, IDs 1,2,3 ... are assigned.

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

***Start [#ne91c343]
Let's start SIGVServer.
 $ sigserver.sh -w ./WatchWorld.xml

SIGViewerでサーバに接続して、シミュレーションを開始します。リビングルームに立っているヒューマノイドロボット型のエージェントが見えると思います。
The SIGViewer connects to the server and the simulation will be started. You can see the Agent standing in the living room.

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

次に、ヒューマノイドロボットをクリックすると、左上の小さい画面にロボットの目線から見た映像が表示されます。
If you click on the robot, you will see the view of the vision sensor on the top left of the SIGVIiewer window as shown in the picture below.

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

さらにその枠の右上にあるボタンを押すとロボットから見た映像がメイン画面に切り替わります。
If you click on the top right button in the sub-window, main view and sub view will be switched.

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

元に戻したい場合はもう一度左上のサブウィンドウの右上にあるボタンを押します。
If you want to replace the sub-window, you have to click on its right-top button.

カメラの位置や視線方向を確認したい場合はビューワーの右下のトレイにあるEntityDataをクリックし、エンティティをクリックします。
If you want to check the camera's position and rotation, you have to click on the entity button on the right-bottom of the viewer.

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

カメラの位置とカメラの視線方向がオレンジ色で示されています。
Camera's position and direction are shown as orange vector.

次に右下のトレイにある"Message"ボタンをクリックして、ヒューマノイド型ロボットのエージェントに回転する角度を指定して、メッセージを送信します。例えば90を送信します。
Next, you have to click on the message button on the right bottom of the viewer, then, write and send messages for the agent. In the example below, the message "90" is sent to the agent, which means rotate the agent with 90 degrees.

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

するとロボットが90°回転してロボットの視線からはオレンジやペンギンのおもちゃが見えているのがわかります。
Then, the agent rotates with 90 degrees and you can see the orange and the toy through the robot vision.


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

#highlight(end)

*Old Version [#z9ddc886]
-[[視覚に関する操作(v2.0系)]]
-[[視覚に関する操作(v120330, v1.4.8)]] 
Up:[[Tutorial]]     Previous:[[Exchange of messages between agents]]     Next:[[Image capture from agent's perspective]]

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


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