Bonjour à tous!

Je vous présente un petit bout de calcul qui permet d'installer ma centrale inertielle dans n'importe quelle position et de repartir avec un quaternion [1,0,0,0] à partir de sa position courante.

Je suis certain que je peux GRANDEMENT simplifier tout ça mais j'ai trouvé cette solution un peu en tâtonnant, je n'ai donc pas réussi à faire plus simple (j'avais pourtant trouver quelque chose de prometteur: multiplier mon quaternion actuel par le conjugué du quaternion de la position initiale mais ça ne donnait pas tout à fait le même résultat):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        private bool bSetSoftTareAsked = false;
        private bool bResetSoftTareAsked = true;

        // Bouton Tare cliquer
        private void btnSetSoftTare_Click(object sender, EventArgs e)
        {
            bSetSoftTareAsked = true;
        }

        // Mise à jour du quaternion (100Hz)
        void UpdateQuaternion(QuaternionData quat)
        {
            // Si demande de tare    
            if (bSetSoftTareAsked)
            {
                double OffsetPitch = deg2rad(quat.ConvertToEulerAngles()[0]);
                double OffsetRoll = deg2rad(quat.ConvertToEulerAngles()[1]);
                double OffsetYaw = deg2rad(quat.ConvertToEulerAngles()[2]);
                rotPitch = new QuaternionData(new float[] { (float)Math.Cos(OffsetPitch / 2), (float)Math.Sin(OffsetPitch / 2), 0, 0 });
                rotRoll = new QuaternionData(new float[] { (float)Math.Cos(OffsetRoll / 2), 0, (float)Math.Sin(OffsetRoll / 2), 0 });
                rotYaw = new QuaternionData(new float[] { (float)Math.Cos(OffsetYaw / 2), 0, 0, (float)Math.Sin(OffsetYaw / 2) });

                // demande traitée
                bSetSoftTareAsked = false;
            }

            quat = (quat.ConvertToConjugate() *rotPitch.ConvertToConjugate()).ConvertToConjugate();
            quat = (quat.ConvertToConjugate() * rotRoll.ConvertToConjugate()).ConvertToConjugate();
            quat = (quat.ConvertToConjugate() * rotYaw.ConvertToConjugate()).ConvertToConjugate();

            QuaternionDataReceived(this, quat);
        }

Merci à ce qui arriveront à trouver une simplification