比方說,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軸。
即時獲得錯誤kThresholdMovementHigh.What是什麼 – srinadh 2013-03-26 14:20:07
kThresholdMovementHigh只是一個常量。閾值以下是「噪音」 - 即您想要忽略的移動。閾值以上是您想要作爲用戶故意移動來處理的移動。我已經更新了我的問題以包含我的#define。你需要確定什麼是最適合你的應用的。 – 2013-03-28 23:34:20