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秒に一回ロボットが人間エージェントからメッセージを受信して手を挙げているのがわかります。 メッセージ送信範囲の指定 †次にメッセージ送信時にメッセージが届く範囲を指定するサンプルを紹介します。 テキスト送信者のコントローラ作成 †メッセージを送信するコントローラを新しく作成します。 $ 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で接続して、シミュレーションを開始してみます。 メッセージ送信者が遠ざかりながらメッセージを送信しているのがわかります。 エージェントの声がどこまで届くのか確認してみてください。 ビューワーへメッセージ送信 †broadcastMsgを使用した場合ビューワーにもメッセージが届きます。メッセージを受信したビューワーはメッセージログとして表示します。 sendMsgを使ってコントローラ同様ビューワーにもメッセージを送信することができます。このときビューワーがサーバに接続する際に指定したサービス名をメッセージ送信先に指定します。 サービス名を"SIGViewer"と設定してサーバに接続した場合はSendMsg関数を以下のように修正します。 SendController.so ↓ Old Version †Up:Tutorial? Previous:人間型エージェントの操作 Next:視覚に関する操作 English version? |