Кажется, я не могу найти какую-либо документацию в Интернете по этому поводу, и то, что я гуглю, дает мне много противоречивой информации...
Какие диапазоны акселератора на айфоне?
Ответы (3)
Акселерометры, используемые в iPhone первого и второго поколения (и я полагаю, что и в iPod touch), работают в двух режимах: +/- 2 g и +/- 8 g. (На самом деле, как вы заметили, они сообщают об ускорении, несколько выходящем за пределы номинального диапазона. Однако точность вне этого диапазона не указана.)
Apple работает с ними в режиме +/- 2 g. Есть компромисс: текущее разрешение номинально составляет 0,018 г, согласно техническому описанию (хотя мой iPhone первого поколения использует 0,018168604, согласно модифицированной версии AccelerometerGraph). В режиме +/- 8 г разрешение было бы в четыре раза грубее.
Я предполагаю, что Apple решила, что более высокое разрешение будет более полезным, чем более широкий диапазон. (Я бы предпочел более высокое разрешение, чем 0,018 г. Так что ни один из нас не полностью удовлетворен.)
Вы не можете изменить режим с любой опубликованной функцией API. Поскольку они передают ускорение как двойное, теоретически они могут разрешить изменение режима и просто посмотреть на режим при изменении масштаба значения аналого-цифрового преобразования, прежде чем сообщать об ускорении. (Очевидным местом для установки режима будет вызов, который настраивает приложение на получение информации об акселерометре.) Однако для обратной совместимости ОС должна установить режим акселерометра на +/- 2 g в начале заявление. И ни одному из фоновых процессов нельзя было позволить установить режим акселерометра.
Приложение aGauge отображает эти необработанные данные, поступающие от акселерометра, когда вы перемещаете устройство. Это также может помочь вам найти порог «переворота» для вашего устройства.
Я создал следующее приложение, чтобы попытаться проверить диапазоны...
UIAccelerometer *objAccelerometer;
UILabel *lblxmin, *lblxmax, *lblymin, *lblymax, *lblzmin, *lblzmax;
UILabel *lblxnow, *lblynow, *lblznow;
float xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0, zmin = 0.0, zmax = 0.0, xnow = 0.0, ynow = 0.0, znow = 0.0;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
//NSLog (@"%f, %f, %f", acceleration.x, acceleration.y, acceleration.z);
xnow = acceleration.x;
ynow = acceleration.y;
znow = acceleration.z;
if (xnow < xmin) { xmin = xnow; }
if (ynow < ymin) { ymin = ynow; }
if (znow < zmin) { zmin = znow; }
if (xnow > xmax) { xmax = xnow; }
if (ynow > ymax) { ymax = ynow; }
if (znow > zmax) { zmax = znow; }
lblxmin.text = [NSString stringWithFormat:@"%f", xmin];
lblymin.text = [NSString stringWithFormat:@"%f", ymin];
lblzmin.text = [NSString stringWithFormat:@"%f", zmin];
lblxmax.text = [NSString stringWithFormat:@"%f", xmax];
lblymax.text = [NSString stringWithFormat:@"%f", ymax];
lblzmax.text = [NSString stringWithFormat:@"%f", zmax];
lblxnow.text = [NSString stringWithFormat:@"%f", xnow];
lblynow.text = [NSString stringWithFormat:@"%f", ynow];
lblznow.text = [NSString stringWithFormat:@"%f", znow];
}
-(void) invokeAccelerometer {
objAccelerometer = [UIAccelerometer sharedAccelerometer];
objAccelerometer.delegate = self;
objAccelerometer.updateInterval = (1.0 / 10.0);
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
lblxmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];
lblxnow = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 100, 40)];
lblxmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 100, 40)];
lblymin = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, 100, 40)];
lblynow = [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 100, 40)];
lblymax = [[UILabel alloc] initWithFrame:CGRectMake(200, 60, 100, 40)];
lblzmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 110, 100, 40)];
lblznow = [[UILabel alloc] initWithFrame:CGRectMake(100, 110, 100, 40)];
lblzmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 110, 100, 40)];
[self.view addSubview:lblxmin];
[self.view addSubview:lblxnow];
[self.view addSubview:lblxmax];
[self.view addSubview:lblymin];
[self.view addSubview:lblynow];
[self.view addSubview:lblymax];
[self.view addSubview:lblzmin];
[self.view addSubview:lblznow];
[self.view addSubview:lblzmax];
[self invokeAccelerometer];
[super viewDidLoad];
}
Проблема в том, что когда я поворачиваю свой iPod по горизонтальной/вертикальной осям, а затем переворачиваю его, я получаю такие значения, как:
хмин -1,271802
хмакс 1.180959
yмин -1,344477
умакс 1.108285
zмин -2,30713
змакс 2.325581
Если я возьму айпод и вытряхну из него к чертям собачьим, я получу...
x -2.325581 to 2.307413
y -2.325581 to 2.307413
z -2.307413 to 2.325581
Есть идеи, что он измеряет?
Лучшее, что я придумал, это:
вертикальная ось
x = -1 при наклоне влево ( ‹| )
x = +1 при полном наклоне вправо ( |> )
- где ‹ — это направление экрана, а | это нижняя часть iPod
y ~ -1, если экран обращен к вам, перпендикулярно полу ("стоя")
y ~ 1, если смотреть от себя (и вверх ногами)