Ho un'app che registra gli angoli mentre l'utente sta camminando intorno a un oggetto, mentre punta il dispositivo (preferibilmente) al centro dell'oggetto. L'angolo viene ripristinato sul comando dell'utente, quindi l'atteggiamento di riferimento viene ripristinato.Cambio di posizione - angolo e problema dell'asse - matematica quaternion
con angoli di Eulero produce blocco del giunto cardanico, così Attualmente sto usando quaternioni e calcolando gli angoli in questo modo:
double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f;
Questa emana buona precisione e funziona perfettamente IF beccheggio e imbardata del dispositivo non cambia. In altre parole, quando l'angolo mostra 360 gradi, finisco nello stesso punto in cui inizia il cerchio.
Problema 1: se l'imbardata e l'altezza del dispositivo cambiano leggermente (l'utente non punta direttamente al centro dell'oggetto), lo stesso vale per l'angoloFromLastPosition. Capisco questa parte, poiché la mia formula dell'angolo mostra solo l'angolo tra due atteggiamenti del dispositivo nello spazio 3D.
Scenario:
- ho segnare l'inizio di atteggiamento rotazione e iniziare a muoversi in cerchio attorno all'oggetto mentre si punta il centro
- mi fermo a, diciamo, 45 gradi e variazione del passo del dispositivo puntandolo più in alto o più in basso. L'angolo cambia di conseguenza.
- Quello che mi piacerebbe vedere è: l'angolo rimane a 45 gradi, anche se il pitch o l'imbardata cambiano.
Domanda 1: come posso calcolare solo il rotolo del dispositivo utilizzando i quaternioni e ignorare le modifiche negli altri due assi (almeno entro un numero ragionevole di gradi).
Problema 2: se si ruota per un po 'e poi si blocca completamente il dispositivo (sul treppiede quindi non c'è alcun tipo di tremolio), l'angoloFromLastPosition si sposta a una velocità di 1 grado per circa 10-20 secondi, e non appare essere lineare. In altre parole, all'inizio scorre rapidamente, quindi rallenta considerevolmente. A volte non ho alcuna deriva - l'angolazione è solida come una roccia se il dispositivo è fermo. E questo mi fa perdere la comprensione di cosa sta succedendo.
Domanda 2, cosa sta succedendo qui e come posso occuparmi della deriva?
Ho passato un bel po 'di articoli e tutorial, e la matematica del quaternion è al di fuori di me al momento, spero che qualcuno possa aiutarmi con un suggerimento, un collegamento o poche righe di codice.
può essere legato a [Drifting Yaw] (http://stackoverflow.com/questions/13613239/drifting-yaw-angle-after-moving-fast?rq=1)? in caso affermativo, la ricerca di una formula per la domanda 1 si occuperà di entrambi i problemi :) –
Se si utilizza CMAttitude, esiste un motivo particolare per cui non è possibile utilizzare daLastPositionAttitude.roll per ottenere il risultato del dispositivo? Apprezzo che questo non stia usando la proprietà quaternion, ma è lì da usare! –
sì, iniziato con quello - utilizzando angoli euler produce un blocco cardanico e perdita di gradi di libertà. la rotazione completa non è di 360 gradi quando il dispositivo non è allineato con l'asse Z. almeno questa è la mia comprensione dell'effetto .... –