¿Cuáles son los rangos del acelerador en el iPhone?
-
05-09-2019 - |
Pregunta
Me parece que no puede encontrar ninguna documentación en línea sobre esto, y lo que estoy buscando en Google me está dando una gran cantidad de información contradictoria ...
Solución
Los acelerómetros utilizados en la primera y iPhones de segunda generación (y I asume también el iPod touch) operar en dos modos: +/- 2 g, y +/- 8 g. (En realidad, como se observó, que aceleraciones informe un tanto fuera el rango nominal. La precisión no es spec'ed fuera de ese rango, aunque.)
Apple ellos opera en el +/- 2 g modo. Hay una compensación: La corriente resolución es nominalmente 0,018 g, de acuerdo con la hoja de datos (aunque mi usos del iPhone de primera generación 0,018168604, de acuerdo con una versión modificada de AccelerometerGraph). En el +/- 8 modo g, la resolución sería cuatro veces más cruda.
Asumo Apple decidió que el más fino resolución sería más útil que el rango más amplio. (Prefiero ver más fino resolución de 0.018 g. Así que ninguno de nosotros es totalmente satisfecho.)
No se puede cambiar el modo con cualquier característica publicada de los APIs. Ya que están pasando aceleración como una doble, que podrían permitir teóricamente un cambio en el modo, y simplemente mira el modo cuando reescalado el valor A / D, antes de informar de aceleración. (Los lugar obvio para establecer el modo sería en la convocatoria que establece la solicitud para recibir acelerómetro información.) Sin embargo, para retroceder compatibilidad, el sistema operativo tendría que establecer el modo de acelerómetro a +/- 2 g al inicio de la aplicación. Y ninguno de los procesos en segundo plano podría ser permitido para establecer el modo de acelerómetro.
Otros consejos
Las pantallas de aplicaciones aGauge estos datos en bruto procedentes del acelerómetro al mover el dispositivo. También puede ayudar a encontrar el umbral "flip" para su dispositivo.
He creado el siguiente aplicación para tratar de poner a prueba los rangos ...
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];
}
El problema es que cuando puedo girar mi iPod a lo largo de los ejes horizontal / vertical y luego darle la vuelta, me valores como:
xmin -1.271802
xmax 1.180959
ymín -1.344477
ymáx 1.108285
zmín -2.30713
zmáx 2.325581
Si tomo el iPod y agitar el heck fuera de él, lo entiendo ...
x -2,325581-2,307413
y -2,325581-2,307413
z -2,307413-2,325581
Alguna idea de lo que está midiendo?
El mejor que he llegado con es:
eje vertical
x = -1 si inclinada hacia la izquierda (<|)
x = 1 si se encuentra inclinado todo el camino a la derecha (|>)
- donde
y ~ -1 si la pantalla está hacia arriba, perpendicular al piso ( "pie")
y ~ 1 si espaldas a usted (y al revés)