Robotics Tutorial1 サービスにアクセスする
ここでは、接触センサー(bumperと呼びます)の出力を読み、コンソールにそのメッセージを表示させる基本的なサービスをどのように用いるかを学習します。
新しいサービスの作り方
- RoboticsStudio用のコマンドプロンプトを開く。
スタート→すべてのプログラム→Microsoft Robotics Dev Studio 2008→DSS Command Prompt
- samplesディレクトリに入る
cd samples
- 次のようにDssNewService コマンドを引数付きで実行します。
dssnewservice /service:MyTutorial1
これはMyTutorial1というサービスをつくり、さらにMyTutorial1というディレクトリを作ります。
- 今作られたMyTutorial1に入ります。
cd MyTutorial1
- 中にMyTutorial1.slnなどの雛型が作られているのを確認する。
- このMyTutorial1をダブルクリックしてVisual Studioを起動する。
MyTutorial1.csは次のようになっています。
//------------------------------------------------------------------------------
//
// このコードはツールによって生成されました。
// ランタイム バージョン:2.0.50727.1433
//
// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
// コードが再生成されるときに損失したりします。
//
//------------------------------------------------------------------------------
using Microsoft.Ccr.Core;
using Microsoft.Dss.Core;
using Microsoft.Dss.Core.Attributes;
using Microsoft.Dss.ServiceModel.Dssp;
using Microsoft.Dss.ServiceModel.DsspServiceBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Xml;
using W3C.Soap;
using mytutorial1 = Robotics.MyTutorial1;
namespace Robotics.MyTutorial1
{
///
/// Implementation class for MyTutorial1
///
[DisplayName("MyTutorial1")]
[Description("The MyTutorial1 Service")]
[Contract(Contract.Identifier)]
public class MyTutorial1Service : DsspServiceBase
{
///
/// _state
///
[ServiceState()]
private MyTutorial1State _state = new MyTutorial1State();
///
/// _main Port
///
[ServicePort("/mytutorial1", AllowMultipleInstances=false)]
private MyTutorial1Operations _mainPort = new MyTutorial1Operations();
///
/// Default Service Constructor
///
public MyTutorial1Service(DsspServiceCreationPort creationPort) :
base(creationPort)
{
}
///
/// Service Start
///
protected override void Start()
{
base.Start();
// Add service specific initialization here.
}
}
}
Step1 参照を加える
幾つかのdllへの参照はdssnewserviceコマンドを実行したときに自動的に作られます。ここでは、接触センサーを利用するためにRoboticsCommonライブラリを利用します。これを利用するには、proxy DLLである、RoboticsCommon.Proxy.dllを通して行われます。
RoboticsCommon.Proxy.dllファイルを参照を加えるには
- 右側にあるソリューションエクスプローラにある参照設定を右クリックし参照の追加を選びます。すると、ダイアログが表示されます。
- そこで、.NETタブでRoboticsCommon.Proxyを選びます。
RoboticsCommon は接触センサーに関する基本的な機能を提供します。これはどんなハードフェアが接続されるかの知識は必要ありません。
MyTutorial1.csの先頭にusingディレクティブを追加します。
これはContactSensorのaliasとして利用します。
using bumper = Microsoft.Robotics.Services.ContactSensor.Proxy;
Step2 パートナー関係を作る
MyTutorial1 とbumper サービスの間のパートナー関係を作ります。bumperサービスと通信するには、ContactSensorArrayOperations のポートを設定し、Partner 属性を用いてパートナーとして識別します。_mainPortが定義されている後に次の行を付け加えます。
[Partner("bumper", Contract = bumper.Contract.Identifier,
CreationPolicy = PartnerCreationPolicy.UseExisting)]
private bumper.ContactSensorArrayOperations _bumperPort = new bumper.ContactSensorArrayOperations();
MyTutorial1が作られた時に、マニフェストファイルMyTutorial1.manifest.xmlが作られています。マニフェストはアプリケーションが実行される時に詳細情報を提供します。
メニューバーからプロジェクト→MyTutorial1のプロパティ→デバッグ
開始オプションのコマンドライン引数を次のように変更します。
-p:50000 -t:50001
-m:"Samples\Config\RoboticsTutorial1.manifest.xml"
-m:"samples\config\Parallax.MotorIrBumper.manifest.xml"
Step3 Subscriptionを書く
Start()メソッドの後に以下のSubscribeToBumpers() メソッドを追加します。
///
/// Subscribe to the Bumpers service
///
void SubscribeToBumpers()
{
// bumper通知ポートを作る
bumper.ContactSensorArrayOperations bumperNotificationPort = new bumper.ContactSensorArrayOperations();
// bumperサービスとSubscribeし、bumperNotificationPortへの通知を受け取る
_bumperPort.Subscribe(bumperNotificationPort);
// bumperサービスからの更新を聞く
Activate(
Arbiter.Receive<bumper.Update>
(true, bumperNotificationPort, BumperHandler));
}
SubscribeToBumpers()メソッドの最初の仕事はbumperサービスからの通知を受け取るポートを作成することです。ContactSensorArrayOperationsのインスタンスを作ることによって受信ポートを作っています。
bumper.ContactSensorArrayOperations bumperNotificationPort = new bumper.ContactSensorArrayOperations();
_bumperPortポートをSubscribeし、通知がbumperNotificationPortに送られるように指定します。
_bumperPort.Subscribe(bumperNotificationPort);
bumperからの通知を受け取るハンドラーを設定するActivate()を用います。Activate() はポートとarbiterとの間の関係を登録する基本的なメソッドです。受信arbiterはbumperからbumperハンドラーに通知メッセージを転送するのに用いられます。
Activate(
Arbiter.Receive
(true, bumperNotificationPort, BumperHandler));
これらの変更により、bumperハンドラーメソッドはbumperサービスからbumper通知が受け取られるたびに呼ばれるようになります。
bumperハンドラーを作る
MyTutorial1.csの最後付近にBumperHandler() を付け加えます。bumperが押され、サービスに通知された時に、BumperHandler() はコンソールにメッセージを送ります。
///
/// Handle Bumper Notifications
///
/// Update notification
private void BumperHandler(bumper.Update notification)
{
if (notification.Body.Pressed)
LogInfo(LogGroups.Console, "Ouch - the bumper was pressed.");
}
注意
Microsoft Robotics Dev Studio 2008の場合はBoe-Bot用のxmlが含まれていませんのでMicrosoft Robotics Studio (1.5)にあるものをコピーして用います。
場所: samples\Config
Parallax.BoeBot.Config.xml
Parallax.BoeBot.Drive.Config.xml
Parallax.BoeBot.Drive.manifest.xml
Parallax.MotorIrBumper.Config.xml
Parallax.MotorIrBumper.manifest.xml
同様にBoe-Bot用のサービスも用意されていないので、コピーして用います。
ビルド→ビルドイベント
デバッグ→外部プログラムの開始
→作業ディレクトリ
参照パス
ビルド→出力パス
C:\Users\mizuno\Microsoft Robotics Dev Studio 2008