Puis-je utiliser des quaternions pour contrôler un hélicoptère?


9

J'essaie de faire une simulation d'hélicoptère simplifiée (pour le moment, c'est un cube) en 3D et j'ai des problèmes de rotation. Un hélicoptère peut pivoter selon les trois axes:

  • tourner sur lui-même à l'aide de l'hélice arrière: rotation de l'axe y
  • incliner à gauche et à droite pour aller à gauche ou à droite: rotation de l'axe z
  • incliner vers le haut et vers le bas pour reculer ou avancer: rotation de l'axe x

J'ai besoin de pouvoir contrôler chaque axe individuellement. Jusqu'à présent, j'ai essayé d'utiliser des angles euler, mais quel que soit l'ordre de rotation que j'utilise, je tombe sur un verrou de cardan ou sur certains axes "changer de place".

Il me semble que j'ai besoin d'utiliser des quaternions, mais je ne sais pas comment contrôler chaque axe individuel, car les quaternions utilisent une direction et un angle. Dois-je créer trois quaternions et les multiplier ensemble? Ne pourrais-je pas me retrouver avec les mêmes problèmes?

La chose étrange est que si j'utilise mon doigt pour représenter les trois axes de mon hélicoptère (pouce vers le haut = y, index = z, milieu = x), je ne semble pas rencontrer ces problèmes. Pourquoi?


Si vous avez accès à un graphique de scène, une alternative viable serait d'avoir des conteneurs imbriqués pour chaque axe que vous faites ensuite pivoter individuellement.
bummzack

@bummzack, oui, j'y ai pensé. Cependant, n'est-ce pas la même chose que de concaténer trois matrices de rotation dans un ordre particulier?
subb

Vous avez raison @Subb, essayez de ne pas stocker les rotations pour chaque axe séparément, cela aura les mêmes problèmes que Euler Angles, peu importe ce que vous utilisez pour cela, les matrices et les quaternions souffriront également de Gimbal Lock.
Maik Semder

@Maik Semder, alors comment puis-je contrôler le tangage / lacet / roulis de mon hélicoptère?
subb

@Subb @ Flip's et ma réponse vous ont essentiellement expliqué comment le faire.
Maik Semder

Réponses:


4

Vous devriez pouvoir utiliser une matrice ou un quaternion pour stocker l'orientation actuelle de votre hélicoptère. Le problème que vous rencontrez est de savoir comment appliquer un changement de tangage / lacet / roulis à l'hélicoptère.

Je pense que vous voulez appliquer un tangage / lacet / roulis à l'hélicoptère dans l'espace local à chaque image. Vous pouvez le faire en prenant le changement de tangage / lacet / roulis pour cette image et en construisant une matrice de rotation (vous pouvez le faire avec des angles d'Euler). Ensuite, vous faites pivoter l'orientation précédente de l'hélicoptère par cette matrice (avec l'orientation précédente représentée soit comme une matrice soit comme un quaternion). Il vous donnera l'orientation du nouveau cadre.

Représenter l'orientation de l'hélicoptère comme un quaternion a l'avantage que l'interpolation entre les quaternions est beaucoup plus facile que l'interpolation entre les matrices. Donc, si à l'avenir vous avez une orientation actuelle et que vous souhaitez déterminer la rotation par image qui vous amènera à une nouvelle orientation à un moment souhaité, la représentation quaternion peut être plus conviviale pour vous.


Voilà comment je l'ai fait, appliquez des mises à jour incrémentielles à la matrice qui représente la transformation locale -> mondiale. N'oubliez pas de normaliser la matrice, après quelques centaines d'images, elle affichera des artefacts d'arrondi si vous ne le faites pas.
Patrick Hughes

De plus, pour répondre à la dernière question de savoir pourquoi le problème de verrouillage du cardan n'est pas vu en utilisant votre main pour représenter les axes x / y / z, c'est parce que vous appliquez probablement les valeurs de tangage, de lacet et de roulis au cadre local de la main. référence. La construction d'une matrice de rotation avec des angles d'Euler commence par tourner autour du x du monde, puis par le y résultant, puis par le z résultant (l'ordre réel de x / y / z peut différer dans l'ordre). Essayez d'appliquer les rotations de cette manière et vous pourrez commencer à voir comment le verrou du cardan apparaît.
Retournez le

3

Fondamentalement, vous pouvez utiliser toutes les autres représentations de rotations, sauf Euler Angles. Les matrices, les quaternions et même les angles d'axe feront ce que vous voulez.

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

Vous avez raison, vous vous retrouveriez avec les mêmes problèmes. La clé est de stocker l'orientation actuelle (matrice, quaternion) de votre objet et d'appliquer uniquement un delta lors du changement d'orientation.

Lorsque vous souhaitez faire un virage de 10 degrés autour de y, créez simplement une matrice delta / quaternion pour cela et post-multipliez-la avec votre orientation actuelle (si vous utilisez la post-multiplication pour les matrices). Si vous le multipliez dans l'autre sens, il fera pivoter le système autour de l'axe y du monde plutôt que autour de l'axe y de l'objet.

Je trouve cette ressource très utile, elle est également fournie avec du code source et explique très bien la théorie.


-1

Le problème que je pense que vous pourriez voir est une différence de rotation d'axe et de vecteurs de vitesse (et aussi qu'il vous manque une direction). Lorsqu'un hélicoptère s'incline vers l'avant pour avancer, la propulsion des pales de l'hélicoptère pousse l'air vers le bas et vers l'arrière à un angle perpendiculaire à ce que vous avez appelé l'axe X.

Vous avez un quatrième degré de liberté que vous avez manqué: la vitesse des pales contrôle le volume d'air poussé, ce qui contrôle également la quantité de portance générée par l'hélicoptère.

Mais même ainsi, votre "inclinaison gauche et droite" et "inclinaison haut et bas" contrôlent généralement l'hélicoptère sur un avion donné. C'est-à-dire qu'un hélicoptère ne devrait pas voler vers le bas lorsqu'il s'incline vers l'avant, vers l'arrière ou sur le côté - mais la quantité de portance pourrait devoir changer et la vitesse sera contrôlée par le côté "opposé" du triangle rectangle formé par reliant l'hélicoptère au sol avec une ligne droite vers le bas (gravité) et l'hypoténuse (portance). Cela devrait donner votre vecteur de vitesse à utiliser.

Vous devriez pouvoir utiliser des quaternions pour ce faire, mais ne basez pas vos valeurs de quaternion sur l'inclinaison de l'hélicoptère lui-même - essayez plutôt d'utiliser les forces de mouvement générées par l'hélicoptère.


Mais cela ne répond pas vraiment à la question. Ajouter simplement plus de matière à réflexion.
bummzack

Actuellement, j'utilise la rotation de l'hélicoptère pour transformer le vecteur de force de portance, qui est pointé vers le haut dans l'espace de l'hélicoptère. Voulez-vous dire que je devrais faire l'inverse, c'est-à-dire modifier le vecteur directement puis faire tourner l'hélicoptère en conséquence?
subb

Je pense que vous devriez faire les deux, ce que vous faites maintenant, puis apporter des changements de rotation à l'hélicoptère en fonction de la normale des pales. C'est à dire que vous avez 2 rotations; une appliquée aux pales et une seconde représentant la rotation réelle de l'hélicoptère. Évidemment, tous stockés dans des Quaternions.
deceleratedcaviar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.