2015-06-19 37 views
1

我正在使用加速度傳感器來檢測我的設備是否平放在桌子上。奇怪的是,即使當我將手機放平或旋轉時,它的值始終在90到100之間!這不應該糾正!我錯過了什麼嗎?這裏是我的代碼:如何知道Android設備是否在桌子上平坦

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); 
    } 

編輯:我使用此代碼: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

您使用的是the answer you linked中使用的y軸而不是z軸。

ACOS的值將是接近零,當參數是近的一個(或接近180度時接近負一),如在這樣的畫面:

Arccos(x)

因此,您的傾斜只有當y軸歸一化到大約一個或負值時,例如當它與重力平行時(因此,該裝置「站起來」),它將接近零(或180)度。

如果沒有其他錯誤,只需切換:

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

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

應該這樣做。

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

謝謝,但你如何得到數組gravity []?它是如何初始化的 –

+1

我剛把它初始化爲0,它穩定很快 private float [] gravity = new float [] {0,00}; – dangVarmit

相關問題