Up:Tutorial? Previous:人間型エージェントの操作 Next:視覚に関する操作
※このチュートリアルはv2.1.0以降対応
前回はクライアント(SIGViewer)からエージェントにメッセージを送信し、受信したエージェントはお辞儀をするというサンプルを紹介しました。今回はエージェント間でのやり取りを行うサンプルコードを紹介します。
まずSIGVerse作業ディレクトリに移動し、でメッセージの送信を行うコントローラを作成します。
$ cd ~/MyWorld $ emacs SendController.cpp
SendController.cpp
これは1秒おきにメッセージ"Hello!"を送信するコントローラのサンプルです。sendMsgでは最初の引数で送信先のエージェント名を指定します。
全エンティティ(ビューワーなどのサービスも含む)にメッセージを送信する場合はsendMsgの代わりにbroadcastMsgを用います。
↓
次にメッセージの受信を行うエージェントコントローラを作成します。
$ emacs RecvController.cpp
RecvController.cpp
これはメッセージを受信したら手を上げるというサンプルです。また、onActionで0.5秒ごとに上がった手を下げようとします。
それではコンパイルします。
$ ./sigmake.sh SendController.cpp RecvController.cpp
次に世界ファイルを作成します。
$ emacs MessageWorld.xml
MessageWorld.xml
人型エージェントが、ヒューマノイド型エージェントにメッセージを送信します。
起動して見てみましょう。
$ sigserver.sh -w ./MessageWorld.xml
SIGViewerで接続して、シミュレーションを開始するとonInitにより、人型エージェント(メッセージ送信者)が手を下して、後ろを振り返ります。そして1秒に一回ロボットが人間エージェントからメッセージを受信して手を挙げているのがわかります。
次にメッセージ送信時にメッセージが届く範囲を指定するサンプルを紹介します。
メッセージを送信するコントローラを新しく作成します。
$ emacs SendController2.cpp
SendController2.cpp
こちらも先ほどのサンプルと同様1秒に1回"Hello!!"を送信するコントローラです。broadcastMsgの2番目の引数を300.0とすることによりメッセージが届く範囲を3mに指定しました。2番目の引数を指定しない場合は距離に関係なくメッセージが届きます。
このエージェントはz方向にどんどん移動しながらテキストを送信します。つまりメッセージを受信するエージェントからはどんどん遠ざかりながらテキストを送信します。
コンパイルします。
$ ./sigmake.sh SendController2.cpp
次に世界ファイルを変更します。
$ emacs MessageWorld.xml
MessageWorld.xml
メッセージ送信者コントローラの修正
↓
それでは実行してみます。
$ sigserver.sh -w ./MessageWorld.xml
SIGVierwerで接続して、シミュレーションを開始してみます。
メッセージ送信者が遠ざかりながらメッセージを送信しているのがわかります。 エージェントのメッセージがどこまで届くのか確認してみてください。
broadcastMsgを使用した場合ビューワーにもメッセージが届きます。メッセージを受信したビューワーはメッセージログとして表示します。
sendMsgを使ってコントローラ同様ビューワーにもメッセージを送信することができます。このときビューワーがサーバに接続する際に指定したサービス名をメッセージ送信先に指定します。 サービス名を"SIGViewer"と設定してサーバに接続した場合はSendMsg関数を以下のように修正します。
SendController.so
↓
Up:Tutorial? Previous:人間型エージェントの操作 Next:視覚に関する操作
English version?