Posso usare i quaternioni per controllare un elicottero?


9

Sto cercando di realizzare una simulazione in elicottero semplificato (per il momento, è un cubo) in 3D e sto riscontrando alcuni problemi con la rotazione. Un elicottero può ruotare lungo i tre assi:

  • ruotare su se stesso usando l'elica posteriore: rotazione dell'asse y
  • inclinare a sinistra e a destra per andare a sinistra o a destra: rotazione dell'asse z
  • inclinare su e giù per andare indietro o avanti: rotazione dell'asse x

Devo essere in grado di controllare ogni asse singolarmente. Finora ho provato a usare gli angoli di eulero, ma qualunque sia l'ordine di rotazione che uso, o incontro un blocco cardanico o alcuni "punti di commutazione" degli assi.

Sembra che devo usare i quaternioni, ma non so come controllare ogni singolo asse, poiché i quaternioni usano una direzione e un angolo. Dovrei creare tre quaternioni e moltiplicarli insieme? Non finirei con gli stessi problemi?

La cosa strana è che se uso il dito per rappresentare i tre assi del mio elicottero (pollice su = y, indice = z, mezzo = x), non mi sembra di incontrare questi problemi. Perché?


Se si ha accesso a un grafico di scena, un'alternativa praticabile sarebbe quella di avere contenitori nidificati per ciascun asse che si ruota quindi individualmente.
bummzack,

@bummzack, sì, ci ho pensato. Tuttavia, non è lo stesso di concatenare tre matrici di rotazione in un ordine particolare?
subb

Hai ragione @Subb, cerca di non memorizzare le rotazioni per ciascun asse separatamente, avrà gli stessi problemi degli angoli di Eulero, indipendentemente da ciò che usi per questo, anche le matrici e i quaternioni soffriranno di Gimbal Lock.
Maik Semder,

@Maik Semder, quindi come posso controllare il pitch / yaw / roll del mio elicottero?
subb

@Subb @ Flip e la mia risposta in sostanza ti hanno detto come farlo.
Maik Semder,

Risposte:


4

Dovresti essere in grado di utilizzare una matrice o un quaternione per memorizzare l'orientamento corrente del tuo elicottero. Il problema che stai riscontrando è come applicare il cambiamento di beccheggio / imbardata / rollio all'elicottero.

Penso che tu voglia applicare pitch / yaw / roll all'elicottero nello spazio locale ogni frame. Puoi farlo prendendo il cambio di intonazione / imbardata / rollio per quel fotogramma e costruendo una matrice di rotazione (puoi farlo con angoli di eulero). Quindi si ruota l'orientamento precedente dell'elicottero da questa matrice (con l'orientamento precedente rappresentato come matrice o quaternione). Ti darà l'orientamento per la nuova cornice.

La rappresentazione dell'orientamento dell'elicottero come quaternione ha il vantaggio che l'interpolazione tra quaternioni è molto più semplice dell'interpolazione tra matrici. Quindi, se in futuro hai un orientamento attuale e vuoi capire la rotazione per fotogramma che ti porterà a un nuovo orientamento nel momento desiderato, la rappresentazione del quaternione potrebbe essere più amichevole con te.


È così che l'ho fatto, applica aggiornamenti incrementali alla matrice che rappresenta la trasformazione locale -> mondiale. Ricorda di normalizzare la matrice, dopo alcune centinaia di fotogrammi mostrerà artefatti di arrotondamento se non lo fai.
Patrick Hughes,

Inoltre, per rispondere all'ultima domanda sul perché il problema del blocco del gimbal non si vede usando la mano per rappresentare gli assi x / y / z, è perché probabilmente stai applicando i valori di intonazione, imbardata e rollio al frame locale della mano di riferimento. La costruzione di una matrice di rotazione con angoli di eulero inizia ruotando attorno alla x del mondo, quindi dalla y risultante e quindi dalla z risultante (l'ordine effettivo di x / y / z può differire nell'ordine). Prova ad applicare le rotazioni in questo modo e potresti iniziare a vedere come appare il blocco del gimbal.
Capovolgi il

3

Fondamentalmente puoi usare ogni altra rappresentazione delle rotazioni, tranne gli angoli di Eulero. Le matrici, i quaternioni e anche gli angoli dell'asse faranno quello che vuoi.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Hai ragione, finiresti con gli stessi problemi. La chiave è memorizzare l'orientamento corrente (matrice, quaternione) dell'oggetto e applicare solo un delta quando si cambia l'orientamento.

Quando vuoi ruotare di 10 gradi attorno a y, crea un delta matrice / quaternione e postala moltiplicandola con il tuo orientamento attuale (se usi la moltiplicazione post per le matrici). Se lo moltiplichi viceversa, ruoterà il sistema attorno all'asse y del mondo anziché attorno all'asse y dell'oggetto.

Trovo questa risorsa molto utile, viene fornita anche con il codice sorgente e spiega molto bene la teoria.


-1

Il problema che penso che potresti vedere è una differenza nella rotazione degli assi e nei vettori di velocità (e anche che ti manca una direzione). Quando un elicottero si inclina in avanti per avanzare, la propulsione delle pale dell'elicottero spinge l'aria verso il basso e all'indietro con un angolo perpendicolare a quello che hai etichettato l'asse X.

Hai un quarto grado di libertà che ti sei perso: la velocità delle pale controlla il volume di aria che viene spinta, che controlla anche la quantità di sollevamento generata dall'elicottero.

Ma anche così, la tua "inclinazione sinistra e destra" e "inclinazione su e giù" generalmente controllano l'elicottero su un determinato piano. Vale a dire, un elicottero non dovrebbe volare verso il basso quando si inclina in avanti, indietro o lateralmente - ma potrebbe essere necessario modificare la quantità di sollevamento e la velocità sarà controllata dal lato "opposto" del triangolo destro formato da collegando l'elicottero a terra con una linea retta verso il basso (gravità) e l'ipotenusa (ascensore). Questo dovrebbe dare il tuo vettore di velocità da usare.

Dovresti essere in grado di usare i quaternioni per farlo, ma non basare i valori dei tuoi quaternioni sull'inclinazione dell'elicottero stesso: prova invece a usare le forze di movimento generate dall'elicottero.


Tuttavia, in realtà non risponde alla domanda. Sto solo aggiungendo più spunti di riflessione.
bummzack,

Attualmente, sto usando la rotazione dell'elicottero per trasformare il vettore della forza di sollevamento, che è puntato verso l'alto nello spazio dell'elicottero. Vuoi dire che dovrei fare il contrario, cioè modificare direttamente il vettore e quindi ruotare l'elicottero di conseguenza?
subb

Penso che dovresti fare entrambe le cose, cosa stai facendo ora, quindi apportare qualsiasi cambiamento RISULTANTE alla rotazione dell'elicottero in base alla normale delle pale. Cioè hai 2 rotazioni; uno applicato alle pale e un secondo che rappresenta l'effettiva rotazione dell'elicottero. Ovviamente tutti archiviati nei Quaternioni.
Deceleratedcaviar
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.