Perché i quaternioni vengono utilizzati per le rotazioni?


107

Sono un fisico, ho imparato un po 'di programmazione e ho incontrato molte persone che usano i quaternioni per le rotazioni invece di scrivere cose in forma matrice / vettoriale.

In fisica, ci sono ottime ragioni per cui non usiamo i quaternioni (nonostante la bizzarra storia che viene occasionalmente raccontata su Hamilton / Gibbs / ecc.). La fisica richiede che le nostre descrizioni abbiano un buon comportamento analitico (questo ha un significato definito con precisione, ma in alcuni modi piuttosto tecnici che vanno ben oltre ciò che viene insegnato nelle normali classi introduttive, quindi non entrerò nei dettagli). Si scopre che i quaternioni non hanno questo comportamento piacevole, quindi non sono utili, e i vettori / matrici sì, quindi li usiamo.

Tuttavia, limitatamente alle rotazioni rigide e alle descrizioni che non utilizzano alcuna struttura analitica, le rotazioni 3D possono essere descritte in modo equivalente in entrambi i modi (o in pochi altri modi).

In generale, vogliamo solo una mappatura di un punto X = (x, y, z) con un nuovo punto X '= (x', y ', z') soggetto al vincolo che X 2 = X ' 2 . E ci sono molte cose che lo fanno.

Il modo ingenuo è disegnare semplicemente i triangoli che questo definisce e usare la trigonometria, o usare l'isomorfismo tra un punto (x, y, z) e un vettore (x, y, z) e la funzione f (X) = X 'e una matrice MX = X ', o usando i quaternioni, o proiettando fuori componenti del vecchio vettore lungo quello nuovo usando qualche altro metodo (x, y, z) T. (a, b, c) (x', y ', z '), ecc.

Da un punto di vista matematico, queste descrizioni sono tutte equivalenti in questa impostazione (come un teorema). Hanno tutti lo stesso numero di gradi di libertà, lo stesso numero di vincoli, ecc.

Allora perché i quaternioni sembrano preferiti ai vettori?

I soliti motivi che vedo non sono il blocco del gimbal o problemi numerici.

L'argomento del blocco del gimbal non sembra strano, poiché questo è solo un problema di angoli di eulero. È anche solo un problema di coordinate (proprio come la singolarità a r = 0 in coordinate polari (lo Jacobiano perde rango)), il che significa che è solo un problema locale e può essere risolto cambiando le coordinate, ruotando fuori dalla degenerazione, o utilizzando due sistemi di coordinate sovrapposti.

Sono meno sicuro dei problemi numerici, dal momento che non so in dettaglio come sarebbero implementati entrambi (e qualsiasi alternativa). Ho letto che ri-normalizzare un quaternione è più facile che farlo per una matrice di rotazione, ma questo è vero solo per una matrice generale; una rotazione ha vincoli aggiuntivi che banalizzano questo (che sono incorporati nella definizione di quaternioni) (In effetti, questo deve essere vero poiché hanno lo stesso numero di gradi di libertà).

Allora qual è la ragione per l'uso di quaternioni su vettori o altre alternative?


2
La cosa "no gimbal lock" è comunque una bugia. Hai lo stesso problema di blocco del gimbal che hai con gli angoli di Eulero se usi due rotazioni ortogonali con un quaternione. Solo non hai problemi per una singola rotazione poiché è 1 operazione, non 3.
Damon

2
@ Damon Questo non è completamente vero. Vedi mathoverflow.net/a/95908/97344
plasmacel

Risposte:


61

Il blocco del giunto cardanico è uno dei motivi, anche se come dici tu è solo un problema con gli angoli di Eulero ed è facilmente risolvibile. Gli angoli di Eulero vengono ancora utilizzati quando la memoria è un problema poiché è necessario memorizzare solo 3 numeri.

Per i quaternioni rispetto a una matrice di rotazione 3x3, il quaternione ha il vantaggio in termini di dimensioni (4 scalari contro 9) e velocità (la moltiplicazione dei quaternioni è molto più veloce della moltiplicazione di matrice 3x3).

