co jest nie tak z moją techniką monitorowania czujnika?

(proszę przeczytać UPDATE 3 na końcu) Rozwijam aplikację, która stale współpracuje z czujnikami urządzenia, współpracuje zAccelerometer iMagnetic czujniki do pobierania orientacji urządzenia (wspomniany celtutaj). innymi słowy, moja aplikacja musi znać orientację urządzenia w czasie rzeczywistym (jednak nigdy nie jest to możliwe, więc tak szybko, jak to możliwe, ale naprawdę tak szybko, jakmożliwy !). jak wspomniano wprofesjonalne tworzenie aplikacji Android 4 przez Reto Meier:

Akcelerometry mogą aktualizować setki razy na sekundę ...

Nie mogę stracić żadnych danych, które raportują czujniki, a także chcę wykonywać czasochłonne operacje na tych danych (odzyskać orientację, a następnie wykonać obliczenia ...). Postanowiłem rozwiązać mój problem za pomocąLinkedBlockingQueue:

    public void startSensors() {
            LinkedBlockingQueue<float[][]> array=new LinkedBlockingQueue();
    sensorListenerForOrientation = new SensorEventListener() {

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
                aValues = (event.values.clone());
            else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
                mValues = (event.values.clone());
            if (aValues != null && mValues != null) {
                try {
                    array.put(new float[][] { aValues, mValues });
                } catch (InterruptedException e) {
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
    Sensor aSensor = sm.getSensorList(Sensor.TYPE_ACCELEROMETER).get(
            sm.getSensorList(Sensor.TYPE_ACCELEROMETER).size() - 1);
    Sensor mSensor = sm.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(
            sm.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).size() - 1);
    sm.registerListener(sensorListenerForOrientation, aSensor,
            SensorManager.SENSOR_DELAY_FASTEST);
    sm.registerListener(sensorListenerForOrientation, mSensor,
            SensorManager.SENSOR_DELAY_FASTEST);
    executor.execute(new Runnable() {
        @Override
        public void run() {
            doCalculations();
        }
    });
}

i

    public void doCalculations() {
    for (;;) {
        float[][] result = null;
        try {
            result = array.take();
        } catch (InterruptedException e) {
        }
        float[] aValues, mValues;
        aValues = result[0];
        mValues = result[1];

                    int[] degrees=getOrientation(aValues,mValues);
                    Log.e("",String.valueOf(degrees[0]));

                 //other calculations...
                     }
                                }

teraz podnoszę urządzenie i obracam je o 90 stopni w prawo, a następnie szybko przywracam do pierwszej pozycji (na przykład w 1,5 sekundy), ale patrząc na orientacje zarejestrowane w urządzeniu widzę na przykład: 0,1 , 2,3,4,5 ......., 40,39,38,37, ...., 0

Chcę tylko to powiedziećW moim wyniku nie widzę dużej domeny stopni . na podstawie tego, co zrobiłem i co zbadałemJestem po prostu pewien, że nie tracę żadnych danych, wszelkie nowe dane zgłaszane przez czujniki są rejestrowane.

jakikolwiek pomysł, rozwiązanie ?!

Pozdrowienia!

AKTUALIZACJA 1: Zrobiłem kolejny eksperyment z moim urządzeniem i otrzymałem szokujące wyniki! jeśli obrócę moje urządzenie o 90 stopni szybko (mniej niż sekundę), widzę wszystkie stopnie w moim wyniku: 0,1,2,3, ...., 89,90 (na przykład), ale jeśli ja obróć go o 90 stopni, a następnie obróć z powrotem do pierwszej pozycji, wynikiem będzie 0,1,2, ..., 36,37,36, ... 2,1,0 (na przykład) ... naprawdę mylące !

AKTUALIZACJA 2: Zaktualizowałem metodę doCalculations (), aby lepiej zrozumieć, co zrobiłem

AKTUALIZACJA 3: Myślę, że może uda nam się rozwiązać problem w inny sposób! Mam jasne cele dla tego kodu. proszę spojrzeć nato. Wspomniałem o tym, co się wydarzy, muszę wykryć określony gest ruchu. więc może cała droga, którą wybrałem (powyższa technika) nie jest dobrym sposobem na rozwiązanie tego problemu. może lepiej wykryć ten gest, używając innych czujników lub używając tych samych czujników w inny sposób. co myślisz?

questionAnswers(7)

yourAnswerToTheQuestion