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.