2012-04-21 4 views
5

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

に.H

double  accelerationXAverage; 
double  accelerationYAverage; 
double  accelerationZAverage; 

double  accelerationXSum; 
double  accelerationYSum; 
double  accelerationZSum; 
int   readingsCount; 

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

:私は、次の式を使用しています。加速度計の更新間隔は1/60で、実験中にはデバイスを10秒間置くようにしました(したがって、平均600回の読み値です)。

この式はうまくいくように見えますが、それは私に期待していたことについての角度を与えてくれます。しかし、私はまた、私はデバイスが静的な位置に回転してこれをしようとすると、机の上にまだフラットな、私は同じ答え(重力ベクトルに相対的な理由は、角度が変更されていない) 。しかし、それは私が試してみるときに得られるものではありません。角度は数度変化します。

私は正しい式を使用していますか?同じ卓上のさまざまなプレースメントでアングルが異なるのはなぜですか?それは単なる誤差のマージンですか?

画像を追加しました(http://gotoandplay.freeblog.hu/)ので、同じx-y軸とz軸について話しています。 enter image description here

+0

kThresholdMovementHigh.Whatでエラーが発生しています。 – srinadh

+0

kThresholdMovementHighは単なる定数です。しきい値の下には「ノイズ」、つまり無視する動きがあります。スレッショルドの上には、ユーザーが意図的に移動するように処理したいムーブメントがあります。 #defineを含めるように質問を更新しました。あなたのアプリに最適なものを判断する必要があります。 –

答えて

3

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

x、y、zはデバイスに関連しています。理論的には、テーブルトップ上の装置の角度位置に関係なく、角度は同じでなければならない。しかし、このような小さい角度でのarctan計算を含む、ここでの精度に寄与するいくつかの要因があります。私はテーブルの傾き(地面に水平ではない)で試してみることをお勧めします。テーブルを地面から30度の角度にして試してみてください。あなたのx、y、zはすべて二重であると仮定します。

+0

提案していただきありがとうございます。私は大きな傾きでそれを試しました。絶対差はほぼ同じですが(〜1度)、誤差の割合が大きいほど傾きが大きいほど重要ではありません。私はフロートとしてx、y、zを持っていました。私は二重に変わった。 –

+0

もう少し実験した後、私はそれがちょうどエラーのマージンだと思う。私は同じ位置でiPhoneを使って複数のテストを行い、角度は0.5度変化しました。 (私は最初に精度をチェックしたはずです!)。あなたが正しいです、精度の欠如は、小さな角度で数学ではるかに顕著です。 –

関連する問題