2015-06-19 3 views
1

Я использую датчик акселерометра, чтобы определить, нет ли устройства на столе или нет. Странная вещь, даже когда я делаю свой телефон плоским или вращаю его на своей стороне, значение всегда находится между 90 и 100! Это не должно исправить! я что-то упускаю? Вот мой код:Как узнать, установлено ли Android-устройство Flat at table

float[] values = event.values; 
    // Movement 
    float x = values[0]; 
    float y = values[1]; 
    float z = values[2]; 
    float norm_Of_g =(float) Math.sqrt(x * x + y * y + z * z); 

    // Normalize the accelerometer vector 
    x = (x/norm_Of_g); 
    y = (y/norm_Of_g); 
    z = (z/norm_Of_g); 
    int inclination = (int) Math.round(Math.toDegrees(Math.acos(y))); 
    Log.i("tag","incline is:"+inclination); 

    if (inclination < 25 || inclination > 155) 
    { 
     // device is flat 
     Toast.makeText(this,"device flat - beep!",Toast.LENGTH_SHORT); 
    } 

Edit: Я использую этот код: How to measure the tilt of the phone in XY plane using accelerometer in Android

+0

Вы должны использовать 'log.i (, )', а не 'System.out', который для терминала –

+0

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

+0

Также 'System.out' по умолчанию является строковым буфером, поэтому вывод доступен только при отправке новой строки. – o11c

ответ

1

Вы используете ось y вместо оси z, как используется в the answer you linked.

Значение экоса будет близкой к нулю, когда аргумент рядом один (или около 180 градусов, когда рядом с отрицательной), как показано на рисунке:

Arccos(x)

Таким образом, ваша склонность будет около нуля (или 180) градусов только тогда, когда ось y нормализована примерно на одну или на отрицательную, например, когда она параллельна гравитации (таким образом, устройство «встает»).

Если нет другой ошибки, просто переход от:

int inclination = (int) Math.round(Math.toDegrees(Math.acos(y))); 

в

int inclination = (int) Math.round(Math.toDegrees(Math.acos(z))); 

должны это сделать.

-1

Поставьте точку останова в функции и использовать, чтобы отслеживать, где вещи отклоняются от того, что можно было ожидать. Поменяйте свой отпечаток на Log.d (...) или Timber.d(...)

ЗАКАНЧИВАТЬ https://developer.android.com/tools/debugging/debugging-studio.html для получения дополнительной информации о том, как отлаживать в Android Studio

0

Я использовал код на этой странице Motion Sensors

public void onSensorChanged(SensorEvent event){ 
    // In this example, alpha is calculated as t/(t + dT), 
    // where t is the low-pass filter's time-constant and 
    // dT is the event delivery rate. 

    final float alpha = 0.8; 

    // Isolate the force of gravity with the low-pass filter. 
    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

    // Remove the gravity contribution with the high-pass filter. 
    linear_acceleration[0] = event.values[0] - gravity[0]; 
    linear_acceleration[1] = event.values[1] - gravity[1]; 
    linear_acceleration[2] = event.values[2] - gravity[2]; 
} 

Цель состоит в том, чтобы разложить силу силы тяжести (по повторным измерениям) в значениях акселерометра, оставив только компонент ускорения в каждом направлении.

Сила тяжести измеряется вдоль каждой оси, поэтому, как только вы узнаете, какая ось представляет собой устройство, лежащее на плоской поверхности, вы можете просто проверить, лежит ли большая часть силы тяжести именно этой оси. Это означает, что устройство лежит на столе.

Вы также можете посмотреть линейное ускорение, чтобы убедиться, что устройство не перемещается.

+1

спасибо, но как вы получите массив тяжести []? как он инициализирован –

+1

Я только что инициализировал его до 0. он стабилизируется довольно быстро 10 частный поплавок [] gravity = new float [] {0,00}; – dangVarmit

Смежные вопросы