iPhone が平らなテーブルに置かれているとします。角度 0 は、テーブルが重力ベクトルに対して正確に垂直であることを意味します。次の式を使用しています。
radians = atanf (z / sqrt (x^2 + y^2)
.h で
double accelerationXAverage;
double accelerationYAverage;
double accelerationZAverage;
double accelerationXSum;
double accelerationYSum;
double accelerationZSum;
int readingsCount;
.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];
}
加速度計の読み取り値を平均化してノイズを除去しています。加速度計の更新間隔は 1/60 で、今のところ実験中、デバイスを 10 秒間放置しました (つまり、平均 600 の読み取り値です)。
この式は機能しているように見え、期待するものについての角度が得られます。ただし、テーブル上で平らな状態でデバイスを別の静的位置に回転させてこれを試してみると、同じ答えが得られるはずです(重力ベクトルに対して角度が変化していないため)。 . しかし、それは私が試してみると得られるものではありません。角度は数度異なります。
正しい数式を使用していますか? 同じ天板でも配置によって角度が異なるのはなぜですか? 誤差の範囲だけですか?
同じ x-y-および z-軸について話していることを確認するために、 ( http://gotoandplay.freeblog.hu/から) 画像を追加しました。