Changement de repere et quaternions

Fermé
ebousquie Messages postés 40 Date d'inscription lundi 12 mai 2008 Statut Membre Dernière intervention 28 avril 2009 - 28 avril 2009 à 10:55
feadin91 Messages postés 257 Date d'inscription lundi 20 avril 2009 Statut Membre Dernière intervention 28 avril 2010 - 28 avril 2009 à 11:25
Bonjour,
J'essaie désespérément d'effectuer un changement de repère entre deux capteurs. Chacun a 6 coordonnées absolues (x,y,z, Azimuth(rotation sur z), Elevation (rotation sur y), Roll (rotation sur x)). Mon objectif est d'exprimer les 6 coordonnées d'un capteur en fonction du 2e. Voici comment je procède:

On a:
Capteur 1 : x1,y1,z1,A1,E1,R1
Capteur 2 : x2, ..., R2

Mon programme: (C++)

P = (x2,y2,z2)
Pref =(x1,y1,z1)

O = quaternion obtenu à partir des angles d'Euler du capteur 2
Oref = idem pour le capteur 1

Où, pour des angles (A,E,R) le quaternion d'orientation O est ainsi obtenu (formule directement pompée d'internet)
O (a,b,c,d)

a = (cos(R/2) * cos(E/2) * cos(A/2) + sin(R/2) * sin(E/2) * sin(A/2)),
b = (sin(R/2) * cos(E/2) * cos(A/2) - cos(R/2) * sin(E/2) * sin(A/2)),
c = (cos(R/2) * sin(E/2) * cos(A/2) + sin(R/2) * cos(E/2) * sin(A/2)),
d = (cos(R/2) * cos(E/2) * sin(A/2) - sin(R/2) * sin(E/2) * cos(A/2))

Oref_inverse = inverse(Oref);
trans = P-Pref
Qtrans = (0,trans.x, trans.y, trans.z) //quaternion obtenu à partir du veteur trans.
Qtrans = Oref_inverse * Qtrans * Oref

//OBTENTION DE LA TRANSLATION
trans = (Qtrans.i, Qtrans.j, Qtrans.k) //vecteur des 3 composantes complexes de Qtrans

//OBTENTION DES ANGLES
O = Oref_inverse*O;
et on extrait les trois angles d'Euler à partir de O

Le pb est que les résultats sont faux: si je fixe les 2 capteurs sur un solide et que je bouge le solide, les coordonnées relatives devraient être fixes (les 2 cpateurs étant fixes l'un par rapport à l'autre), or elles ne le sont pas... ='(

SVP, je suis en train de péter les plombs, dites-moi ce qui ne va pas!!!

Merci bcp d'avance !
A voir également:

7 réponses

feadin91 Messages postés 257 Date d'inscription lundi 20 avril 2009 Statut Membre Dernière intervention 28 avril 2010 89
28 avril 2009 à 11:01
Wahou, c'est du lourd ça!

Tu n'as pas copié la fonction inverse(quaternion);
Le problème vient peut-être de là?

Tu as des warning lors de la compilation? (moi j'en ignore certains XD j'ai même pas honte)
0
ebousquie Messages postés 40 Date d'inscription lundi 12 mai 2008 Statut Membre Dernière intervention 28 avril 2009
28 avril 2009 à 11:02
ouais, merci... il semble que l'inversion soit bonne... d'ailleurs autant pour moi c'est pas inversion c'est complémentation (on prend le conjugué)
0
feadin91 Messages postés 257 Date d'inscription lundi 20 avril 2009 Statut Membre Dernière intervention 28 avril 2010 89
28 avril 2009 à 11:04
Tu peux la mettre ici aussi stp? (on sait jamais...) avec un commentaire bref sur son algo si possible

EDIT :
trans = P-Pref
Qtrans = (0,trans.x, trans.y, trans.z) //quaternion obtenu à partir du veteur trans.
Qtrans = Oref_inverse * Qtrans * Oref

//OBTENTION DE LA TRANSLATION
trans = (Qtrans.i, Qtrans.j, Qtrans.k) //vecteur des 3 composantes complexes de Qtrans


Il n'y a pas une petite redondance? Si j'ai bien compris, tu calcule trans, tu "colle" ses paramètres dans Qtrans, puis tu "colle" les paramètres de Qtrans dans trans?

C'est normal?
0
ebousquie Messages postés 40 Date d'inscription lundi 12 mai 2008 Statut Membre Dernière intervention 28 avril 2009
28 avril 2009 à 11:09
//Conjugué

inline Quaternion& Quaternion::complement()
{
a = a;
b = -b;
c = -c;
d = -d;
return *this;
}

// Inversion

inline Quaternion& Quaternion::invert()
{
double norm = a*a+b*b+c*c+d*d;
complement();
*this /= norm;

return *this;
}

// dans le main:

Remplacer Oref_inverse par Oref_complement
puis calcul: Qtrans = Oref_complement * Qtrans * (Oref_complement)^-1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
feadin91 Messages postés 257 Date d'inscription lundi 20 avril 2009 Statut Membre Dernière intervention 28 avril 2010 89
28 avril 2009 à 11:12
Et ça fonctionne avec tes modifications?

Sinon, bah je vois pas du tout (je suis un peu paumé :S)
0
ebousquie Messages postés 40 Date d'inscription lundi 12 mai 2008 Statut Membre Dernière intervention 28 avril 2009
28 avril 2009 à 11:14
La redondance c'est pour effectuer des calculs avec des quaternions et non avec des vecteurs, d'où la conversion "aller-retour" Vect -> Quat -> Vect

... et ça ne fonctionne pas. Déjà, si la démarche est la bonne, c'est cool. Mais je ne sais pas quoi corriger d'autre.
0
feadin91 Messages postés 257 Date d'inscription lundi 20 avril 2009 Statut Membre Dernière intervention 28 avril 2010 89
28 avril 2009 à 11:25
Ah d'accord... Et bien désolé, je ne vois pas du tout. Faut dire que je suis pas dans le contexte, j'ai du mal à saisir ^^

Tu n'as pas des collègues avec qui tu peux essayer de résoudre le problème?

Moi je passe mon tour :D (désolé encore)
0