Robotics Tutorial1 サービスにアクセスする



ここでは、接触センサー(bumperと呼びます)の出力を読み、コンソールにそのメッセージを表示させる基本的なサービスをどのように用いるかを学習します。

新しいサービスの作り方

  1. RoboticsStudio用のコマンドプロンプトを開く。
    スタート→すべてのプログラム→Microsoft Robotics Dev Studio 2008→DSS Command Prompt
  2. samplesディレクトリに入る
    cd samples
  3. 次のようにDssNewService コマンドを引数付きで実行します。

    dssnewservice /service:MyTutorial1

    これはMyTutorial1というサービスをつくり、さらにMyTutorial1というディレクトリを作ります。
  4. 今作られたMyTutorial1に入ります。

    cd MyTutorial1

  5. 中にMyTutorial1.slnなどの雛型が作られているのを確認する。
  6. この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ファイルを参照を加えるには
  1. 右側にあるソリューションエクスプローラにある参照設定を右クリックし参照の追加を選びます。すると、ダイアログが表示されます。
  2. そこで、.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