Quali sono gli intervalli di l'acceleratore su iPhone?
-
05-09-2019 - |
Domanda
Non riesco a trovare alcuna documentazione online su questo, e quello che sto googling mi sta dando un sacco di informazioni contrastanti ...
Soluzione
Gli accelerometri utilizzati nel primo e iPhones seconda generazione (e assumere anche l'iPod touch) operano in due modalità: +/- 2 g, e +/- 8 g. (In realtà, come si osserva, si accelerazioni rapporto un po 'al di fuori campo nominale. La precisione non è spec'ed al di fuori di tale intervallo, però.)
Apple li opera nel +/- 2 g modalità. V'è un compromesso: la corrente risoluzione è nominalmente 0,018 g, secondo la scheda tecnica (anche se la mia usi di iPhone di prima generazione ,018,168604 millions, secondo una versione modificata di AccelerometerGraph). Nel +/- 8 g modalità, la risoluzione sarebbe quattro volte più grossolana.
Presumo Apple ha deciso che il più fine risoluzione sarebbe più utile la gamma più ampia. (Preferisco vedere più fine risoluzione di 0,018 g. Così nessuno di noi è pienamente soddisfatto.)
Non è possibile cambiare la modalità con qualsiasi caratteristica pubblicato delle API. Da transitino accelerazione come doppia, potrebbero teoricamente permettere un cambiamento di modalità, e semplicemente guardare la modalità quando riscalare il valore A / D, prima di riportare l'accelerazione. (Il ovvio posto per impostare la modalità sarebbe nella chiamata che imposta la applicazione per ricevere accelerometro informazioni.) Tuttavia, per le versioni precedenti compatibilità, il sistema operativo dovrebbe impostare la modalità accelerometro a +/- 2 g all'inizio dell'applicazione. E nessuno dei processi in background potrebbe essere permesso di impostare il Modalità accelerometro.
Altri suggerimenti
L'applicazione visualizza aGauge questi dati grezzi provenienti dall'accelerometro come si sposta il dispositivo. Può anche aiutare a trovare la soglia di "flip" per il dispositivo.
ho creato la seguente applicazione per cercare di testare le gamme ...
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];
}
Il problema è che, quando ho ruotare il mio iPod lungo gli assi orizzontale / verticale e quindi capovolgerla, ottengo valori come:
xmin -1,271802
Xmax 1.180959
ymin -1,344477
ymax 1.108285
zmin -2,30713
zmax 2.325581
Se prendo l'iPod e scuoto il heck fuori di esso, ottengo ...
x -2,325581 di 2,307,413 mila
y -2,325581 di 2,307,413 mila
z -2,307413 di 2,325,581 mila
Tutte le idee come si misura?
Il migliore che è venuta in mente è:
asse verticale
x = -1 se inclinato a sinistra (<|)
x = +1 se inclinato tutta la strada a destra (|>)
- dove <è il modo in cui lo schermo sia rivolto, e | è la parte inferiore del iPod
y ~ -1 se lo schermo è rivolto verso, perpendicolare al piano ( "in piedi")
y ~ 1 se rivolto lontano da voi (e testa in giù)