私は最近、センサーの更新を同期しようとしています。特に、TYPE_ROTATION_VECTOR と TYPE_ACCELEROMETER から可能な限り近い値を取得しています。
これは、何が私を困難にしているのかを示すための完全なプログラムです。
public class FusionTest extends Activity implements SensorEventListener {
private SensorManager sensorManager = null;
private Sensor rotSensor = null;
private Sensor accSensor = null;
private int rots = 0;
private int accs = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
rotSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, rotSensor, 500 * 1000);
sensorManager.registerListener(this, accSensor, 500 * 1000);
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
accs++;
System.out.println("accs: "+accs+", rots: "+rots);
}else if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR){
rots++;
System.out.println("accs: "+accs+", rots: "+rots);
}
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) { }
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this, rotSensor);
sensorManager.unregisterListener(this, accSensor);
}
}
このプログラムの目的は、センサーが遅延セットで更新を提供する頻度を確認することです。このプログラムを正確に 50 秒間実行すると、出力の最後の行が次のようになります。
05-21 19:37:01.431: D/FusionTest(26378): accs: 758, rots: 100
回転ベクトルの更新には 500 ミリ秒の遅延があるようですが、加速度の更新には約 66 ミリ秒の遅延があります。これは、registerListener のドキュメントからのものです。
rateUs --> センサー イベントが配信されるレート。これはシステムへのヒントにすぎません。イベントは、指定された速度より速くまたは遅く受信される場合があります。通常、イベントはより速く受信されます。値は、SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME、または SENSOR_DELAY_FASTEST のいずれか、またはマイクロ秒単位のイベント間の目的の遅延である必要があります。マイクロ秒単位の遅延の指定は、Android 2.3 (API レベル 9) 以降でのみ機能します。以前のリリースでは、SENSOR_DELAY_* 定数のいずれかを使用する必要があります。
私は Android 4.4.2 をターゲットにしているので、遅延をマイクロ秒単位で指定できるはずです。システムが 500 ミリ秒の遅延で更新を配信するように指定した場合、それはシステムへのヒントに過ぎないことを理解しています。しかし、回転ベクトルと加速度計の実装では遅延時間の解釈が異なるという事実により、データの同期が難しくなります。時間 t で加速度の更新を取得するときは、時間 t での回転ベクトルも取得したいと考えています。逆もまた同様です。これを達成する方法はありますか?
編集:現時点で私ができる最も近い方法は、更新が最も遅いセンサーを選択し、他のセンサーの値を補間して、最初のセンサーから値を取得した時点で遅いセンサーの値を近似することです。これはまだ私が望んでいるものではありませんが、少なくとも同期されていないデータを収集することからの改善です。