Допустим, 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 -.