Значения акселерометра ведут себя как измеритель наклона? - PullRequest
2 голосов
/ 20 мая 2011

Значения, которые я получаю для accel, x, y и z ниже, не соответствуют ожидаемым.

Кажется, он действует как датчик наклона, а не как акселерометр.

Когда я бросаю телефон в воздух и ловлю его, значение accel не изменяется более чем на 10%. Сравните это с тем, что, когда я поворачиваю телефон случайным образом, я получаю гораздо большие вариации на 50-100%!

Что может объяснить это? Я просто хочу определить, когда телефон находится в свободном падении (и / или воздействует на что-либо).

SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);
    sm.registerListener(
        sel = new SensorEventListener(){
            @Override public void onAccuracyChanged(Sensor arg0, int arg1) {}
            @Override public void onSensorChanged(SensorEvent arg0) {
                        double x = se.values[0];
                        double y = se.values[1];
                        double z = se.values[2];
                        double accel = Math.sqrt(
                                            Math.pow(x, 2) +    
                                            Math.pow(y, 2) + 
                                            Math.pow(z, 2));
            }
        }, 
        sensor, 
        SensorManager.SENSOR_DELAY_NORMAL
   );

(Как дополнительный вопрос, значения для x, y и z кажутся намного выше, чем они должны быть, с accel в среднем около 50-80, когда стоит на месте? Разве это не должно быть около 9,8?)

Значения x, y и z кажутся очень чувствительными к изменениям ориентации телефона, но никак не отражают ускорение. Я что-то упустил ??

Пример значений с неподвижным телефоном, лежащим на спине: Accel = 85,36, x = 6,8, y = 45,25 z = 30,125

Ответы [ 3 ]

2 голосов
/ 20 мая 2011

Мне пришлось заменить

Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);

с

Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
0 голосов
/ 25 мая 2011

Когда телефон лежит на спине, вы должны приблизиться к нулю на датчиках X и Y и около 9,8 на датчике Z.9.8, конечно, из-за гравитации.

Мое первое, хотя бы, что с телефоном что-то не так, и предложил бы попробовать тот же код на другом телефоне.

Однако я заметил, что естьчто-то не так в математике, но не понял, что еще.

с x, y, z, имеющими значения, которые вы упомянули, результирующий (квадратный корень из суммы квадратов) получается 54,78, а не 85,36, как вы упоминаете в своем посте.

ЯЯ новичок в Java, поэтому я не могу легко определить, что может быть не так, и у меня еще не было возможности попробовать этот код на моем телефоне, но я думаю, что математика достаточно проста, чтобы я мог определить, что результат неправильный.(или, по крайней мере, я на это надеюсь).

Еще одна вещь, которую нужно проверить (если вы решите математическую задачу), заключается в том, что небольшое изменение, когда вы бросаете телефон в воздух, может быть вызвано просто медленным временем отклика.,Выходной сигнал акселерометра может просто меняться слишком медленно, поэтому к моменту приземления телефона выходной сигнал не изменился бы так сильно.Ответ можно улучшить, используя SENSOR_DELAY_GAME или SENSOR_DELAY_FASTEST вместо обычного.

Кстати, не должно ли это быть arg0.values ​​[], а не se.values ​​[]?Откуда пришло СЭ?Значения датчика входят в аргумент onSensorChanged (в данном случае arg0), поэтому я не могу понять, как они должны заканчиваться в se.(Но с другой стороны, в Java есть много вещей, которые я до сих пор не понимаю)

0 голосов
/ 20 мая 2011

Может быть потому, что когда вы бросаете телефон, он находится почти в той же плоскости или под углом и на низкой скорости, когда вы поворачиваете телефон, он быстро меняет свой курс и ориентацию, и это дает более высокие значения для результата. Акселерометр может быть неправильным для многофункционального устройства, там может быть параметр выбора для функции, от которой вы действительно хотите получить результаты.

...