0

ジャイロスコープ、磁力計、加速度計を備えた Samsung Galaxy sii 電話を使用しています。すべてNDKを使用しています。

私は toadlet ライブラリを使用して多くの電話インターフェイスを抽象化していますが、そのライブラリ内には、期待される NDK 関数を呼び出すサンプリング レートを設定する関数があります。

void AndroidSensorDevice::setSampleTime(int dt){
    if(mSensor!=NULL){
        ASensorEventQueue_setEventRate(mEventQueue,mSensor,dt*1000);
    }
} 

加速度計と磁力計のサンプリング レートを変更すると、実際のサンプリング レートの予想される変化が大まかにわかります。ただし、ジャイロスコープの場合、常に最速のレートでのみ更新されます。つまり、サンプルレートを何に設定しても、次のような時間差が得られます。

I/toadlet (10266): dt= 0.619000
I/toadlet (10266): dt= 4.423000
I/toadlet (10266): dt= 0.511000
I/toadlet (10266): dt= 4.335000
I/toadlet (10266): dt= 0.586000
I/toadlet (10266): dt= 4.371000
I/toadlet (10266): dt= 0.586000
I/toadlet (10266): dt= 4.559000
I/toadlet (10266): dt= 0.340000
I/toadlet (10266): dt= 3.827000
I/toadlet (10266): dt= 0.617000
I/toadlet (10266): dt= 5.337000
I/toadlet (10266): dt= 0.154000
I/toadlet (10266): dt= 3.538000
I/toadlet (10266): dt= 0.556000
I/toadlet (10266): dt= 4.547000

とてつもなく大きなサンプルレートを試しても効果はありません。他の誰かがこれを見たことがありますか?

電話は Android 2.3.5 を実行しており、android-9 と android-14 の両方のターゲットを使用してみましたが、顕著な違いはありません。

4

1 に答える 1

2

関数のドキュメントに基づいて、setEventRate()設定したサンプル レートは実際には単なるヒントであり、明確な仕様ではありません。あなたが目にしている振る舞いは望ましくないものですが、間違っているわけではありません。ほとんどのアプリケーションはとにかくジャイロ出力を統合する必要があるため、この動作は完全に不合理というわけではありません。本当に低いレートが必要な場合は、サンプルを平均化し、タイムスタンプに基づいて結果を読み取ることをお勧めします。

/*
 * Sets the delivery rate of events in microseconds for the given sensor.
 * Note that this is a hint only, generally event will arrive at a higher
 * rate. It is an error to set a rate inferior to the value returned by
 * ASensor_getMinDelay().
 * Returns a negative error code on failure.
 */
int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
于 2012-06-13T02:01:46.543 に答える