Каковы диапазоны работы акселератора на iPhone?
Я, кажется, не могу найти никакой документации в интернете об этом, и то, что я гуглю, дает мне много противоречивой информации...
3 ответа:
Из iphonedevsdk.com :
Акселерометры, используемые в первом и айфоны второго поколения (и я предположим также, что iPod touch) работают в двух режимах: + / - 2 г и + / - 8 г. (На самом деле, как вы заметили, они сообщить об ускорениях несколько снаружи номинальный диапазон. Точность-нет правда, за пределами этого диапазона.)
Яблоко управляет ими в + / - 2 г режим. Существует компромисс: текущий разрешение номинально составляет 0,018 г, согласно справочнику (хотя мой iPhone первого поколения использует 0.018168604, согласно модифицированной версии акселерометра). В Режим + / - 8 g, разрешение будет в четыре раза грубее.
Я предполагаю, что Apple решила, что тоньше разрешение было бы более полезным, чем широкий диапазон. (Я бы предпочел видеть лучше разрешение чем 0.018 g. Так что ни один из нас это полностью устраивает.)
Вы не можете изменить режим с помощью любого опубликованная функция API. С они проходят ускорение как двойной, они теоретически могли бы позволить изменение режима, и просто посмотрите на режим при масштабировании значения A/D, прежде чем сообщить об ускорении. (Этот очевидным местом для установки режима будет в вызове, который устанавливает приложение для получения акселерометра информация.) Однако, для отсталых Совместимость, ОС должна была бы установите режим акселерометра на + / - 2 g в начале приложения. И никакого фона. процессы можно было бы позволить установить режим акселерометра.
Приложение a измерений показывает Это данных, поступающих от акселерометра при перемещении устройства. Он также может помочь вам найти порог" флип " для вашего устройства.
Я создал следующее приложение, чтобы попытаться протестировать диапазоны...
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 вдоль горизонтальной/вертикальной осей, а затем переворачиваю его, я получаю такие значения, как:
Xmin -1.271802
Xmax 1.180959
Ymin -1.344477
Ymax 1.108285
Zmin -2.30713
Zmax 2.325581
Если я возьму айпод и вытряхну из него все дерьмо, я получу...
X -2325581 - 2.307413
Y -2.325581 к 2.307413
Z -2.307413 - 2.325581
Есть идеи, что он измеряет?
Лучшее, что я придумал, это:
Вертикальная ось
X = -1 при наклоне влево (
X = +1 при наклоне вправо ( | > )
- где
Y ~ -1, если экран обращен к вам, перпендикулярно полу ("стоя")
Y ~ 1, если смотреть в сторону от вас (и вверх вниз)