Was sind die Bereiche des Beschleunigers auf dem iPhone?
-
05-09-2019 - |
Frage
Ich kann keine Dokumentation online über diese scheinen zu finden, und was ich googeln ist mir eine Menge widersprüchliche Informationen geben ...
Lösung
Das Beschleunigungsmesser in dem ersten verwendet und zweite Generation iPhones (und I nehmen auch der iPod touch) betreibt in zwei Modi: +/- 2 g und +/- 8 g. (Tatsächlich, wie man beobachtet, sie Bericht Beschleunigungen etwas außerhalb der Nennbereich. Die Genauigkeit ist nicht obwohl außerhalb dieses Bereichs spec'ed.)
Apple-arbeitet sie in der +/- 2 g Modus. Es ist ein Kompromiss: Die aktuelle Auflösung von nominell 0,018 g, nach dem Datenblatt (obwohl meine erste Generation iPhone Anwendungen 0,018168604, nach einer modifizierten Version von AccelerometerGraph). In dem +/- 8 g Modus würde die Auflösung viermal gröber sein.
Ich gehe davon aus, dass Apple-feineren entschieden Auflösung wäre nützlicher als der breitere Bereich. (Ich würde eher feinere sehen Auflösung als 0,018 g. Also weder von wir sind voll zufrieden.)
Sie können den Modus nicht bei jeder Änderung veröffentlicht Merkmal der APIs. Schon seit sie geben Beschleunigung als Doppel, könnten sie theoretisch erlauben eine Änderung im Modus, und sieht einfach auf wenn der Modus Neuskalierung des A / D-Wert, vor einer Beschleunigung berichten. (Das offensichtlich Ort, um den Modus zu setzen wäre in dem Ruf, der nach oben setzt die Anwendungsbeschleunigungsmesser zu erhalten Information.) Aber für Rückwärts Kompatibilität würde das Betriebssystem gesetzt den Beschleunigungsmesser-Modus 2 g bis +/- zu Beginn der Anwendung. Und keiner der Hintergrundprozesse könnte erlaubt das einstellen Beschleunigungsmesser-Modus.
Andere Tipps
Die aGauge App zeigt diese Rohdaten von dem Beschleunigungsmesser kommen, wie Sie das Gerät bewegen. Es können Sie auch die „Flip“ Schwelle für Ihr Gerät finden.
Ich habe die folgende Anwendung, um zu versuchen, die Bereiche zu testen ...
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];
}
Das Problem ist, wenn ich meinen iPod entlang der horizontalen / vertikalen Achsen drehen und es dann umdrehen, ich Werte wie:
xmin -1,271802
xmax 1.180959
ymin -1,344477
ymax 1.108285
zmin -2,30713
zmax 2.325581
Wenn ich den iPod nehmen und schütteln das Heck aus, ich bekommen ...
x -2,325581 bis 2,307413
y -2,325581 auf 2,307413
z -2,307413 auf 2,325581
Alle Ideen, was es messen?
Das Beste, was ich habe kommen mit ist:
vertikale Achse
x = -1, wenn nach links geneigt (<|)
x = 1, wenn gekippt den ganzen Weg nach rechts (|>)
- , wobei
y ~ -1, wenn Bildschirm zu Ihnen zeigt, senkrecht zum Boden ( "Aufstehen")
y ~ 1, wenn mit Blick weg von Ihnen (und auf dem Kopf)