2009-04-06 13 views

Respuesta

5

De iphonedevsdk.com:

Los acelerómetros se utilizan en la primera y los iPhones de segunda generación (y I asumen también los toques del iPod) operan en dos modos: +/- 2 g, y +/- 8 g. (En realidad, a medida que respetado, aceleraciones informe un tanto fuera el rango nominal. La precisión no es spec'ed fuera de ese rango, sin embargo.)

de Apple que funciona en el modo de +/- 2 g . Hay una compensación: la resolución actual de es nominalmente 0.018 g, según la hoja de datos (aunque mi iPhone de primera generación usa 0.018168604, según una versión modificada de AccelerometerGraph). En el modo +/- 8 g, la resolución sería cuatro veces más cruda.

Supongo que Apple decidió que la resolución más fina sería más útil que el rango más amplio. (Prefiero ver más fina 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 las API. Dado que están pasando la aceleración como un doble , podrían teóricamente permitir un cambio en el modo, y simplemente mirar el modo al volver a escalar el valor A/D, antes de informar la aceleración. (El lugar obvio para establecer el modo sería en la convocatoria que establece la aplicación recibir información acelerómetro .) Sin embargo, para mantener la compatibilidad , el sistema operativo tendría que establecer el modo de acelerómetro a +/- 2 g al comienzo de la aplicación. Y ninguno de los procesos en segundo plano podría permitirse establecer el modo de acelerómetro .

1

creé la 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 obtener 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 se inclina hacia la izquierda (< |)

x = 1 si se encuentra inclinado todo el camino a la derecha (|>)

  • donde < es la forma en que se ve la pantalla, y | es la parte inferior del iPod

y ~ -1 si la pantalla está frente a usted, perpendicular al piso ("pie")

y ~ 1 si espaldas a usted (y al revés)

+0

Esto debería estar en otra pregunta –

2

La aplicación aGauge muestra estos datos brutos procedentes del acelerómetro a medida que mueve el dispositivo. También puede ayudarlo a encontrar el umbral de "volteo" para su dispositivo.

Cuestiones relacionadas