« 3軸加速度センサを使ったアプリケーションと言えば | トップページ | FRマイコン基板でQステアをコントロール(その1) »

2008年11月 8日 (土曜日)

3軸加速度センサを使ったアプリケーションと言えば(その2)

さて、前回から少し間が空きましたが続きです。PC側のアプリケーションを作成し、最低限の機能が実装できたのでそこまでの過程とアプリケーションの紹介をします。

ソースは非常にシンプルで、フォームはタイマーとピクチャーボックスを配置しただけです。これにインターフェース2008年9月号のサンプル「UDP電圧計」のUDP受信処理を行うクラスを取り込んで、前回作ったSilentC側のデータに合うように処理を変更します。

後は、タイマーのTickイベントで加速度センサの値を取得して加速度や速度を算出、ピクチャーボックスの表示位置を決定して設定します。基本的に は等加速度運動の速度と加速度の式をベースにしていて、そこへ簡易的に摩擦や弾性衝突を考慮したロジックも含めています(ソースを見れば分かりますが、ロ ジックと言うほどのものじゃないですね)。

結果、こんな感じのアプリケーションとなりました。

ソースコードはタイマーのTickイベントの部分のみを公開します。定数なんかはテキトーに推測してください。C#の流儀ってやつにあまり精通していないので変数の命名なんかも結構テキトーです。ま、今度もう少し機能を追加してみようと思うのでその辺はおいおいと言う事で。

        /// <summary>
        /// 現在のセンサ情報から加速度と速度を求め、位置を計算&反映させます。
        /// 加速度が閾値以下だとブレーキがかかります。
        /// ウィンドウの上下左右にぶつかると弾性衝突となります
        /// (反発係数は使用せず、単純にブレーキをかけた逆方向の速度としています)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            // X軸加速度と速度
            int acc_x = workerObject.GetX() - this.NEUTRAL_X;
            double g_rate_x = 0;
            if (Math.Abs(acc_x) > Form1.NEUTRAL_THRESHOLD)
            {
                g_rate_x = -(acc_x / G_BASE);
                Console.WriteLine("g_rate_x:" + g_rate_x);
            }
            if (g_rate_x != 0)
                velocity_x = g_rate_x * Form1.G * step + velocity_x;
            else
                // 加速度が無い場合はブレーキをかける
                velocity_x -= velocity_x * brake;
            if (Math.Abs(velocity_x) < 1)
                velocity_x = 0;

            // X軸加速度と速度
            int acc_y = workerObject.GetY() - this.NEUTRAL_Y;
            double g_rate_y = 0;
            if (Math.Abs(acc_y) > Form1.NEUTRAL_THRESHOLD)
            {
                g_rate_y = acc_y / G_BASE;
                Console.WriteLine("g_rate_y:" + g_rate_y);
            }
            if (g_rate_y != 0)
                velocity_y = g_rate_y * Form1.G * step + velocity_y;
            else
                // 加速度が無い場合はブレーキをかける
                velocity_y -= velocity_y * brake;
            if (Math.Abs(velocity_y) < 1)
                velocity_y = 0;

            // X位置を算出
            double location_x = 0.5 * g_rate_x * Form1.G * (step ^ 2) + velocity_x * step;
            Console.WriteLine("velocity_x:" + velocity_x);
            Console.WriteLine("location_x:" + location_x);
            pictureBox1.Left += (int)location_x;
            if ((pictureBox1.Left + pictureBox1.Width) > this.Width)
            {
                pictureBox1.Left = (this.Width - pictureBox1.Width);
                // 衝突によるブレーキ
                velocity_x = -velocity_x * brake;
            }
            else if (pictureBox1.Left < 0)
            {
                pictureBox1.Left = 0;
                // 衝突によるブレーキ
                velocity_x = -velocity_x * brake;
            }

            // Y位置を算出
            double location_y = 0.5 * g_rate_y * Form1.G * (step ^ 2) + velocity_y * step;
            Console.WriteLine("velocity_y:" + velocity_y);
            Console.WriteLine("location_y:" + location_y);
            pictureBox1.Top += (int)location_y;

            // タイトルバーの高さ分のオフセット考慮は未だ健在なんですね
            if ((pictureBox1.Top + pictureBox1.Height) > (this.Height - SystemInformation.CaptionHeight))
            {
                pictureBox1.Top = (this.Height - SystemInformation.CaptionHeight - pictureBox1.Height);
                // 衝突によるブレーキ
                velocity_y = -velocity_y * brake;
            }
            else if (pictureBox1.Top < 0)
            {
                pictureBox1.Top = 0;
                // 衝突によるブレーキ
                velocity_y = -velocity_y * brake;
            }
        }

|

« 3軸加速度センサを使ったアプリケーションと言えば | トップページ | FRマイコン基板でQステアをコントロール(その1) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/43053048

この記事へのトラックバック一覧です: 3軸加速度センサを使ったアプリケーションと言えば(その2):

« 3軸加速度センサを使ったアプリケーションと言えば | トップページ | FRマイコン基板でQステアをコントロール(その1) »