Up:Tutorial?     Previous:人間型エージェントの操作     Next:視覚に関する操作


エージェント間でのメッセージのやり取り

前回はクライアント(SIGViewer)からエージェントにメッセージを送信し、受信したエージェントはお辞儀をするというサンプルを紹介しました。今回はエージェント間でのやり取りを行うサンプルコードを紹介します。

メッセージの送受信

メッセージ送信者のコントローラ作成

まずメッセージの送信を行うコントローラを作成します。

$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs SendController.cpp

SendController.cpp

これは1秒おきにメッセージ"Hello!"を送信するコントローラのサンプルです。sendMsgでは最初の引数で送信先のエージェント名を指定します。

全エンティティ(ビューワーなどのサービスも含む)にメッセージを送信する場合はsendMsgの代わりにbroadcastMsgを用います。

         ↓

メッセージ受信者のコントローラ作成

次にメッセージの受信を行うエージェントコントローラを作成します。

$ emacs RecvController.cpp

RecvController.cpp

これはメッセージを受信したら手を上げるというサンプルです。また、onActionで0.5秒ごとに上がった手を下げようとします。

それではコンパイルします。 まずMakefileに新しく作成したコントローラを追加します。

$ emacs Makefile

変更後

#オブジェクトファイルの指定
OBJS     = SendController.so RecvController.so

共有オブジェクトにSendController.so, RecvController.soの2つを追加しました。

Makefile

#SIGVerseソースの場所指定
SIG_SRC  = ../../include/sigverse

#オブジェクトファイルの指定
OBJS     = SendController.so RecvController.so 

all: $(OBJS)

#コンパイルを行います。
./%.so: ./%.cpp
        g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) -I$(SIG_SRC)/comm/controller  -fPIC -shared -o $@   $< 
$ make

世界ファイルの作成

次に世界ファイルを作成します。

$ cd ..
$ emacs xml/MessageWorld.xml

MessageWorld.xml

人型エージェントが、ヒューマノイド型エージェントにメッセージを送信します。

起動

起動して見てみましょう。

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

SIGViewerで接続して、シミュレーションを開始するとonInitにより、人型エージェント(メッセージ送信者)が手を下して、後ろを振り返ります。そして1秒に一回ロボットが人間エージェントからメッセージを受信して手を挙げているのがわかります。

#ref(): File not found: "mess_1.PNG" at page "Exchange of messages between agents"

メッセージ送信範囲の指定

次にメッセージ送信時にメッセージが届く範囲を指定するサンプルを紹介します。

テキスト送信者のコントローラ作成

メッセージを送信するコントローラを新しく作成します。

$ cd NewWorld
$ emacs SendController2.cpp

SendController2.cpp

こちらも先ほどのサンプルと同様1秒に1回"Hello!!"を送信するコントローラです。broadcastMsgの2番目の引数が300.0とすることによりメッセージが届く範囲を3mに指定しました。2番目の引数を指定しない場合は距離に関係なくメッセージが届きます。

このエージェントはz方向にどんどん移動しながらテキストを送信します。つまりメッセージを受信するエージェントからはどんどん遠ざかりながらテキストを送信します。

コンパイル

MakefileにSendController2.soを追加してコンパイルします

$ emacs Makefile

変更前

#オブジェクトファイルの指定
OBJS     = SendController.so RecvController.so

変更後

#オブジェクトファイルの指定
OBJS     = SendController.so RecvController.so SendController2.so
$ make

世界ファイルの編集

次に世界ファイルを変更します。

$ cd ..
$ emacs xml/MessageWorld.xml

MessageWorld.xml

メッセージ送信者コントローラの修正

    ↓

起動

それでは実行してみます。

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

SIGVierwerで接続して、シミュレーションを開始してみます。

#ref(): File not found: "mess_3.PNG" at page "Exchange of messages between agents"

メッセージ送信者が遠ざかりながらメッセージを送信しているのがわかります。 エージェントの声がどこまで届くのか確認してみてください。

ビューワーへメッセージ送信

broadcastMsgを使用した場合ビューワーにもメッセージが届きます。メッセージを受信したビューワーはメッセージログとして表示します。

sendMsgを使ってコントローラ同様ビューワーにもメッセージを送信することができます。このときビューワーがサーバに接続する際に指定したサービス名をメッセージ送信先に指定します。 サービス名を"SIGViewer"と設定してサーバに接続した場合はSendMsg関数を以下のように修正します。

SendController.so

         ↓

Old Version


Up:Tutorial?     Previous:人間型エージェントの操作     Next:視覚に関する操作

English version?


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