Notare che tutte queste rappresentazioni delle rotazioni vengono utilizzate nella pratica. Gli angoli di Eulero usano la minima memoria; le matrici usano più memoria ma non soffrono di Gimbal lock e hanno buone proprietà analitiche; e quaternioni raggiungono un buon equilibrio di entrambi, essendo leggeri, ma privi di blocco Gimbal.


Ma una matrice di rotazione non ha così tanti componenti indipendenti: è vincolata. Una rotazione bidimensionale è specificata da tre coordinate in tre dimensioni, indipendentemente dalla rappresentazione. Le matrici hanno più componenti in generale perché possono fare di più delle rotazioni. Ma nel caso delle rotazioni i componenti extra sono determinati in termini di altri.
JMP

1
@JMP: hai ragione. Molte persone "comprimono" la matrice in modo da memorizzare solo le informazioni necessarie, ma una matrice compressa è più difficile da gestire, quindi perdi le prestazioni. Si tratta di compromessi in termini di memoria e prestazioni.
Peter Alexander

10
Tuttavia, le routine di moltiplicazione di matrici standard @JMP richiedono tutti e 9 i valori. Anche se solo 3 di loro sono indipendenti, ci vogliono comunque 9 numeri di memoria quando vai a fare effettivamente i conti (di nuovo, se stai effettivamente facendo la moltiplicazione di matrici nel computer).
David Z

1
"La moltiplicazione dei quaternioni è molto più veloce della moltiplicazione della matrice 3x3" Davvero? La rotazione dei quaternioni richiede 24 operazioni add / mul (a causa di due operazioni su prodotti incrociati e supplementari), la matrice 3x3 richiede solo 15 operazioni add / mul.
Marat Buharov

Può usare solo 2 vettori (6 float) per rappresentare totalmente un orientamento 3D, il 3 ° vettore è solo una croce. Un vantaggio delle matrici è che sono già in una forma pronta per essere utilizzata per molte applicazioni. Euler e Quats richiedono entrambi il confezionamento (dalla matrice) e il disimballaggio (alla matrice), il che richiede un'elaborazione extra. Eulero e Quats possono essere utili per l'archiviazione compatta a lungo termine.
user3015682

39

In fisica, ci sono ottime ragioni per cui non usiamo i quaternioni (nonostante la bizzarra storia che viene occasionalmente raccontata su Hamilton / Gibbs / ecc.). La fisica richiede che le nostre descrizioni abbiano un buon comportamento analitico (questo ha un significato definito con precisione, ma in alcuni modi piuttosto tecnici che vanno ben oltre ciò che viene insegnato nelle normali classi introduttive, quindi non entrerò nei dettagli). Si scopre che i quaternioni non hanno questo comportamento piacevole, quindi non sono utili, e i vettori / matrici sì, quindi li usiamo.

Beh, anch'io sono un fisico. E ci sono alcune situazioni in cui i quaternioni oscillano semplicemente! Armoniche sferiche per esempio. Hai due atomi che si disperdono, scambiando un elettrone: qual è il trasferimento di spin orbitale? Con i quaternioni è solo la moltiplicazione, cioè la somma degli esponenti delle funzioni di base SH espresse come quaternioni. (Portare i polinomi di Legendre in notazione quaternionica è un po 'noioso però).

Ma sono d'accordo, non sono uno strumento universale, e specialmente nella meccanica del corpo rigido sarebbero molto ingombranti da usare. Tuttavia, per citare la risposta di Bertrand Russell alla domanda di uno studente su quanta matematica un fisico deve sapere: "Quanto più possibile!"

Comunque: perché amiamo i quaternioni nella computer grafica? Perché hanno una serie di proprietà interessanti. Per prima cosa è possibile interpolarli bene, il che è importante se si animano oggetti rotanti, come gli arti attorno a un'articolazione. Con un quaternione è solo moltiplicazione scalare e normalizzazione. Esprimere questo con una matrice richiede la valutazione di sin e cos, quindi la costruzione di una matrice di rotazione. Quindi moltiplicare un vettore per un quaternione è ancora più economico in quanto passare attraverso una moltiplicazione completa della matrice vettoriale, è anche ancora più economico se si aggiunge una traduzione in seguito. Se consideri un sistema di animazione scheletrico per un personaggio umano, dove si devono valutare molte traslazioni / rotazioni per un gran numero di vertici, questo ha un impatto enorme.

