Quindi sono abbastanza nuovo per CoreMotion. Darò il mio colpo migliore per spiegare perché quello che chiedi non può essere fatto, almeno non in modo accurato.
Sulla base del Mela Docs ho letto, ci sono 3 gestori di movimento per iOS:
- accelerometro
- giroscopio
- Magnetometro
(credo che i dispositivi più recenti hanno un altimetro ?)
Sulla base della mia comprensione della fisica, ho raccolto quell'accelerometro che Sarebbe molto utile per il tuo scenario, dato che il giroscopio e il magnetometro sono più focalizzati sulla rotazione. Ho fatto qualche ricerca e ho trovato this book. In particolare il capitolo 9.5. Dal libro:
Mentre un accelerometro fornisce misurazione delle forze nelle direzioni x, ye z assi non può misurare rotazioni. D'altra parte, un giroscopio è un dispositivo di velocità di cambiamento; mentre il telefono ruota intorno a un asse, lo consente di misurare la modifica di tali rotazioni.
seguito il proprio codice in figura 9-5 per l'attuazione di una semplice applicazione per guardare l'accelerazione:
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface ViewController : UIViewController {
CMMotionManager *motionManager;
NSOperationQueue *queue;
}
@property (weak, nonatomic) IBOutlet UILabel *xLabel;
@property (weak, nonatomic) IBOutlet UILabel *yLabel;
@property (weak, nonatomic) IBOutlet UILabel *zLabel;
@property (weak, nonatomic) IBOutlet UIProgressView *xBar;
@property (weak, nonatomic) IBOutlet UIProgressView *yBar;
@property (weak, nonatomic) IBOutlet UIProgressView *zBar;
@end
Poi nel .m viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
motionManager = [[CMMotionManager alloc] init];
motionManager.accelerometerUpdateInterval = 1.0/10.0; // Update at 10Hz
if (motionManager.accelerometerAvailable) {
NSLog(@"Accelerometer avaliable");
queue = [NSOperationQueue currentQueue];
[motionManager startAccelerometerUpdatesToQueue:queue
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
CMAcceleration acceleration = accelerometerData.acceleration;
xLabel.text = [NSString stringWithFormat:@"%f", acceleration.x];
xBar.progress = ABS(acceleration.x);
yLabel.text = [NSString stringWithFormat:@"%f", acceleration.y];
yBar.progress = ABS(acceleration.y);
zLabel.text = [NSString stringWithFormat:@"%f", acceleration.z];
zBar.progress = ABS(acceleration.z);
}];
}
}
Dopo aver collegato tutto installato e funzionante Al telefono, vedo che l'accelerometro misura i cambiamenti del mio telefono accelerando e decelerando mentre lo spostamento su un tavolo piatto. Ora abbiamo l'accelerazione, ma per ottenere il cambio di posizione (che è quello che hai chiesto) da quello richiede una doppia integrazione (es. Calcolo divertente). Mentre fattibile, ho cercato su cosa hanno da dire le persone competenti su arduino su questo here e ragazzo è una notizia triste. (Non stanno discutendo l'accelerometro di iPhone, ma ho estrapolato che questa informazione si applica anche a questa domanda).
Le parti rilevanti che ho postato qui:
Ottenere posizione da accelerazione è una doppia integrazione, in modo da l'errore StackUp è davvero male. Ottenere buoni dati di posizione con un IMU imbullonato verso il basso (cosa si sta tentando di fare) è un problema veramente difficile; il tipo di accelerometro necessario per farlo è molto costoso.
e
cosa si sta parlando è doppia integrazione, che è semplicemente troppo imprecise con un singolo accelerometro su questo hardware. Anche l'integrazione singola avrà un errore crescente per unità di tempo semplicemente a causa di la mancanza di precisione in questa configurazione.
Tutte queste ricerche che conduce fino alla mia conclusione che non è fattibile su un iPhone per fare ciò che si chiede. Anche se come ho detto, anche io sono un principiante! Scusa se questa non è la risposta che volevi sentire.
Ripensamento: potresti ottenere risultati migliori usando la fotocamera frontale e utilizzare l'analisi delle immagini per ricavare il movimento dell'immagine del soffitto ... – fishinear
Ho pensato di usare la fotocamera posteriore, ma questo costringerebbe l'utente a utilizzare custodie per iPhone (altrimenti l'obiettivo è troppo vicino). Grazie per questo post. Ieri ho scoperto la doppia integrazione e me ne occuperò io. Questa mi sembra la risposta più preziosa. Ti farò sapere gli effetti. Grazie! –