Применение параметров Родрига-Гамильтона в задачах динамики полета ЛА.

?Реализация в коде.??

В интернете можно найти немало описаний того, что такое параметры Родриго-Гамильтона, откуда они взялись и для чего нужны. Вместе с этим вам предложат узнать, что такое кватернионы, гиперкомплексные числа и как их можно вывести.

Здесь описано, как применить их на практике в задачах динамики полета. Ниже представлен фрагмент программы, рассчитывающей параметры траектории баллистической ракеты, написанной на языке Java. Фрагмент иллюстрирует, как вычисляются углы ориентации (углы Эйлера) через параметры Родриго – Гамильтона.

//вычисление параметров Родриго-Гамильтона по углам Эйлера:

double cospsi2 = Math.cos(psi / 2);       double sinpsi2 = Math.sin(psi / 2);
double cosfi2 = Math.cos(fi / 2);         double sinfi2 = Math.sin(fi / 2);
double cosgam2 = Math.cos(gam / 2);       double singam2 = Math.sin(fi / 2);

double ?rg = cospsi2 * cosfi2 * cosgam2 + sinpsi2 * sinfi2 * singam2; ?        
double ?rg = cospsi2 * cosfi2 * singam2 - sinpsi2 * sinfi2 * singam2;?        
double ?rg = sinpsi2 * cosfi2 * cosgam2 + cospsi2 * sinfi2 * singam2;?        
double Vrg = cospsi2 * sinfi2 * cosgam2 - sinpsi2 * cosfi2 * singam2;?  
      
//Нормировка. Модуль вектора в 4-х мерном пространстве для нормировки:
double norm = Math.sqrt(?rg*?rg+?rg*?rg+?rg*?rg+Vrg*Vrg);

//нормировка параметров:
double[] rg = {?rg/norm, ?rg/norm, ?rg/norm, Vrg/norm); ?        
?rg = rg[0];?        
?rg = rg[1];?        
?rg = rg[2];?        
Vrg = rg[3];

//вычисление производных параметров РГ (wx, wy, wz – составляющие угловой скорости)?        
double ?rgt = -dt*(wx*?rg + wy*?rg + wz*Vrg)/2;?        
double ?rgt = dt*( wx*?rg - wy*Vrg + wz*?rg)/2;?        
double ?rgt = dt*( wx*Vrg - wy*?rg - wz*?rg)/2; ?        
double Vrgt = dt*(- wx*?rg + wy*?rg + wz*?rg)/2;

//интегрирование (метод Эйлера):?       
?rg = ?rg+?rgt;?        
?rg = ?rg+?rgt;?        
?rg = ?rg+?rgt;?        
Vrg = Vrg+Vrgt;

?//углы Эйлера на новом шаге?        
fi = Math.asin(2 * (?rg * Vrg + ?rg * ?rg)); //угол тангажа?        
gam = Math.atan(2 * (?rg * ?rg - Vrg * ?rg) / (Math.pow(?rg, 2) + Math.pow(?rg, 2) - Math.pow(Vrg, 2) - Math.pow(?rg, 2))); //угол крена?       
psi = Math.atan(2 * (?rg * ?rg - Vrg * ?rg) / (Math.pow(?rg, 2) + Math.pow(?rg, 2) - Math.pow(Vrg, 2) - Math.pow(?rg, 2))); //угол рыскания??


Автор постарался дать исчерпывающее количество коментариев.?Литература: И.С.Голубев, В.Г.Светлов «ПРОЕКТИРОВАНИЕ ЗЕНИТНЫХ УПРАВЛЯЕМЫХ РАКЕТ». Москва, 2001.

Комментарии (9)


  1. Zenitchik
    25.04.2016 17:18

    Можно полслова об окружении?
    Что за объект Rocket? Что лежит в его свойстве w?


    1. PapaBubaDiop
      25.04.2016 18:28

      Хороший у Вас ник, прямо по теме.
      Судя по формулам — это проекции вектора угловой скорости на оси, связанные с телом.


      1. mmarashan
        25.04.2016 21:01

        Да, вы правы


    1. mmarashan
      25.04.2016 20:46

      Спасибо что заметили! Исправляю на более понятный вариант


  1. Ohar
    25.04.2016 19:25

    psi / 2
    fi / 2
    gam / 2

    Вы бы хоть чуток соптимизировали, вынеся их в отдельные переменные.


    1. rafuck
      25.04.2016 23:25
      +1

      Это как раз ерунда. А вот синусы и косинусы от этих углов действительно стоило посчитать однократно. Но это бы нарушило читаемость кода и вопросов к «статье» стало бы немного больше.


      1. knagaev
        26.04.2016 09:56
        +1

        А вот мне кажется, что Вы правы полностью — не нарушило бы при условии хорошего именования переменных.
        Да хотя бы,

        double cos_half_psi = Math.cos(psi / 2);
        

        Зато застраховано от глупых ошибок типа опечатки Math.cos(psi / 3)


  1. rafuck
    25.04.2016 23:15
    +3

    Фраза «время пошло» относится к интегрированию по времени или к стремлению написать статью за 5 минут?


  1. Rumlin
    26.04.2016 08:25
    +2

    Всё таки следовало хоть как то сформулировать к какой конкретно «задаче динамики полета ЛА» относится этот код.