Un altro piacevole effetto collaterale dell'uso dei quaternioni è che qualsiasi trasformazione è intrinsecamente ortonormale. Con le matrici di traduzione è necessario ri-ortonormalizzare ogni coppia di passaggi dell'animazione, a causa di errori numerici di arrotondamento.


1
Hai un riferimento per armoniche sferiche / polinomi di Legendre con quaternioni? Sto per inviare un documento che tratta argomenti correlati e mi piacerebbe vedere (essere in grado di citare) altri lavori su questo.
Mike

4
@Mike: Fuori di testa, purtroppo niente di pubblicato. Sfortunatamente i quaternioni sono ancora piuttosto oscuri per i fisici. Me lo ricordo solo perché il mio tutor di Quantum Mechanic 2 ne ha fatto un esercizio e ne sono rimasto senza parole. Quello che abbiamo fatto essenzialmente è stato usare il termine exp ((a · iω + b · jθ + c · kη + d) r), dove r stessa era una variabile complessa. Se si traccia questo si ottiene una distribuzione tridimensionale (abbiamo dovuto sviluppare prima la serie esponenziale rispetto a una variabile di quaternione). Ciò consente di eseguire una trasformazione "Fourier", risultante in qualcosa che potresti trasformare nei termini SH conosciuti.
datenwolf

31

L'argomento del blocco del gimbal non sembra strano, poiché questo è solo un problema di angoli di eulero. È anche solo un problema di coordinate (proprio come la singolarità a r = 0 in coordinate polari (lo Jacobiano perde rango)), il che significa che è solo un problema locale e può essere risolto cambiando le coordinate, ruotando fuori dalla degenerazione, o utilizzando due sistemi di coordinate sovrapposti.

Molte applicazioni 3D come l'utilizzo degli angoli di Eulero per definire l'orientamento di un oggetto. Per i simulatori di volo in particolare, rappresentano un modo teoricamente utile per memorizzare l'orientamento in un modo facilmente modificabile.

Dovresti anche essere consapevole che cose come "cambiare le coordinate, ruotare fuori dalla degenerazione o usare due sistemi di coordinate sovrapposti" richiedono tutti uno sforzo. Sforzo significa codice. E il codice significa prestazioni. Perdere le prestazioni quando non si dispone di non è una buona cosa per molte applicazioni 3D. Dopotutto, cosa si guadagna da tutti questi trucchi, se il solo uso dei quaternioni ti desse tutto ciò di cui hai bisogno.

Sono meno sicuro dei problemi numerici, dal momento che non so in dettaglio come sarebbero implementati entrambi (e qualsiasi alternativa). Ho letto che ri-normalizzare un quaternione è più facile che farlo per una matrice di rotazione, ma questo è vero solo per una matrice generale; una rotazione ha vincoli aggiuntivi che banalizzano questo (che sono incorporati nella definizione di quaternioni) (In effetti, questo deve essere vero poiché hanno lo stesso numero di gradi di libertà).

I problemi numerici emergono quando si ha a che fare con più rotazioni consecutive di un orientamento. Immagina di avere un oggetto nello spazio. E ogni timeslice, applichi un piccolo cambio di imbardata ad esso. Dopo ogni modifica, è necessario normalizzare nuovamente l'orientamento; altrimenti, i problemi di precisione si insinueranno e rovineranno le cose.

Se usi matrici, ogni volta che esegui la moltiplicazione di matrici, devi ri-ortonormalizzare la matrice. La matrice che stai ortonormalizzando non è ancora una matrice di rotazione, quindi non sarei troppo sicuro di quella facile ortonormalizzazione. Tuttavia, posso essere sicuro di questo:

Non sarà veloce come una normalizzazione vettoriale 4D. Questo è ciò che usano i quaternioni per normalizzarsi dopo rotazioni successive.

La normalizzazione del quaternione è economica. Anche la normalizzazione della matrice di rotazione specializzata non sarà come economica. Ancora una volta, le prestazioni contano.

