Replace機能を追加してみる
次は値を置換するReplace機能を追加したサービスを作成し(サンプルプログラム:DSS Service3)、その作成したサービスをVPLで使ってみましょう。(サンプルプログラム:RDS_04_VPL_Sample3.mvpl)Replace機能は例えば、他のサービスからの通知を受けて、ステータスを更新したい場合などに使います。
DSSService1での手順1を参考に「DSSService3」という新規プロジェクトを作成し、DSSService2での手順1、手順2を参考にプロパティの設定と初期化までの記述をしてください。
[手順1]ポートの追加
DSSService3Types.csのポートセットにReplaceを追加し(リスト12)、RDSにて定義されている値を置換するクラスであるReplaceを継承してReplaceを定義します(リスト13)。
[ServicePort]
public class DSSService3Operations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get,Replace>
{
}
public class Replace : Replace<DSSService3State, PortSet<DefaultReplaceResponseType, Fault>>
{
}
[手順2]ハンドラの追加
DSSService3.csにおいて、Replaceのハンドラを作成します。[ServiceHandler]属性では複数のスレッドでの同時実行を許可するかを指定します。今回は「Exclusive」で許可しない設定にしています。許可する場合は「Concurrent」にします。ReplaceメッセージのBodyプロパティによって、ステートの更新が行われます。ポートにメッセージをポストするためにPost()メソッドを使います(リスト14)。
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public virtual IEnumerator<ITask> ReplaceHandler(Replace replace)
{
_state = replace.Body;
replace.ResponsePort.Post(DefaultReplaceResponseType.Instance);
yield break;
}
[手順3]サービスのビルド
[ビルド]-[ソリューションのビルド]を実行し、ビルドが正常終了したことを確認します。
[手順4]図16のVPL図の修正
図13のようなBボタン、Yボタンで制御するVPL図と同じ機能が実現できるようにReplace機能を追加したDSSService3を使って書き換えてみます。図13の状態からMergeブロックを削除し、サービス欄からDSSService3を4つとSimulatedGenericDifferentialDriveを1つドラックアンドドロップし、ダイアグラム領域に配置してください(図18)。
次に、0.0が設定されているDataブロックとDSSService3を接続し、表示されるConnectionsダイアログのFrom欄でDataValueを、To欄でReplaceを指定し、[OK]ボタンを押します(図19)。

次に、DSSService3と2つ目のDSSService3を接続し、表示されるConnectionsダイアログのFrom欄でDataValueを、To欄でGetを指定し、[OK]ボタンを押します。
さらに、2つ目のDSSService3とmulatedGenericDifferentialDriveと接続します。表示されるConnectionsダイアログではForm欄にてGet-Successを、TO欄にてSetDrivePowerを選択し、[OK]ボタンを押します。
0.8が設定されているDataブロックについても同様に接続してください。
完成したVPL図を図20に示します。
メニューのRunからStartを選択すると、DSSランタイムが実行され[Run]ダイアログ、[Visual Simulation Environment]画面がそれぞれ続けて立ち上がります。
書き換える前と同様にYボタンを押すとロボットが前進し、Bボタンを押すとロボットが停止する様子を確認してください。実行を終了するときは[Run]ダイアログの[STOP]ボタンを押します。
まとめ
今回はVisual C# 2008 Express Edition(Visual Studio 2008も同様)を用いて、コンソールへの文字出力や状態のログ表示など単純なサービスプログラムの作成と、自作したサービスのVPLでの利用方法、および作成したサービスのロボット制御への利用例を説明しました。次回はロボットが障害物にぶつかった時などに発生する割り込み(通知)の概要とシミュレーション環境へのオブジェクト配置などをとりあげます。
参考資料
- 『Microsoft Robotics Studioプログラミング』 布留川英一 著、マイクロソフト株式会社 監修、2007年6月、毎日コミュニケーションズ
- 『Microsoft Robotics Developer Studio入門』 大川善邦 著、2008年8月、工学社
- Microsoft Robotics Studio Developer Center
- Microsoft Roboticsライブラリ


