5

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/から) 画像を追加しました。ここに画像の説明を入力

4

1 に答える 1

3

あなたのアプローチと公式は正しいです。

x、y、z はデバイスに相対的です。理論的には、テーブル上のデバイスの角度位置に関係なく、角度は同じでなければなりません。ただし、このような小さな角度でのアークタン計算など、ここでの精度に寄与するいくつかの要因があります。テーブルの傾き(地面に対して水平ではない)で試してみることをお勧めします。テーブルを地面から 30 度の角度に保ち、試してみます。あなたのx、y、zはすべて二重になっていると思います

于 2012-04-22T09:38:54.477 に答える