使用加速度计获取相对于地平面的设备平面

假设iPhone被放置在平坦的桌子上。 我想确定桌面平面的angular度,其中angular度为0意味着桌子恰好垂直于重力vector。 我使用下面的公式:

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

在.h

 double accelerationXAverage; double accelerationYAverage; double accelerationZAverage; double accelerationXSum; double accelerationYSum; double accelerationZSum; int readingsCount; 

在他们中

 #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]; } 

我通过平均加速计读数来滤除噪音。 加速度计更新间隔是1/60,现在在试验的时候,我已经让设备坐了10秒钟(所以平均是600个读数)。

这个公式似乎工作,它给了我什么我期望的angular度。 不过,我也期待着,如果我试着把这个装置旋转到不同的静态位置,同时仍然在桌面上,我应该得到相同的答案(相对于重力vector的原因,angular度没有改变) 。 但是,这并不是我得到的结果。 angular度相差几度。

我正在使用正确的公式? 为什么同一个桌面上的不同位置的angular度会有所不同? 这只是错误的边缘?

我已经添加了一个图片(来自http://gotoandplay.freeblog.hu/ ),以确保我正在讨论相同的x轴和z轴。 在这里输入图像说明

你的方法和公式是正确的。

x,y和z是相对于设备的。 理论上,angular度应该是相同的,而与桌面上的装置的angular度位置无关。 然而,这里有几个因素影响精确度,包括在这样一个小angular度上的正则运算。 我build议你尝试一下桌子的倾斜度(不是水平的)。 说,保持你的桌子与地面30度的angular度,并尝试。 我假设你的x,y,z都是双倍的