Robotics Studioの肝、“通知”の発行:Robotics Studio活用術 はじめて作るサービス(5)(2/2 ページ)
Robotics Studioにおける「サービスの作成」の集大成! 今回は通知を発行するサービスを作り、動作検証を行います
VPLによる検証
では、VPLを使ってプログラムの動作をチェックしてみましょう。
VPLを起動し、[Services]ペインから「MyProj3」を[Diagram]ペインへドラッグしてください。
すると、画面1のような右側に2つのポートがあるオブジェクトがダイヤグラムに表示されます。
ちなみに、右側上のポートは“データ”、右側下のポートは“通知”となります(注)。
次に、[Services]ペインから画面2のように「Simple Dialog」を[Diagram]ペインへドラッグして、「MyProj3」の通知のポートと接続します(注)。
すると、[Connections]ダイアログが開くので画面3のように選択して、[OK]ボタンをクリックします。
[Data Connections]ダイアログでは画面4のように選択して、[OK]ボタンをクリックします(注)。
それでは、プログラムを実行してみましょう。
実行すると、画面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の修正では、TimeoutPortを使って「1秒」の遅延を挿入しています。これで、MyProj3がスタートして1秒後に通知が発行されるはずです。
それではVPLに戻って、再度アプリケーションを実行してみてください。
今度は、画面6のように期待していたダイアログが表示されるはずです(注)。
画面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です。
【演習問題2の解答】
MSRSのReplaceというクラスを使ってメッセージを作ると状態のプロパティすべてを入れ替えることになります。この問題は、プロパティの一部を変更した(それ以外のプロパティは変更しない)場合にどのように対処すればよいか、という問題です。
以下にその対処方法を網掛けで示します。
まず、MyProj2.csのハンドラにおいて、
と変更します。
そして、画面8のようにVPLのダイヤグラムを作成します。
これを実行すると、画面9のようにrotVelocityだけが変更されるはずです。
今回は、MSRSの通知を発行するサービスを作り、それが正しく動作することを検証しました。以上で、MSRSにおける「サービスの作成」についての解説は終了です。また、本連載はこれで最終回となります。
これまで、「解説! ロボット開発環境Robotics Studio」や本連載「Robotics Studio活用術 はじめて作るサービス」で、MSRSの基礎について解説してきましたが、MSRSのプログラムに「これで終わり!」というものは存在しません。ロボット開発に少しでも興味を持たれた方は、これらの連載をスタートラインにして、さらにご自身で理解を深めていただければと思います。それでは、皆さんまたの機会にお会いしましょう!
Copyright © ITmedia, Inc. All Rights Reserved.