5

Sto imparando i quaternioni di unità e come utilizzarli per rappresentare e comporre le rotazioni. Wikipedia dice che sono più numericamente stabili rispetto alle rappresentazioni matriciali, ma non danno un riferimento. Qualcuno può spiegarmi (preferibilmente con qualche ragionamento matematico) perché è più numericamente stabile usare i quaternioni di unità per gestire le rotazioni (ad esempio per un'applicazione OpenGL) piuttosto che le matrici di rotazione? È solo perché si evita il blocco del giunto cardanico?Quaternioni e stabilità numerica

risposta

5

Questo articolo di Wikipedia è di parte. Da

come APR 18, 2014:

Durante la composizione di diverse rotazioni su un computer, gli errori di arrotondamento necessariamente accumulano. Un quaterio ancora leggermente spento rappresenta una rotazione dopo essere stato normalizzato: una matrice leggermente disattivata potrebbe non essere più ortogonale ed è più difficile riconvertire in una matrice ortogonale corretta .

Questo è di parte. C'è niente di difficile di ri-orthogonalizing una matrice di rotazione, si veda ad esempio:

e quaternioni devono essere ri-normalizzati troppo: "Un quaternione che è leggermente fuori ancora rappresenta una rotazione dopo essere stata normalizzata ". I quaternioni non hanno un vantaggio significativo qui.

Proverò a risolverlo in Wikipedia. Questa opinione parziale compare anche su Wikipedia in altri luoghi ... :(

Questo risponde alla tua domanda.


UPDATE: ho dimenticato di menzionare: gimbal lock non gioca un ruolo qui; né i quaternioni, né le matrici di rotazione ne soffrono.


Alcune note a margine. Anche se quaternioni sono più compatti rispetto matrici di rotazione, non è affatto un taglio chiaro che usando quaternioni si tradurrà in meno calcolo numerico nell'applicazione nel suo complesso, si veda:

Solo per la cronaca: le matrici di rotazione sono state utilizzate con grande successo su microcontrollori con risorse limitate per tracciare l'orientamento, vedere Direction Cosine Matrix IMU: Theory di William Premerlani e Paul Bizard. Ho anche esperienza di prima mano nell'orientamento del tracking su un microcontrollore (MSP430) e posso solo dire che le matrici di rotazione sono veloci e stabili per l'orientamento del tracciamento.

mio punto è: non c'è differenza significativa tra matrici di rotazione e quaternioni quando viene utilizzato per monitorare l'orientamento.

Se si dispone già di una libreria che utilizza i quaternioni per rappresentare le rotazioni, attenersi ai quaternioni; se la tua libreria usa già matrici di rotazione, usa le matrici di rotazione. Anche se una rappresentazione ti farebbe risparmiare qualche operazione in virgola mobile qua e là, non ha senso cambiare la tua applicazione/libreria per usare l'altra rappresentazione; anche su microcontrollori con risorse limitate, i risparmi sarebbero insignificanti.

L'unico vero vantaggio dei quaternioni che vedo è che i quaternioni possono essere utilizzati per l'interpolazione. Né le matrici di rotazione, né gli angoli di Eulero possono farlo.

+1

È strano che tu parli di parzialità. È molto più difficile deortogonalizzare una matrice di rotazione alla deriva senza introdurre pregiudizi. La decompressione QR privilegia gli assi con numeri più bassi rispetto a quelli con numero più alto, aumentando la rotazione attorno a quegli assi mentre li distrae dagli altri e causando la deriva dell'asse di rotazione generale. La normalizzazione del quaternio è più efficace nel mantenere l'asse di rotazione su proiezioni ripetute nello spazio di rotazione. – Sneftel

+1

@Sneftel Ho usato la procedura di ortogonalizzazione dettagliata [qui] (http://stackoverflow.com/q/23080791/341970) nella mia applicazione di tracciamento di orientamento e l'applicazione era accurata. Non ho sperimentato il * "molto più difficile da mettere in discussione una matrice di rotazione alla deriva" * affermi e sto parlando di esperienza di prima mano qui. Hai * tu * esperienza di prima mano nella re-ortogonalizzazione delle matrici di rotazione nelle applicazioni per l'orientamento del tracking? – Ali

+2

La tua tecnica sembra ragionevole, e dovrei cercare di capire quale sarebbe la semantica del pregiudizio. Nota, comunque, che stai buttando via tutte le informazioni contenute nel vecchio vettore Z, ma non nei vecchi vettori X e Y, quindi c'è ancora pregiudizio. E sì, ho esperienza nella zona. – Sneftel

4

Non sono sicuro se questo sarà abbastanza matematico per i vostri gusti, ma lo farò comunque: il problema con una matrice di rotazione è che contiene informazioni ridondanti. Hai 9 valori che codificano una trasformazione con solo 3 gradi di libertà.

A causa di questa ridondanza, esistono dei vincoli sui 9 valori in una matrice per formare una matrice di rotazione valida. La matrice deve essere ortogonale, nel senso che i vettori di riga devono essere ortonormali (ogni vettore ha lunghezza 1 e il prodotto scalare di ciascuna coppia è 0).

Mentre si aggiorna la matrice di rotazione, in genere concatenandola con matrici di rotazione incrementali, vengono introdotti errori numerici. Questi errori si accumulano con ogni aggiornamento. A meno che tu non faccia qualcosa a riguardo, i vettori di fila si allontanano sempre più dall'essere ortonormali. Una volta che la matrice è sufficientemente lontana dall'essere ortogonale, può iniziare a deformare visibilmente la geometria a cui è applicata (inclinazione, ridimensionamento, ecc.).

È possibile evitare questi problemi quando si utilizzano le matrici di rotazione periodicamente ortonormalizzando i vettori di riga. Bastano alcune semplici operazioni vettoriali per farlo, quindi non è un grosso problema.

1

"gimbal lock" è una falsa pista - nè matrici né quaternioni unitari sono intrinsecamente soggette a gimbal serratura.

Le matrici presentano effettivamente un piccolo vantaggio rispetto ai quaternioni nel mantenimento della stabilità numerica su una sequenza di rotazioni, poiché sono necessarie meno operazioni FP per produrre ciascun elemento nel prodotto matrice. I quaternioni hanno un leggero vantaggio nella facilità di correggere la deriva numerica (per fare davvero un buon lavoro per le matrici, è necessario fare un SVD).

Onestamente, però, è improbabile che faccia una grande differenza per la tua applicazione, e la teoria dietro la stabilità numerica diventa piuttosto pelosa. Se sei veramente interessato alla zona, posso raccomandare la precisione e la stabilità degli algoritmi numerici di Higham.

+0

* "per fare davvero un buon lavoro per le matrici, devi fare un SVD" * No, non lo fai. Sarebbe davvero costoso. Nella mia esperienza di prima mano, la procedura di ortogonalizzazione a cui mi collego nella mia risposta è già abbastanza buona nelle applicazioni pratiche. Non c'è dubbio, non è accurato come SVD, ma sostengo (per esperienza diretta) che gli errori di lettura del sensore dominano totalmente l'errore generale in un'applicazione di tracciamento dell'orientamento. Non ha senso rendere l'ortogonalizzazione più precisa con SVD o QR, non renderà l'applicazione più precisa. – Ali

-1

L'utilizzo di quaternioni di unità può essere numerico instabile più delle matrici.

1. Se si converte il quaternione di unità e si assume che sia un'unità (non ponderando i coefficienti in base alla grandezza quadratica) di quanto si possa ottenere un errore drammatico. E se converti da matrice rotta a quaternione e viceversa, puoi raggiungere una rotazione instabile molto rapidamente.

  1. Moltiplicazione sequenziale di quaternioni, spostarli alla lunghezza non dell'unità. E come precedente può produrre una matrice spezzata.

Per evitare questo errore, è necessario normalizzare i quaternioni dopo ogni operazione producendo errori di arrotondamento. Oppure assumete i vostri quaternioni come non un'unità e convertiteli in matrice con ponderazione (circa 8flops aggiuntivi).

NOTA: molte operazioni vengono eseguite più velocemente che con l'unità, ad esempio la conversione da matrice.

0

Ho un'applicazione in cui ho una "macchina" che segue una spline. Calcolo la derivata della spline per definire un vettore in avanti, quindi computo i vettori left e up per creare una matrice di orientamento. Quindi lo decompongo in un quaternion.

Quando trasformo questi quaternioni in fotogrammi chiave nell'animazione, ci sono alcuni giri in cui i Q_z floppano da -1 a 1. Non ho ancora studiato come ottenere la libreria Python di Blender per darmi una scomposizione che sia stabile su piccola i cambiamenti.