C'è anche un altro problema che le matrici non risolvono facilmente: l'interpolazione tra due diversi orientamenti.

Quando hai a che fare con un personaggio 3D, spesso hai una serie di trasformazioni che definiscono la posizione di ogni osso nel personaggio. Questa gerarchia di ossa rappresenta il personaggio in una particolare posa.

Nella maggior parte dei sistemi di animazione, per calcolare la posa di un personaggio in un determinato momento, si interpola tra le trasformazioni. Ciò richiede l'interpolazione delle trasformazioni corrispondenti.

L'interpolazione di due matrici è ... non banale. Almeno, è se vuoi qualcosa che assomigli a una matrice di rotazione alla fine. Dopotutto, lo scopo dell'interpolazione è produrre qualcosa a metà strada tra le due trasformazioni.

Per i quaternioni, tutto ciò di cui hai bisogno è una lerp 4D seguita da una normalizzazione. Questo è tutto: prendi due quaternioni e interpola linearmente i componenti. Normalizza il risultato.

Se vuoi un'interpolazione di qualità migliore (ea volte lo fai), puoi far risaltare la lerp sferica . Ciò fa sì che l'interpolazione si comporti meglio per orientamenti più disparati. Questa matematica è molto più difficile e richiede più operazioni per le matrici rispetto ai quaternioni.


7

Opinione: I quaternioni sono carini.

Matrice di rotazione: svantaggio minore : la moltiplicazione delle matrici è ~ 2 volte più lenta dei quaternioni. Vantaggio minore : la moltiplicazione del vettore matrice è ~ 2 volte più veloce e grande. Enorme svantaggio : normalizzazione! Ghram-Shmit è asimmetrico, il che non fornisce una risposta accurata di ordine superiore quando si eseguono equazioni differenziali. I metodi più sofisticati sono molto complessi e costosi.

Asse (angolo = lunghezza dell'asse) Vantaggio minore : piccolo. Svantaggio moderato : la moltiplicazione e l'applicazione a un vettore sono lente con trig. Svantaggio moderato : singolarità del polo nord alla lunghezza = 2 * pi, poiché tutte le direzioni degli assi non fanno nulla. Più codice (e debug) per ridimensionarlo automaticamente quando si avvicina a 2pi.


5

In generale, vogliamo solo una mappatura di un punto X = (x, y, z) con un nuovo punto X '= (x', y ', z') soggetto al vincolo che X ^ 2 = X '^ 2. E ci sono molte cose che lo fanno.

Noi assolutamente non solo vogliamo. C'è una sottigliezza molto importante che a molte persone manca . La costruzione di cui parli (disegna i triangoli e usa il trigonometrico, ecc.) Ruoterà correttamente un vettore nell'altro. Ma ci sono infinite rotazioni che lo faranno. In particolare, posso venire dopo che hai eseguito la rotazione e quindi ruotare l'intero sistema attorno al vettore X '. Ciò non cambierà affatto la posizione di X '. La combinazione della tua rotazione e della mia è equivalente a un'altra singola rotazione (poiché le rotazioni formano un gruppo ). In generale, è necessario essere in grado di rappresentare tale rotazione.

Si scopre che puoi farlo solo con un vettore. (Questa è la rappresentazione dell'angolo dell'asse delle rotazioni .) Ma combinare le rotazioni nella rappresentazione dell'angolo dell'asse è difficile. I quaternioni lo rendono facile, insieme a molte altre cose. Fondamentalmente, i quaternioni hanno tutti i vantaggi di altre rappresentazioni e nessuno degli svantaggi. (Anche se ammetto che potrebbero esserci applicazioni specifiche per le quali qualche altra rappresentazione potrebbe essere migliore.)


4

I soliti motivi che vedo non sono il blocco del gimble o problemi numerici.

E sono buoni motivi.

Come hai già capito, i quaternioni codificano una singola rotazione attorno a un asse arbitrario rispetto a tre rotazioni sequenziali in Eulero 3-spazio. Ciò rende i quaternioni immuni al blocco del gimbal .

