Example #1
0
        public TVector Povorot(TVector V)
        {
            Kvaternion T = this.mult(V);

            T = T.mult(this.invert());
            return(new TVector(T.x, T.y, T.z));
        }
Example #2
0
        static void Main(string[] args)
        {
            Sensor Gyro  = new Sensor("gyro.csv");  // Cоздаем датчик гироскопа
            Sensor Accel = new Sensor("accel.csv"); // Создаем акселерометр

            // Летательный аппарат
            Kvaternion   L  = new Kvaternion(new TVector(1, 1, 1), Math.PI / 2);
            StreamWriter sw = File.CreateText("Kvaternion.txt");

            Double t0 = 0, tk = 0.8, dt = 0.01;
            Double Beta = 1;
            Double T    = t0;

            while (T < tk)
            {
                // Взять показания гироскопа
                Kvaternion G = Gyro.getKvaternion().normalize();
                // Взять показания акселерометра
                Kvaternion A = Accel.getKvaternion().normalize();

                //Угловые скорости
                Kvaternion S = L.mult(G).scale(0.5);

                TVector K = new TVector(0, 0, 0);
                K.Fill(G, A);
                Matr J = new Matr(3, 4);
                J.Fill(G);

                // Кватернион градиент F
                Kvaternion W = J.Trans().mult(K).normalize();

                // Шаг алгоритма
                S = S.Minus(W.scale(Beta));
                L = L.Plus(S.scale(dt));
                Console.WriteLine("G=" + G.ToString());
                Console.WriteLine("L=" + L.ToString());
                Console.WriteLine("S=" + S.ToString());
                // Сохранение результатов и переход на следующий шаг
                // L.Write(sw);
                L.WriteAngles(sw);
                T = T + dt;
            }
            sw.Close(); // Закрытие файла результата
        }
        public Kvaternion quat_from_angles_rad()
        {
            Kvaternion q_h = new Kvaternion(new TVector(0, 0, 0), 0);

            q_h.setz(Math.Sin(heading / 2));
            q_h.setw(Math.Cos(heading / 2));

            Kvaternion q_a = new Kvaternion(new TVector(0, 0, 0), 0);

            q_a.sety(Math.Sin(altitude / 2));
            q_a.setw(Math.Cos(altitude / 2));

            Kvaternion q_b = new Kvaternion(new TVector(0, 0, 0), 0);

            q_b.setx(Math.Sin(bank / 2));
            q_b.setw(Math.Cos(bank / 2));

            Kvaternion q_temp = q_h.mult(q_a);

            return(q_temp.mult(q_b));
        }