Top / 日記 / 20070504
/
20070504


20070504 設計実装中

Genericは便利です。

C#でもGenericタイプが使えるようになりました。Javaよりやや遅れて。コレクションでは、わかりやすく、その恩恵にあやかることができます。

private List<M2DVertex> _lstVertex;

型パラメータとしてM2DVertexを指定しますので、このListはM2DVertex用のリストということになります。いちいちキャストしなくて済むのでとっても便利な機能。

ただ非ジェネリックなリストがArrayListで、ジェネリックなリストがListっていうのがしっくこない。 JavaではListArrayListのインタフェースクラスなので。GenericArrayListというネーミングにすればよかったのでは?

クラス設計

パッケージEtrobo.Simulator

パスファインダー、コース、論理的なモーターなどを設計します。

class_sim1.png

と最初はこうしましたが、
無意味に一般化してもしょうがないので、下のような現実案とすることにします。またSensorは分け合って独立事象にしました。

class_sim2.png

あとでC++用にさらにWrapperをかぶせる予定なので、あまりしつこい設計にしたくないというのが今回の現実案の理由です。


パッケージEtrobo.Kinematics

さらに、パスファインダーの動作を計算する運動学用(切り替え可能)のクラスを追加しました。切り替え可能ですが現状ではAggregateではなくNavigate扱いにしておきます。設計をややこしくしたくないので、物理計算を切り替えたいときはこのクラスのサブクラスをつくっていって、PathFinderからつかうときは、クラス名そのものを書き換えることにします。
ModelBaseのModelは物理モデルを意識しています。

class_sim3.png

実装

親のコンストラクタでdelegate使うのはあり?

delegateを使って。トリッキーな継承をやってみました。
従来のC++とかだと、オブジェクトを作ってから、メソッドの関数ポインタを取得してきて、それを使用側であてがって使ったりしたところが、delegateと親クラスをあらわすbaseの柔軟性により1つにまとめて書くことができました。なんとなく地雷を踏んでいるようで怪しげなコードかも。。

Motor.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace Misawat.Etrobo.Simulator
{
    public class Motor
    {
        //SetMotorSpeedメソッドのデリゲート変数
        SetMotorSpeed _func_SetMotorSpeed;

        //回転方向 1:正転 -1:逆転
        int _direction = 1;

        //回転速度
        int _speed = 0;
        
        public Motor(SetMotorSpeed func_SetMotorSpeed)
        {
            _func_SetMotorSpeed = func_SetMotorSpeed;
        }
        public void Foward(int speed)
        {
            _speed = speed;
            _direction = 1;
            _func_SetMotorSpeed((double)(_direction * _speed));
        }
        public void Reverse(int speed)
        {
            _speed = speed;
            _direction = -1;
            _func_SetMotorSpeed((double)(_direction * _speed));
        }
        public void Speed(int speed)
        {
            _speed = speed;
            _func_SetMotorSpeed((double)(_direction * _speed));
        }

        public void Brake()
        {
            //TBD
        }
        public void Off()
        {
            //TBD
        }
    }
}

SteeringMotor.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace Misawat.Etrobo.Simulator
{
    public class SteeringMotor : Motor
    {
        public SteeringMotor(PathFinder pathFinder)
            : base(pathFinder.SetSteeringMotorSpeed)
        {
        }

    }
}



Graphic.Misawa2D.Partsを振り返る

昨日実装したところの修正をかけていて、クラス図の修正をしてみました。

class_parts2.png

グラフィックパーツはそれぞれ子要素をもっています。1つのモデルをくみ上げるときには複数のグラフィックパーツの親子関係を設定してツリーを作っていきます。
つまり、再帰的にツリーを構成していく部分(build())をcompositeパターンとして実現しているので、昨日のクラス図に少し補足をいれておきました。

実行イメージ

赤い点が旋回中心、円が定常円旋回軌道です。
ステアリングの角度に対して定常円旋回計算式は正常に動作したようです。
最後はステアリングの限界舵角を超えているので、旋回円は無効です。

ani_radius.gif


明日は、コースとのインタラクションをやります。おやすみなさい。


添付ファイル: fileani_radius.gif 310件 [詳細] fileclass_parts2.png 285件 [詳細] fileclass_sim3.png 312件 [詳細] fileclass_sim2.png 292件 [詳細] fileclass_sim1.png 283件 [詳細]