4

私は現在、デバイスimuのバイアスを計算するための簡単なAndroidアプリケーションを書いています。これを行っているときに、event.timestampの値に問題が発生しました。

コードの使用:

float dT = (event.timestamp-accel_timestamp)*NS2S;

Androidリファレンスガイドの例から、クォータニオンから回転行列を計算します。

Galaxy Nexus-Sを使用してコードを実行すると、測定間隔で0.06〜0.07秒のdTが得られますが、LG Nexus4またはNexus7で同じコードを実行すると、dTは常に0になります。質問を認識しています。 、Android SensorEventタイムスタンプの問題で、Nexus 7のタイムスタンプはunixタイムスタンプですが、連続する測定値の差が常にゼロであるとは限りません。Nexus4とNexus7はどちらも同じIMUを備えていますが、これはIMUからタイムスタンプを作成する方法のバグである可能性がありますか?

4

3 に答える 3

1

うわー、わかりました、これは確かにバグです!

各SensorEventのタイムスタンプは、静的変数であるかのように上書きされます。

イベントが発生したときにタイムスタンプの文字列を記録すると、すべての値が異なります。

イベントは変更されずに配列に格納されます。

配列内のすべてのSensorEventのタイムスタンプは同じになりましたが、値の配列はまだ異なります(つまり、同じオブジェクトではなく、タイムスタンプを除いて異なる情報が含まれています)。

Google / HTC、私の人生の3時間を返してください!

誰かがこの振る舞いを説明できない限り、私はバグレポートを提出します。それは確かにAPIに文書化されていません。

それまでの間、このソリューションを試してみてください

import android.hardware.Sensor;
import android.hardware.SensorEvent;

public class UnbrokenSensorEvent {
    public long timestamp;
    public float[] values;
    public Sensor sensor;

    public UnbrokenSensorEvent(SensorEvent event){
        this.timestamp = event.timestamp;
        this.values = event.values;
        this.sensor = event.sensor;
    }
}

次に、リスナーで次のようなことを行います。

ArrayList<UnbrokenSensorEvent> results = new ArrayList<UnbrokenSensorEvent>();

public void onSensorChanged(SensorEvent event) {
    results.add(new UnbrokenSensorEvent(event));
}

SensorEventとUnbrokenSensorEventのパブリックフィールドは同じであるため、リファクタリングは非常に簡単です。他のSensorEvent機能を使用する必要がある場合は、先に進んでUnbrokenバージョンにチャックしてください。

ハッキーですが、APIが更新されるのを待つよりも、IMHOのクイックハックの方が常に優れています。

于 2013-02-18T05:29:11.050 に答える
1

また、SensorEventListenerのonSensorChanged-methodに関するドキュメントにも注意してください。

注:アプリケーションは、パラメーターとして渡されたイベントオブジェクトを所有していないため、それを保持できません。オブジェクトは内部プールの一部である可能性があり、フレームワークによって再利用される可能性があります。

ここで見つかりました:http://developer.android.com/reference/android/hardware/SensorEventListener.html#onSensorChanged%28android.hardware.SensorEvent%29

...これは、SensorEventオブジェクトへの参照を保持するべきではないことを示唆しています。

于 2013-04-02T16:19:42.527 に答える
0

ここからスニペットをコピーした場合 は、バグがあることに注意してください。交換が必要

private float timestamp;

private long timestamp;

それ以外の場合、デルタ時間には常に奇妙な値が含まれます

于 2014-04-09T08:55:39.640 に答える