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

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

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

Я не должен терять какие-либо данные, о которых сообщают датчики, и я также хочу выполнять трудоемкие операции с этими данными (восстановить ориентацию, а затем выполнить вычисления ...). Я решил решить мою проблему с помощью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();
        }
    });
}

а также

    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: Я думаю, что мы можем решить проблему другим способом! У меня есть четкие цели для этого кода. пожалуйста, посмотрите наэто, Я упомянул о том, что произойдет, мне нужно обнаружить определенный жест движения. так что, возможно, весь выбранный мной способ (методика выше) не является хорошим способом решения этой проблемы. может быть, лучше определить этот жест, используя другие датчики или используя те же датчики другим способом. что ты думаешь?

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

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