- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
[[Tutorial]]
#contents
*視覚に関する操作方法 [#f37ce459]
視覚に関する操作方法を説明します。
**エージェントの向きを変えるコントローラ作成 [#scce7ec9]
**コントローラ作成 [#scce7ec9]
エージェントがいろいろな方向を見渡すことができるサンプルコードを紹介します。
$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs WatchController.cpp
WatchController.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 onRecvMessage(RecvMessageEvent &evt);
};
void WatchController::onRecvMessage(RecvMessageEvent &evt)
{
SimObj *my = getObj(myname());
//受け取ったメッセージをint型に変換します。
const char *value(evt.getString(0));
int angle = atoi(value);
//y軸を中心に受け取った角度だけ体が回転します。
my->setAxisAndAngle(0, 1.0, 0, DEG2RAD(angle));
}
extern "C" Controller * createController ()
{
return new WatchController;
}
これは角度をメッセージとして受信して、その角度だけ体を回転させるサンプルです。
それではコンパイルします。
$ emacs Makefile
変更前
#自作コード
CPP_SRCS = AgentController.cpp
#オブジェクトファイル
OBJS = AgentController.so
変更後
#自作コード
CPP_SRCS = WatchController.cpp
#オブジェクトファイル
OBJS = WatchController.so
$ make
**リビングルームの世界ファイル作成 [#iea3d264]
新しく世界ファイルを作成します。
前回の世界ファイルは一応残しておきます。
$ cd ~/sigverse-<version>/bin
$ mv xml/MyWorld.xml xml/MoveWorld.xml
$ emacs xml/MyWorld.xml
MyWorld.xml
<?xml version="1.0" encoding="utf8"?>
<world name="VisTest2">
<gravity x="0.0" y="-9.8" 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++"/>
<!--オブジェクトファイルAgentController.soの指定-->
<set-attr-value name="implementation"
value="./NewWorld/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="60.0"/>
<set-attr-value name="z" value="-40.0"/>
<!--エージェントの視点の位置-->
<set-attr-value name="vpx" value="0.0"/>
<set-attr-value name="vpy" value="70.0"/>
<set-attr-value name="vpz" value="5.0"/>
<!--エージェントの視点の向き-->
<set-attr-value name="vvx" value="0.0"/>
<set-attr-value name="vvy" value="-1.0"/>
<set-attr-value name="vvz" value="1.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="82.0"/>
<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="5.0"/>
<set-attr-value name="z" value="0.0"/>
<set-attr-value name="vpx" 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="10.0"/>
<set-attr-value name="z" value="-40.0"/>
<set-attr-value name="vpx" value="0.0"/>
<set-attr-value name="vpy" value="10.0"/>
<set-attr-value name="vpz" value="0.0"/>
<set-attr-value name="vvx" value="0.0"/>
<set-attr-value name="vvy" value="0.0"/>
<set-attr-value name="vvz" value="1.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="20.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="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="13.0"/>
<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="35.0"/>
<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="23.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="10.0"/>
<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="10.0"/>
<set-attr-value name="z" value="-30.0"/>
</instanciate>
<instanciate class="seOrange.xml">
<set-attr-value name="name" value="orange_1"/>
<set-attr-value name="dynamics" value="false"/>
<set-attr-value name="x" value="80.0"/>
<set-attr-value name="y" value="10.0"/>
<set-attr-value name="z" value="-10.0"/>
</instanciate>
</world>
これはリビングルームにヒューマノイドロボット(Robot-nii.xml)が立っているというxmlファイルです。リビングルームにはテレビやソファなどがおかれています。
このxmlファイルではエージェントの視点の位置や、視点の向きの設定がされています。これらはすべてエージェント座標系で設定されます。エージェント座標系とはエージェントが基準となる座標系で、x軸がエージェントから見て左右(左が正方向)、y軸が上下(上が正方向)、z軸が前後(前が正方向)となります。原点はエージェントの位置です。エージェントのお腹あたりにあるようです。
視点の向きはベクトルで表されます。今回視点の向きを(vvx,vvy,vvz)=(0,-1,1)と設定しました。つまりエージェントはまっすぐ前を向いた方向から、下方向45°に目線があるということになります。
**起動 [#s12fde3f]
それでは起動してみましょう。
$ ./sigserver.sh -p 9001
SIGViewerでサーバに接続して、シミュレーションを開始します。リビングルームに立っているヒューマノイドロボット型のエージェントが見えると思います。
#ref(watch_1.jpg)
次に、ヒューマノイドロボットをクリックすると、左上の小さい画面にロボットの目線から見た映像が表示されます。
#ref(Watch_3.jpg)
ロボットの目線からはりんごが見えているのがわかります。右のDetected Entitiesを見てみると、ロボットから見て、りんごが検出されているのがわかります。
#ref(watch_2.jpg)
次に右側のコマンドタブをクリックして、ヒューマノイド型ロボットのエージェントに回転する角度を指定して、実行ボタンを押し、メッセージを送信します。例えば180を送信します。
#ref(watch_4.jpg)
ロボットが180°回転して今度はテレビや、木、テーブルなどが検出されているのがわかります。
[[戻る>間節の操作]]