Синхронизировать обновления датчика

В последнее время я пытался синхронизировать обновления датчиков, особенно получать значения из 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, и наоборот. Есть ли способ добиться этого?

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

0 ответов

Другие вопросы по тегам