ここで、画面3のダイヤグラムを見てください。
サービスMyProj1の左側に[Data]ブロックを配置してありますが、このブロックは何の働きをしているのでしょうか?
これを検証するために、画面10のような[Data]ブロックを削除したケースを用意しました。これを実行するとどのような結果が得られるでしょうか?
結論からいうと、前節と同じ結果が得られます(ダイアログに“Atom”と表示されます)。なぜなら、サービスMyProj1の公開メソッドが「Get」だけなので、明示的に選択する必要がないからです。
では、VPLにおいて、なぜこのようなあいまいな結果が起こるのでしょうか。一般的に、VPLのダイヤグラムは「通知」を受けて動作を開始します。しかし、画面3や画面10のダイヤグラムでは、「通知」を発生するブロックは存在しません。
実は、VPLはこのようなダイヤグラムを与えられると、最初の1回だけ自らが「通知」の信号を発生して処理を開始します(このようにしないと「通知」なしのダイヤグラムをチェックすることができないからです)。
そこで、明示的に「通知」を発行するアプリケーションを作り、両者の違いを確認してみましょう。
解説! ロボット開発環境Robotics Studio(4)「シミュレータでロボットをグリグリ動かす!」で、シミュレータ上の移動ロボットを動かす際に、Xbox 360のコントローラを使用しましたが、今回もこのコントローラを使って「通知」を発行させます。
画面11のように、[Services]ツールボックスから[XInputController]をダイヤグラムへドラッグしてください。
ダイヤグラムに配置された[XInputController]の右側には2個の出力ポートがあります。上はデータ、下は通知のポートです。
次に、MyProj1をドラッグし、[XInputController]の通知ポート(下のポート)と[MyProj1]の左ポートを接続してください。
すると、画面12ように[Connections]ダイアログが開くので、[From]ペインで[ButtonsChanged]を選択し、[OK]ボタンをクリックします。
ダイヤグラムは、画面13のようになります。
そして、前と同じ手順で[SimpleDialog]をドラッグして、画面14のように接続してください。
[Data Connections]ダイアログで、プロパティのNameを選択することを忘れないでください。デフォルトでは、nullになっています。
以上でダイヤグラムは完成です。それでは、実行してみましょう。
お気付きかと思いますが、何もしない状態ではダイアログが表示されません。実行するには“コントローラのボタンを押す”必要があります。
ボタンを押すと、画面15のように2つのダイアログが表示されるはずです。
[ButtonsChanged]の通知は、ボタンを“押したとき”と“離したとき”に発行されるのでダイアログが2つ表示されるのです。
ちなみに、画面14のダイヤグラムは「通知」を含んでいるので、VPLはスタート時にダミーの通知を発行しません。
VPLによるチェックを行ったので、今度はサービスのプログラムからチェックを行ってみましょう。
MyProj1の[ソリューションエクスプローラ]で、MyProj1.csをダブルクリックしてください。
すると、編集ペインにMyProj1.csが開きます(画面16)。
MyProj1.csのprivate MyProj1State _state = new MyProj1State();という記述に注目してください。ここで状態のインスタンス_stateが生成されます。
MyProj1.csからStart()の場所を探して、以下のように記述してください。
protected override void Start() { base.Start(); // Add service specific initialization here. Console.WriteLine(_state.Name); }
ここで、プログラムをビルド&実行すると、画面17のように“Atom”と表示されるはずです。
次に、状態のプロパティを増やします(ここでは、ロボットのモーター回転速度“RotVelocity”を追加します)。
それでは、新たにプロジェクトMyProj2を生成してください。そして、MyProj2Types.csを開いて、画面18のように状態のプロパティを記述してください。
次に、画面19のようにVPLのダイヤグラムを組みます。
[Data Connections]のダイアログが開くと、画面20のように定義した2つのプロパティ(NameとRotVelocity)が現れます。
ここで、RotVelocityを選択し、実行してください。結果は画面21のようになるはずです。
ダイアログにRotVelocityの初期値「1.23」が表示されていることが分かります。
以上、サービスに対して“ロボットの状態”を組み込む方法について解説しました。
まだサービスの基本構造を説明している段階なので、実際にロボットと接続して動作させていませんが、実際にはこれらサービスによって、ロボットを制御することができるのです。
先ほど、ロボットのモーター回転速度「RotVelocity」に「1.23」という数値を代入しましたが、これはロボットのモーターに対して初期値となる速度を与えたことを意味します。つまり、ロボットのモーターがこの値で動きだすということです。
また、ロボットのバンパーの状態を「FrontBumper」というプロパティにした場合、ロボットのバンパーがオフからオンに変化すると、
_state.FrontBumper = True
となり、ほかのサービスに対して通知を発行するなどのプログラムを組み込むことができます。
今回のポイントは、“サービスはロボットの状態と連動して動くものである”という点です。しっかりと頭に入れておいてください。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.