假设iPhone放在一张平台上.我想确定桌面的角度,其中0的角度意味着桌子与重力矢量完全垂直.我使用以下公式:
radians = atanf (z / sqrt (x^2 + y^2)
Run Code Online (Sandbox Code Playgroud)
在.h
double accelerationXAverage;
double accelerationYAverage;
double accelerationZAverage;
double accelerationXSum;
double accelerationYSum;
double accelerationZSum;
int readingsCount;
Run Code Online (Sandbox Code Playgroud)
在他们中
#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];
}
Run Code Online (Sandbox Code Playgroud)
我通过平均加速度计读数来滤除噪音.加速度计更新间隔为1/60,现在在试验时,我让设备静置10秒钟(因此平均有600个读数).
这个公式似乎有用,它给了我关于我期望的角度.但是,我也期待如果我尝试将设备旋转到不同的静态位置,同时仍然平放在桌面上,我应该得到相同的答案(因为相对于重力矢量,角度没有改变) .然而,当我尝试时,这不是我得到的.角度变化几度.
我使用正确的配方?为什么同一桌面上不同位置的角度会有所不同?这只是误差范围吗?
我添加了一张图片(来自http://gotoandplay.freeblog.hu/),以确保我说的是相同的x-y轴和z轴.
你的方法和公式是正确的。
x、y 和 z 是相对于设备的。理论上,无论设备在桌面上的角度位置如何,角度都应该相同。然而,有几个因素会影响这里的准确性,包括如此小的角度下的反正切计算。我建议你尝试一下桌子的倾斜度(不与地面水平)。假设让你的桌子与地面成 30 度角并尝试一下。我假设你的 x,y,z 都是双精度的
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |