что не так с моей техникой контроля датчиков?

(пожалуйста, прочтите ОБНОВЛЕНИЕ 3 в конце)m разрабатывает приложение, которое постоянно работает с датчиками устройства, работает сAccelerometer а такжеMagnetic датчики для определения ориентации устройства (цель указанаВот). Другими словами, моему приложению нужно знать ориентацию устройства в режиме реального времени (однако это никогда не возможно, поэтому как можно быстрее, но на самом деле так быстро, каквозможный !). как упомянуто вПрофессиональная разработка приложений для Android 4 от Reto Meier:

Акселерометры могут обновляться сотни раз в секунду ...

Я не должен терять какие-либо данные, о которых сообщают датчики, и я также хочу выполнять трудоемкие операции с этими данными (восстановить ориентацию, а затем выполнить вычисления ...). Я решил решить мою проблему с помощью:LinkedBlockingQueue

    public void startSensors() {
            LinkedBlockingQueue 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();
        }
    });
}

а также

    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...
                     }
                                }

теперь я беру свое устройство и поворачиваю его примерно на 90 градусов вправо, а затем быстро возвращаю его в первое положение (например, через 1,5 секунды), но, когда я смотрю на ориентации, зарегистрированные в устройстве, я вижу, например: 0,1 , 2,3,4,5 ......., 40,39,38,37, ...., 0

Я просто хочу сказать, чтоЯ могу'не вижу большой области градусов в моем результате , основываясь на том, что я сделал и что я исследовалЯ просто могу быть уверен, что я НЕ теряю никаких данных, регистрируются любые новые данные, сообщаемые датчиками.

Любая идея, решение ?!

С уважением!

ОБНОВЛЕНИЕ 1: Я провел еще один эксперимент с моим устройством и получил потрясающие результаты! если я поверну свое устройство по оси на 90 градусов быстрее (менее секунды), я смогу увидеть все градусы в моем результате: 0,1,2,3, ...., 89,90 (например), но если я поверните его на 90 градусов, а затем поверните обратно к своей первой позиции, результат будет 0,1,2, ..., 36,37,36, ... 2,1,0 (например) ... действительно сбивает с толку!

ОБНОВЛЕНИЕ 2: Я обновил метод doCalculations (), чтобы было яснее, что я сделал

ОБНОВЛЕНИЕ 3: Я думаю, что мы можем решить проблему другим способом! У меня есть четкие цели для этого кода. пожалуйста, посмотрите наэтот, Я упомянул о том, что произойдет, мне нужно обнаружить определенный жест движения. так что, возможно, весь выбранный мной способ (методика выше) не является хорошим способом решения этой проблемы. может быть это'Лучше обнаружить этот жест, используя другие датчики или используя те же датчики другим способом. что ты думаешь?

Ответы на вопрос(7)

Ваш ответ на вопрос