Применение параметров Родрига-Гамильтона в задачах динамики полета ЛА.
?Реализация в коде.??
В интернете можно найти немало описаний того, что такое параметры Родриго-Гамильтона, откуда они взялись и для чего нужны. Вместе с этим вам предложат узнать, что такое кватернионы, гиперкомплексные числа и как их можно вывести.
Здесь описано, как применить их на практике в задачах динамики полета. Ниже представлен фрагмент программы, рассчитывающей параметры траектории баллистической ракеты, написанной на языке Java. Фрагмент иллюстрирует, как вычисляются углы ориентации (углы Эйлера) через параметры Родриго – Гамильтона.
Автор постарался дать исчерпывающее количество коментариев.?Литература: И.С.Голубев, В.Г.Светлов «ПРОЕКТИРОВАНИЕ ЗЕНИТНЫХ УПРАВЛЯЕМЫХ РАКЕТ». Москва, 2001.
?Реализация в коде.??
В интернете можно найти немало описаний того, что такое параметры Родриго-Гамильтона, откуда они взялись и для чего нужны. Вместе с этим вам предложат узнать, что такое кватернионы, гиперкомплексные числа и как их можно вывести.
Здесь описано, как применить их на практике в задачах динамики полета. Ниже представлен фрагмент программы, рассчитывающей параметры траектории баллистической ракеты, написанной на языке 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)
Ohar
25.04.2016 19:25psi / 2
fi / 2
gam / 2
Вы бы хоть чуток соптимизировали, вынеся их в отдельные переменные.rafuck
25.04.2016 23:25+1Это как раз ерунда. А вот синусы и косинусы от этих углов действительно стоило посчитать однократно. Но это бы нарушило читаемость кода и вопросов к «статье» стало бы немного больше.
knagaev
26.04.2016 09:56+1А вот мне кажется, что Вы правы полностью — не нарушило бы при условии хорошего именования переменных.
Да хотя бы,
double cos_half_psi = Math.cos(psi / 2);
Зато застраховано от глупых ошибок типа опечатки Math.cos(psi / 3)
rafuck
25.04.2016 23:15+3Фраза «время пошло» относится к интегрированию по времени или к стремлению написать статью за 5 минут?
Rumlin
26.04.2016 08:25+2Всё таки следовало хоть как то сформулировать к какой конкретно «задаче динамики полета ЛА» относится этот код.
Zenitchik
Можно полслова об окружении?
Что за объект Rocket? Что лежит в его свойстве w?
PapaBubaDiop
Хороший у Вас ник, прямо по теме.
Судя по формулам — это проекции вектора угловой скорости на оси, связанные с телом.
mmarashan
Да, вы правы
mmarashan
Спасибо что заметили! Исправляю на более понятный вариант