Синхронизировать обновления датчика
В последнее время я пытался синхронизировать обновления датчиков, особенно получать значения из 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, и наоборот. Есть ли способ добиться этого?
РЕДАКТИРОВАТЬ: Самое близкое, что я могу сделать в данный момент, это выбрать датчик, который обеспечивает самые медленные обновления, а затем выполнить интерполяцию между значениями другого датчика, чтобы приблизить значение более медленного датчика в тот момент, когда я получил значение от первого датчика. Это все еще не то, что я хочу, но, по крайней мере, улучшение от простого сбора несинхронизированных данных.