2016-08-28 4 views
2

J'ai besoin de compenser les données de quaternion en streaming d'une quantité spécifique. Pour ce faire, je prévois d'obtenir la différence entre les deux, puis compenser le premier par le second.Trouver la différence de rotation entre deux quaternions pour calibrer deux systèmes de coordonnées

J'ai du mal à trouver la différence entre les 2.

Using this converter.

Je suis en cours d'exécution de ce code:

public void convertQuat180() 
{ 
    Quaternion q = new Quaternion(0.65328f, 0.2706f, 0.65328f, -0.2706f); //45,180,0 

    Quaternion q180 = new Quaternion(0.70711f, 0, 0.70711f, 0); // 0,90,0 

    Quaternion result = q180 * Quaternion.Inverse(q); 

    Console.WriteLine(result); 
} 

je me attends result être:

(euler) diff = 45, 90 , 0 

Mais au lieu que je reçois:

135,-180,0 

Où vais-je pas ici?

+1

Je ne suis pas sûr s'il est logique d'imaginer cela en utilisant des angles d'Euler. La rotation de la différence n'aura vraisemblablement pas d'angles qui sont la différence des deux rotations de la source. Quoi qu'il en soit, avec la formule ci-dessus, vous obtenez une rotation, telle que 'result * q = q180'. N'est-ce pas ce que tu voulais? –

+0

ok, peut-être que je devrais m'en tenir à quats pour tester. Je suis nouveau pour eux, et j'ai beaucoup plus de facilité à imaginer des eulers! Le code ci-dessus est-il valide pour trouver la différence? Et puis comment pourrais-je appliquer cette différence au quat d'origine? – anti

+1

Le problème des angles d'Euler est que les axes ne peuvent pas être vus indépendamment les uns des autres. S'en tenir aux quaternions ou matrices de rotation semble être la meilleure alternative pour ce scénario. Vous mettez à jour une rotation représentée par un quaternion par simple multiplication (voir mon premier commentaire). Mais bien sûr, cela vous ramènera au point de départ. –

Répondre

3

Ce que vous voulez, c'est une transformation des systèmes de coordonnées. Vous avez une rotation mesurée par le capteur RS et une rotation de la caméra RC. Les deux sont liés par une constante (appelons-le) compenser RO:

RS = RC * RO 

Ou bien

RC = RS * RO^-1 

Au cours de votre procédure d'étalonnage, vous acquérez RS et RC. Ensuite, vous pouvez calculer le décalage comme:

RO = RC^-1 * RS 
RO^-1 = RS^-1 * RC 

Calculons Juste celui que vous utiliserez (probablement RO^-1 parce que vous voulez obtenir la rotation de la caméra de la rotation du capteur) plus souvent.

+0

Merci! '' '' '' est-ce que '' pouvoir de ', est-ce vrai? À quoi cela ressemblerait-il dans le code? (encore une fois, s'il vous plaît pardonnez mon ignorance mathématique) – anti

+0

La notation '^ -1' est l'inverse. –

+0

ah je vois. Donc, votre équation ci-dessus serait: 'RO = Quaternion.Inverse (RC) * RS;' puis je peux simplement utiliser 'Quaternion.Inverse (RO);' pour obtenir la valeur que je veux? – anti