Robotics Studioの肝、“通知”の発行Robotics Studio活用術 はじめて作るサービス(5)(2/2 ページ)

» 2007年11月21日 00時00分 公開
[大川 善邦 工学博士 日本大学工学部非常勤講師/大阪大学名誉教授,@IT MONOist]
前のページへ 1|2       

VPLによる検証

 では、VPLを使ってプログラムの動作をチェックしてみましょう。

 VPLを起動し、[Services]ペインから「MyProj3」を[Diagram]ペインへドラッグしてください。

 すると、画面1のような右側に2つのポートがあるオブジェクトがダイヤグラムに表示されます。


通知のポート 画面1 通知のポート

 ちなみに、右側上のポートは“データ”、右側下のポートは“通知”となります(注)。

※注:
ポートの数が合わない場合は、もう一度前ページのプログラムを見直してください。


 次に、[Services]ペインから画面2のように「Simple Dialog」を[Diagram]ペインへドラッグして、「MyProj3」の通知のポートと接続します(注)。

アイコン間に線を引く 画面2 アイコン間に線を引く

※注:
「MyProj3」の通知のポートからマウスをドラッグします。ポートが2つあるので間違えないように注意してください。


 すると、[Connections]ダイアログが開くので画面3のように選択して、[OK]ボタンをクリックします。

[Connections]ダイアログ 画面3 [Connections]ダイアログ

 [Data Connections]ダイアログでは画面4のように選択して、[OK]ボタンをクリックします(注)。

[Data Connections]ダイアログ 画面4 [Data Connections]ダイアログ
※注:
[Data Connections]ダイアログが開かない場合は、連載第4回「SOAを支える2本柱『ポート』と『ハンドラ』」を参考に強制的にダイアログを開いて、[SendPosition]を選択します。デフォルトでは、“null”になっているので変更が必要です。


 それでは、プログラムを実行してみましょう。

 実行すると、画面5のように[Run]ダイアログが開きますが、期待していたダイアログは表示されません。

[Run]ダイアログ 画面5 [Run]ダイアログ

 一体、なぜでしょうか?

通知が正しく働かなかった理由

 実は、VPLの処理というのは“ダイヤグラムの左側から右側へと流れる”ものなのです。

 そのため、ソース7に示した

_mainPort.Post(new SendPosition()); 

のプログラムが実行されてから、[Simple Dialog]のサブスクリプションが実行されます。

 画面5を見てください。最下行に、[Simple Dialog]のサブスクリプションが実行された結果のログが記録されています(「Enter Subscription」と記述されている行)。

 Enter Subscriptionとは、サービスがサブスクリプション マネージャに対して通知の発行をポストしたというログです。サブスクリプション マネージャは、サブスクライバに対して通知を発行することになりますが、サブスクライバがなければ、実質、通知は発行されません。

 つまり、Enter Subscriptionがログに残っているということは“通知を出す要求はしたのだけれどもサブスクライバがないので通知が発行されなかった”ということになります。

 では、どのようにしたら期待している結果になるのでしょうか?

 それは、MyProj3が発行する

_mainPort.Post(new SendPosition()); 

を時間的に遅らせればよいのです。

 “時間的に遅らせる”ためにはVC#を使って、MyProj3.csをソース8のように修正します。

遅延の挿入 ソース8 遅延の挿入

 ソース8の修正では、TimeoutPortを使って「1秒」の遅延を挿入しています。これで、MyProj3がスタートして1秒後に通知が発行されるはずです。

 それではVPLに戻って、再度アプリケーションを実行してみてください。

 今度は、画面6のように期待していたダイアログが表示されるはずです(注)。

通知によるダイアログの表示 画面6 通知によるダイアログの表示
※注:
PCのスペックによっては、このプログラムでもダイアログが現れない可能性があります。その際は、遅延時間設定を1秒よりも大きな値に変更して再度試してください。


 画面6のダイアログの文字を見ると、確かにMyProj3の_positionプロパティが通知されていますね。

 以上で通知を発行するプログラムの作成は終了です。

演習問題の解答

 ここでは、前回「SOAを支える2本柱『ポート』と『ハンドラ』」の最後に出題した演習問題の解説を行います。

【演習問題1の解答】

 この問題は、メッセージの名前「Replace」から「SetState」に変更するという問題です。

 まず、Replaceという単語が使われている個所を確認してみましょう。

 MyProj2Types.csでは、

  • ポートセットの定義……1カ所
  • メッセージのクラスの定義……2カ所

 MyProj2.csでは、

  • ハンドラの定義……2カ所

使用されています。

 つまり、上記の該当個所を「SetState」に変更すればよいはずです。以下にその変更個所を網掛けで示します。

 まず、ポートセットの定義において、

と変更します。

 そして、メッセージのクラスにおいて、

と変更します。ここでのポイントは、コロンの右側のReplace(基底クラス)を変更しないことです。

 続いて、MyProj2.csにおいて、

と変更します。小文字のreplaceはただの変数名なので変更する必要はありませんが、気持ちが悪ければsetstateなどと変更しても構いません。

 最後にVPLを使って、結果をチェックします。画面7のように、「MyProj2」のアイコンの左のポートに“SetState”が表示されたらOKです。

ポートの名前の変更 画面7 ポートの名前の変更

【演習問題2の解答】

 MSRSのReplaceというクラスを使ってメッセージを作ると状態のプロパティすべてを入れ替えることになります。この問題は、プロパティの一部を変更した(それ以外のプロパティは変更しない)場合にどのように対処すればよいか、という問題です。

 以下にその対処方法を網掛けで示します。

 まず、MyProj2.csのハンドラにおいて、

と変更します。

 そして、画面8のようにVPLのダイヤグラムを作成します。

VPLのダイヤグラム 画面8 VPLのダイヤグラム

 これを実行すると、画面9のようにrotVelocityだけが変更されるはずです。

実行の結果 画面9 実行の結果


 今回は、MSRSの通知を発行するサービスを作り、それが正しく動作することを検証しました。以上で、MSRSにおける「サービスの作成」についての解説は終了です。また、本連載はこれで最終回となります。

 これまで、「解説! ロボット開発環境Robotics Studio」や本連載「Robotics Studio活用術 はじめて作るサービス」で、MSRSの基礎について解説してきましたが、MSRSのプログラムに「これで終わり!」というものは存在しません。ロボット開発に少しでも興味を持たれた方は、これらの連載をスタートラインにして、さらにご自身で理解を深めていただければと思います。それでは、皆さんまたの機会にお会いしましょう!


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.