SimplySIM NXT MSRDSのサンプルを動かしてみる(1)(VPL Explorer編)2

前回の「SimplySIM NXT MSRDSのサンプルを動かしてみる(1)(VPL Explorer編)」の続きです。

  • 今回やりたいこと

1.5つのサンプルの中の一つのVPL Explorerを実行してみる。
2.Sample2ServiceとVPL Explorerの違いを調べる。 →今回はここ。
3.VPL Explorerを修正し、自作したVPL図を動かしてみる。

今回、この違いを調べてみようと思ったのは、SimplySIM NXT MSRDSをインストール時のヘルプに

Samples Overview
The Package is composed of 5 samples:

  • Sample1Service
  • Sample2Service
  • Sample3Service
  • VPL XBox control
  • VPL Explorer

・・・一部省略
The fifth sample is a VPL sample too which is closed to the second sample.

という表記があったので、両者を対応づけてみることでプログラムの理解が深まるのではないかと思ったからです。


【実行手順】

1.SimplySIM - NXT-MSRDS.batをダブルクリック。(SimplySIM - NXT-MSRDS.batはSimplySIM NXT MSRDSをインストールしたフォルダの直下にあります。私の場合は E:\Documents and Settings\asa\Microsoft Robotics Dev Studio 2008 Expressです。以下ではこのフォルダにインストールされたことを前提に説明をしています。

2.起動したSimplySIM NXT MSRDSインターフェイスのServicesから「Sample2Service」を選択し、「Run in simulation」ボタンを押す。


前回と同様に実行結果をわかりやすくするために、LEGOのスタート位置をSimplySIM NXT MSRDSインターフェイスのDriveを使って移動させて変更しています。
移動前の図(デフォルト位置)

スタート位置変更後

  • Sample2Serviceの実行結果

サンプル2をVPLサンプルと同条件で動かしてみる
(同条件といいつつも、スタート位置は手動で設定しているのでサンプル「VPL Explorer」を実行させた時とはかなり誤差があるんですけど。。。)

マシンのスペックの問題なのか、(Windows Media エンコーダを起動しているせいかもしれないです。)「Run in simulation」ボタンを押してからLEGOが走り出すまで若干、時間がかかりました。

こちらがサンプル「VPL Explorer」を実行させた時の結果です。

サンプル「Sample2Service」の動きの方がサンプル「VPL Explorer」の時よりもなんだか早く曲がったような気がします。


先ほどのヘルプに

Sample2Service Exploration of Open Space
For this sample, the robot will explore the environment and avoid obstacles using the sonar sensor. Each time an obstacle is detected (distance inferior to 40cm) the robot move in rear direction while the object is detected. There is an interaction with the environment.

とあったので、

(distance inferior to 40cm)

これが40cm以内の障害物を検知するという意味だと思っていたのですが、ソースを見たら、60cmなんじゃないかな〜と思いました。(でも、自信はありません。。。)

  • Sample2Service.csのpublic class Sample2Service : DsspServiceBase{}の一部1
        #region Constants

        /// <summary>
        /// Power used for drive
        /// </summary>
        public const double DrivePower = 0.3;
        
        /// <summary>
        /// Limit distance for avoidance
        /// </summary>
        public const double SonarLimit = 60;

        #endregion

たぶん、この

SonarLimit = 60;

で60cm以内の障害物を検知して、サンプル「VPL Explorer」の時の40cmよりも反応がよくなってしまったのではないかと思われます。(ソースの詳細を調べたわけではないので憶測です。)

あと、もう一箇所。

  • Sample2Service.csのpublic class Sample2Service : DsspServiceBase{}の一部(2)
        /// <summary>
        /// Handler called on ultrasonic notification
        /// </summary>
        private IEnumerator<ITask> AnalogSonarReplaceHandler(analog.Replace replace)
        {
            if (replace.Body.RawMeasurement <= SonarLimit)
            {
                // When an object is too close, avoid it
                _drivePort.SetDrivePower(-DrivePower, -DrivePower / 2);
            }
            else
            {
                // Otherwise, move forward
                _drivePort.SetDrivePower(DrivePower, DrivePower);
            }

            yield break;
        }

上で、

public const double DrivePower = 0.3;

とセットしているので、replace.Body.RawMeasurement <= SonarLimitの場合(障害物までの距離が60cm以内になったら)は

_drivePort.SetDrivePower(-DrivePower, -DrivePower / 2);
より

_drivePort.SetDrivePower(-0.3, -0.15)

60cm以内に障害物がない場合は

_drivePort.SetDrivePower(DrivePower, DrivePower);
より

_drivePort.SetDrivePower(0.3, 0.3)

という動作をしているのではないかと思います。
(_drivePort.SetDrivePowerの引数がそれぞれLeftWheelPowerとRightWheelPowerに対応しているような気がします。)

これが、サンプル「VPL Explorer」では、

  • 40cm以内に障害物がある場合

LeftWheelPower -0.5
RightWheelPower -0.1


(ifブロックとGenericDifferentialDriveをつないだ線上のプロパティ表示)

  • 40cm以内に障害物がない場合

LeftWheelPower 0.5
RightWheelPower 0.5


(ifブロックとGenericDifferentialDriveをつないだ線上のプロパティ表示)
という設定がされていました。

  • まとめ


項目サンプル「VPL Explorerサンプル「Sample2Service」
モータの出力値を設定する
Sample2Service.csのpublic class Sample2Service : DsspServiceBase{}の一部

public const double DrivePower = XXX;



_drivePort.SetDrivePower(DrivePower, DrivePower)

引数1:LeftWheelPowerに対応
引数2:RightWheelPowerに対応

超音波センサのリミット値を設定する

Sample2Service.csのpublic class Sample2Service : DsspServiceBase{}の一部

public const double SonarLimit = XX;



例えば、
if (replace.Body.RawMeasurement <= SonarLimit){
_drivePort.SetDrivePower(-DrivePower, -DrivePower / 2);
}
else{
_drivePort.SetDrivePower(DrivePower, DrivePower);
}

次回は、3番目の
-VPL Explorerを修正し、自作したVPL図を動かしてみる。
についてまとめたいと思います。(結果は失敗だったんですけど。。。σ(^-^;))