Inoltre, alcune forme di interpolazione diventano piacevoli e facili da fare, come SLERP .

... o utilizzando due sistemi di coordinate sovrapposti.

Dal punto di vista delle prestazioni, perché la tua soluzione è migliore?

Potrei andare avanti, ma i quaternioni sono solo uno dei possibili strumenti da usare. Se non soddisfano le tue esigenze, non utilizzarli.


Eppure le matrici di rotazione fanno lo stesso, oltre ad avere più proprietà algebriche che possono essere usate con precisione. Inoltre, la manipolazione della matrice è una delle cose in cui i computer sono particolarmente bravi.
paul23

3

Vale la pena ricordare che tutte le proprietà relative alla rotazione non sono veramente proprietà dei Quaternioni: sono proprietà delle Parametrizzazioni di Eulero-Rodrigues , che è l'attuale struttura a 4 elementi usata per descrivere una rotazione 3D.

La loro relazione con i Quaternioni è puramente dovuta a un articolo di Cayley, "Su alcuni risultati relativi ai Quaternioni", dove l'autore osserva la correlazione tra la moltiplicazione dei Quaternioni e la combinazione delle parametrizzazioni di Eulero-Rodrigues. Ciò ha consentito di applicare aspetti della teoria dei quaternioni alla rappresentazione delle rotazioni e soprattutto all'interpolazione tra di loro.

Puoi leggere l'articolo qui: https://archive.org/details/collmathpapers01caylrich . Ma all'epoca, non c'era alcuna connessione tra i quaternioni e la rotazione e Cayley fu piuttosto sorpreso di scoprire che c'erano:

Infatti le formule sono proprio quelle date per una tale trasformazione da M. Olinde Rodrigues Liouville, tv, "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (o Comb. Math. Journal, t. iii. p. 224 [6]). Sarebbe una domanda interessante spiegare, a priori, l'aspetto di questi coefficienti qui.

Tuttavia, non c'è nulla di intrinseco nei Quaternioni che dia alcun vantaggio alla rotazione. I quaternioni non evitano il blocco del gimbal; Le parametrizzazioni di Euler-Rodrigues lo fanno. È probabile che pochissimi programmi per computer che eseguono la rotazione implementino veramente i tipi Quaternion che sono valori matematici complessi di prima classe. Sfortunatamente, un malinteso sul ruolo dei Quaternioni sembra essere trapelato da qualche parte, con il risultato che alcuni studenti di grafica sconcertati imparano i dettagli della matematica complessa con più costanti immaginarie e quindi rimangono sconcertati sul motivo per cui questo risolve i problemi con la rotazione.


1

Una risposta che qualcuno potrebbe leggere: ci sono problemi noiosi con tutte le rappresentazioni. I quaternioni sono più piccoli delle matrici, ma la moltiplicazione dei quaternioni non è un semplice prodotto puntino vettoriale o simile, e in effetti richiede più tempo su un computer rispetto al prodotto scalare di due matrici 3x3. (I computer funzionano molto bene con matrici ordinarie)

Le matrici hanno però altre fastidiose caratteristiche. Ad esempio, non sono creature stabili a lungo termine. Quando si modellano le rotazioni nello spazio 3D, di solito si accumulano rotazioni una sopra l'altra in una matrice di orientamento, che è solo una matrice di rotazione singola che memorizza l'orientamento di un sistema di riferimento. Questo processo nel corso di milioni di aggiunte farà sì che la matrice O diverga da una forma di matrice di rotazione rigorosa. Questo può essere aggirato riconfigurando periodicamente la matrice, ma ci sono condizioni in cui ciò non è banale. Vale a dire il caso di non rotazione della matrice identità.

Dovresti trovare una rappresentazione dell'asse-angolo (o rappresentazione del quaternione) della rotazione e quindi riprodurre una matrice per quella. La maggior parte degli algoritmi produce un vettore zero e in questo caso incontra la divisione zero. In questi casi è anche generalmente una cattiva idea cercare di evitare tali casi con il tipo di soluzioni "if 0 then ...", poiché a) le fork sono lente eb) puoi ancora finire con la macchina epsilon a parte singolarità e finire con errori orrendi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.