Получить плоскость устройства относительно плоскости земли с помощью акселерометра

Допустим, 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 показаний ).

Эта формула работает, она дает мне представление о том, чего я ожидал. Однако я также ожидаю, что если я попытаюсь сделать это с устройством, повернутым в другое статическое положение, оставаясь при этом лежащим на столе, я получу тот же ответ (, потому что относительно вектора гравитации угол не изменился. изменен ). Однако это не то, что я получаю, когда пробую это. Углы различаются на пару градусов.

Я использую правильную формулу? Почему угол может различаться для разных мест на одной и той же столешнице? Это просто погрешность?

Я добавил изображение (из http://gotoandplay.freeblog.hu/), чтобы убедиться, что я говорю об одних и тех же осях x -, y -и z -.enter image description here

5
задан Eric D'Souza 28 March 2013 в 23:26
поделиться