Quelles sont les plages de l'accélérateur sur l'iPhone?
-
05-09-2019 - |
Question
Je ne peux pas sembler trouver une documentation en ligne à ce sujet, et ce que je suis googler me donne beaucoup d'informations contradictoires ...
La solution
De iphonedevsdk.com :
Les accéléromètres utilisés dans la première et un second iPhones génération (I et Supposons également l'iPod touch) fonctionnent selon deux modes: +/- 2 g, et +/- 8 g. (En fait, comme vous avez observé, ils accélérations rapport un peu en retrait la plage nominale. La précision est pas doté de caractéristiques techniques en dehors de cette plage, si.)
Apple les exploite dans le +/- 2 g mode. Il y a un compromis entre: Le courant résolution est nominalement 0,018 g, selon la fiche technique (bien que mon première génération utilise iPhone 0,018168604, selon une version modifiée de AccelerometerGraph). dans le +/- en mode 8 g, la résolution serait quatre fois plus grossière.
Je suppose que Apple a décidé que le plus fin la résolution serait plus utile que la gamme plus large. (Je préfère voir plus fin résolution de 0,018 g. Donc, ni de nous est pleinement satisfait.)
Vous ne pouvez pas changer le mode avec tout fonction publié des API. Puisque ils passent l'accélération en tant que double, ils pourraient théoriquement permettre un changement de mode, et regardez simplement le mode à remettre à l'échelle la valeur A / D, avant l'accélération des rapports. (Le endroit évident pour définir le mode serait dans l'appel qui met en place la application à recevoir l'accéléromètre informations). Cependant, pour l'arrière la compatibilité, le système d'exploitation devrait régler le mode d'accéléromètre à +/- 2 g au début de l'application. Et aucun des processus d'arrière-plan pourrait être autorisé à régler la mode accéléromètre.
Autres conseils
Les applications aGauge affiche ces données brutes provenant de l'accéléromètre que vous vous déplacez l'appareil. Il peut également vous aider à trouver le seuil « flip » pour votre appareil.
J'ai créé l'application suivante pour essayer de tester les plages ...
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];
}
Le problème est, quand je tourne mon iPod le long des axes horizontal / vertical, puis retournez-, je reçois des valeurs telles que:
xmin -1,271802
Xmax 1.180959
ymin -1,344477
ymax 1.108285
zmin -2,30713
zmax 2.325581
Si je prends l'iPod et secouer le diable hors de lui, je reçois ...
x -2,325581 à 2,307413
y -2,325581 à 2,307413
z -2,307413 à 2,325581
Toutes les idées ce qu'il mesure?
Le meilleur que je suis venu avec est:
axe vertical
x = -1 si incliné vers la gauche (<|)
x = 1, si incliné tout le chemin vers la droite (|>)
- où
y ~ -1 si l'écran est face à vous, perpendiculaire au sol ( "debout")
y ~ 1 si éloigné de vous (et à l'envers)