0

こんにちは皆さん、加速度計 (wiimote 内) からデータを取得し、それを処理してグラフ化するアプリケーションを C# で作成しています。Brian Peek の Wiimote ライブラリを使用しているので、イベント ハンドラーを使用してデータを取得しています。

void wiimote_WiimoteChanged(object sender, WiimoteChangedEventArgs e)
{
    X = e.WiimoteState.AccelState.Values.X;
    Y = e.WiimoteState.AccelState.Values.Y;
    Z = e.WiimoteState.AccelState.Values.Z;          

}

100Hz のレートでデータをグラフ化/保存/処理したいので、タイマー オブジェクト (WiiTimer) を作成し、「Tick Interval」を 10ms に設定し、タイマーのすべてのティックで、データが保存/処理されます。

private void WiiTimer_Tick(object sender, EventArgs e)
{

   //Signal Processing (Some median and low pass filtering etc.) Ive removed the code for that since it is irrelevant here

    sw.WriteLine((X * 9.8).ToString() + ", " + (Y * 9.8).ToString() + ", " + (Z*9.8).ToString() );
  //Write Processed Data to file            

}

ここでの問題は、信号処理に時間がかかるため、データが実際には 100Hz で保存されないことです。タイマーは OnTick イベント ハンドラを 10ms ごとに呼び出すことができません。したがって、データの保存速度は、コードを実行しているマシンの速度、実行している他のプログラムの数などによって異なります。

これを解決するにはどうすればよいですか?別のスレッドでタイマーを実行することを考えましたが、他の問題が発生する可能性があります。誰かがここで別の質問を指摘したように:レースコンディション。」

何か案は?

4

1 に答える 1

1

タイマーは特に正確ではないため、実際に 1 秒あたり 100 サンプルが必要な場合は、次のようにするのが最善の方法です。

private class Result
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}

private Result lastResult;

void wiimote_WiimoteChanged(object sender, WiimoteChangedEventArgs e)
{
    Result newResult = new Result {
        X = e.WiimoteState.AccelState.Values.X,
        Y = e.WiimoteState.AccelState.Values.Y,
        Z = e.WiimoteState.AccelState.Values.Z,
    } 

    lastResult = newResult;
}

void MainLoop()
{
    DateTime nextResultTime = DateTime.Now.AddMilliseconds(10);

    while(true)
    {
        if (DateTime.Now >= nextResultTime)
        {
            AddResult(lastResult);
            nextResultTime = nextResultTime.AddMilliseconds(10);
        }
        else
        {
            Thread.Sleep(1);
        }
    }
}

バックグラウンド スレッドで MainLoop を実行するだけです (Wii イベントがバックグラウンド スレッドで発生する場合、これは必要ない場合があります)。

これにより、マシンが AddResult をそれほど高速に処理できない場合を除いて、1 秒あたり正確に 100 サンプルが得られます。その場合、AddResult 内の負荷を軽減し、データをキャプチャした後にいくつかの後処理を行う必要があると思います。マシンがリアルタイムで実行できるほど高速であるか、そうでないかのどちらかです。

于 2012-11-24T17:52:57.573 に答える