連載
» 2007年09月21日 00時00分 公開

サービスはロボットの状態と連動して動くものRobotics Studio活用術 はじめて作るサービス(3)(2/2 ページ)

[大川 善邦 工学博士 日本大学工学部非常勤講師/大阪大学名誉教授,@IT MONOist]
前のページへ 1|2       

VPLのトリガーとは?

 ここで、画面3のダイヤグラムを見てください。

 サービスMyProj1の左側に[Data]ブロックを配置してありますが、このブロックは何の働きをしているのでしょうか?

 これを検証するために、画面10のような[Data]ブロックを削除したケースを用意しました。これを実行するとどのような結果が得られるでしょうか?


[Data]ブロックを削除したケース 画面10 [Data]ブロックを削除したケース

 結論からいうと、前節と同じ結果が得られます(ダイアログに“Atom”と表示されます)。なぜなら、サービスMyProj1の公開メソッドが「Get」だけなので、明示的に選択する必要がないからです。

 では、VPLにおいて、なぜこのようなあいまいな結果が起こるのでしょうか。一般的に、VPLのダイヤグラムは「通知」を受けて動作を開始します。しかし、画面3や画面10のダイヤグラムでは、「通知」を発生するブロックは存在しません。

 実は、VPLはこのようなダイヤグラムを与えられると、最初の1回だけ自らが「通知」の信号を発生して処理を開始します(このようにしないと「通知」なしのダイヤグラムをチェックすることができないからです)。

 そこで、明示的に「通知」を発行するアプリケーションを作り、両者の違いを確認してみましょう。

 解説! ロボット開発環境Robotics Studio(4)「シミュレータでロボットをグリグリ動かす!」で、シミュレータ上の移動ロボットを動かす際に、Xbox 360のコントローラを使用しましたが、今回もこのコントローラを使って「通知」を発行させます。

 画面11のように、[Services]ツールボックスから[XInputController]をダイヤグラムへドラッグしてください。

XinputController 画面11 XinputController

 ダイヤグラムに配置された[XInputController]の右側には2個の出力ポートがあります。上はデータ、下は通知のポートです。

 次に、MyProj1をドラッグし、[XInputController]の通知ポート(下のポート)と[MyProj1]の左ポートを接続してください。

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

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

 ダイヤグラムは、画面13のようになります。

[XInputController]の通知ポートと[MyProj1]の左ポートを接続 画面13 [XInputController]の通知ポートと[MyProj1]の左ポートを接続

 そして、前と同じ手順で[SimpleDialog]をドラッグして、画面14のように接続してください。

[SimpleDialog]の接続 画面14 [SimpleDialog]の接続

 [Data Connections]ダイアログで、プロパティのNameを選択することを忘れないでください。デフォルトでは、nullになっています。

 以上でダイヤグラムは完成です。それでは、実行してみましょう。

 お気付きかと思いますが、何もしない状態ではダイアログが表示されません。実行するには“コントローラのボタンを押す”必要があります。

 ボタンを押すと、画面15のように2つのダイアログが表示されるはずです。

ダイアログが2つ表示される 画面15 ダイアログが2つ表示される

 [ButtonsChanged]の通知は、ボタンを“押したとき”と“離したとき”に発行されるのでダイアログが2つ表示されるのです。

 ちなみに、画面14のダイヤグラムは「通知」を含んでいるので、VPLはスタート時にダミーの通知を発行しません。

プログラムによるチェック

 VPLによるチェックを行ったので、今度はサービスのプログラムからチェックを行ってみましょう。

 MyProj1の[ソリューションエクスプローラ]で、MyProj1.csをダブルクリックしてください。

 すると、編集ペインにMyProj1.csが開きます(画面16)。

MyProj1.cs 画面16 MyProj1.cs

 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”と表示されるはずです。

“Atom”と表示される様子 画面17 “Atom”と表示される様子

複数のプロパティ

 次に、状態のプロパティを増やします(ここでは、ロボットのモーター回転速度“RotVelocity”を追加します)。

 それでは、新たにプロジェクトMyProj2を生成してください。そして、MyProj2Types.csを開いて、画面18のように状態のプロパティを記述してください。

プロパティの追加 画面18 プロパティの追加

 次に、画面19のようにVPLのダイヤグラムを組みます。

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

 [Data Connections]のダイアログが開くと、画面20のように定義した2つのプロパティ(NameとRotVelocity)が現れます。

[Data Connections]ダイアログ 画面20 [Data Connections]ダイアログ

 ここで、RotVelocityを選択し、実行してください。結果は画面21のようになるはずです。

実行結果ダイアログ 画面21 実行結果ダイアログ

 ダイアログにRotVelocityの初期値「1.23」が表示されていることが分かります。



 以上、サービスに対して“ロボットの状態”を組み込む方法について解説しました。

 まだサービスの基本構造を説明している段階なので、実際にロボットと接続して動作させていませんが、実際にはこれらサービスによって、ロボットを制御することができるのです。

 先ほど、ロボットのモーター回転速度「RotVelocity」に「1.23」という数値を代入しましたが、これはロボットのモーターに対して初期値となる速度を与えたことを意味します。つまり、ロボットのモーターがこの値で動きだすということです。

 また、ロボットのバンパーの状態を「FrontBumper」というプロパティにした場合、ロボットのバンパーがオフからオンに変化すると、

_state.FrontBumper = True 

となり、ほかのサービスに対して通知を発行するなどのプログラムを組み込むことができます。

 今回のポイントは、“サービスはロボットの状態と連動して動くものである”という点です。しっかりと頭に入れておいてください。(次回に続く)


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.