2012-04-21 27 views
5

比方說,iPhone放置在平坦的桌子上。我想確定桌面平面的角度,其中角度爲0意味着桌子恰好垂直於重力矢量。在.M使用加速度計獲取設備平面相對於地平面

#define kThresholdMovementHigh 0.05 

- (void)accelerometer:(UIAccelerometer *)accelerometer 
     didAccelerate:(UIAcceleration *)acceleration 
{ 
    // did device move a lot? if so, reset sums 
    if (fabsf(acceleration.x - accelerationXAverage) > kThresholdMovementHigh || 
     fabsf(acceleration.y - accelerationYAverage) > kThresholdMovementHigh || 
     fabsf(acceleration.z - accelerationZAverage) > kThresholdMovementHigh ) 
    { 
     NSLog(@"deviceDidMove a lot"); 
     accelerationXSum = acceleration.x; 
     accelerationYSum = acceleration.y; 
     accelerationZSum = acceleration.z; 
     readingsCount = 1; 
    } 

    else 
    { 
     // because the device is at rest, we can take an average of readings 
     accelerationXSum += acceleration.x; 
     accelerationYSum += acceleration.y; 
     accelerationZSum += acceleration.z; 
     readingsCount ++;   
    } 

    accelerationXAverage = accelerationXSum/readingsCount; 
    accelerationYAverage = accelerationYSum/readingsCount; 
    accelerationZAverage = accelerationZSum/readingsCount; 

    float angle = RadiansToDegrees(atanf(accelerationZAverage/sqrtf(pow(accelerationXAverage, 2) + pow(accelerationYAverage, 2)))) + 90; 

    labelAngle.text = [NSString stringWithFormat:@"%.2f°", angle]; 
} 

我通過平均加速度計讀數濾除噪聲

radians = atanf (z/sqrt (x^2 + y^2) 

在.H

double  accelerationXAverage; 
double  accelerationYAverage; 
double  accelerationZAverage; 

double  accelerationXSum; 
double  accelerationYSum; 
double  accelerationZSum; 
int   readingsCount; 

:我使用以下公式。加速度計更新間隔爲1/60,現在在試驗時,我已經讓設備靜止10秒(所以它平均有600個讀數)。

這個公式似乎工作,它給了我我想要的角度。不過,我也期待如果我在旋轉到不同的靜態位置的同時仍然平放在桌面上試着這樣做,我應該得到相同的答案(相對於重力矢量的原因,角度沒有改變) 。但是,這並不是我在嘗試時得到的結果。角度相差幾度。

我正在使用正確的公式?爲什麼同一個桌面上的不同位置角度會有所不同?這僅僅是錯誤的邊緣嗎?

我已經添加了一個圖像(來自http://gotoandplay.freeblog.hu/),以確保我在談論相同的x軸和z軸。 enter image description here

+0

即時獲得錯誤kThresholdMovementHigh.What是什麼 – srinadh 2013-03-26 14:20:07

+0

kThresholdMovementHigh只是一個常量。閾值以下是「噪音」 - 即您想要忽略的移動。閾值以上是您想要作爲用戶故意移動來處理的移動。我已經更新了我的問題以包含我的#define。你需要確定什麼是最適合你的應用的。 – 2013-03-28 23:34:20

回答

3

您的方法和公式是正確的。

x,y和z是相對於設備。理論上,角度應該是相同的,而不管設備在桌面上的角度位置如何。然而,這裏有幾個因素會影響精確度,包括在這樣一個小角度上進行反正切計算。我建議你嘗試一下桌子傾斜(不與地面水平)。說你的桌子與地面成30度的角度,並嘗試。我假設你的x,y,z都是雙重的

+0

感謝您的建議。我嘗試了更大的傾向。絕對差值大致相同(〜1度),儘管百分比誤差對於較大傾角的影響較小。我有x,y,z作爲花車;我已經變成了雙倍。 – 2012-04-22 14:58:37

+0

經過一番更多的實驗後,我認爲這只是誤差。我在同一個位置用iPhone做了多個測試,角度變化了0.5度。 (我應該首先檢查精度!)。你是對的,精確度的缺乏在小角度數學上更加明顯。 – 2012-04-22 15:31:37