Upsilon спасибо за подробный ответ.
Но мне кажется у вас опечатка в формулах. Неужели аргументами тригонометрических функций являются секунды, может всё таки радианы ? Иными словами мы должны скорость вращения Земли (рад/с) умножить на время S и как раз получим радианы. Так ?
Подскажите правильно ли я всё делаю?
Сначала формирую строки из файла TLE:string tle_data[3] = {
"OSCAR 7 (AO-7) ",
"1 07530U 74089B 14018.52342073 -.00000016 00000-0 17161-3 0 8742",
"2 07530 101.4562 5.3838 0011665 226.2675 292.1349 12.53601347792765"};
Далее:/ Create a TLE object using the data above
cTle tleSGP4(tle_data[0], tle_data[1], tle_data[2]);
// Create a satellite object from the TLE object
cSatellite satSGP4(tleSGP4);
vector<cEci> vecPos;
Теперь:
// Указываем дату и время в которой мы хотим получить координаты (позицию и скорость) спутника.
// Использую конструктор для формирования Юлианской даты. cJulian julian(2015,9,24,15,33,00);
cEciTime eci = satSGP4.PositionEci(julian);
vecPos.push_back(eci);
Теперь вывожу орбитальные элементы в м и м/с:printf("Coordinate and velocity ECI: \n\n x = %16.8f \n y = %16.8f\n z = %16.8f\n",
vecPos[0].Position().m_x*1000.0,
vecPos[0].Position().m_y*1000.0,
vecPos[0].Position().m_z*1000.0
);
printf("\n vx = %15.8f \n vy = %15.8f\n vz = %15.8f\n",
vecPos[0].Velocity().m_x*1000.0,
vecPos[0].Velocity().m_y*1000.0,
vecPos[0].Velocity().m_z*1000.0);
Далее реализовал функцию перевода ECI в ECEF:void ECI2ECEF(double x, double y, double z,double t,
double &X, double &Y, double &Z, bool CorV)
{
double W = 0.000072921151467;
double s_zv = W * t;
double cos_s = cos(s_zv);
double sin_s = sin(s_zv);
X = x * cos_s + y * sin_s;
Y = -x * sin_s + y * cos_s;
Z = z;
if(CorV == true)
{
X = X + W * Y;
Y = Y - W * X;
}
}
сигнатура следующая: x y z - ECI , X Y Z - ECEF , t - время в которое необходимо получить орбитальные элементы (поз и скор),
CorV - координаты или время
Ну и соответственно перевод из ECI в ECEF:// Время на момент определения координат - Обычное время минус 3 мин 56 сек (звёздное)
double t = 33*60 + 15*60*60 - (3*60 + 56);
double ECEF_x, ECEF_y, ECEF_z;
ECI2ECEF(vecPos[0].Position().m_x*1000.0,
vecPos[0].Position().m_y*1000.0,
vecPos[0].Position().m_z*1000.0,
t,
ECEF_x,
ECEF_y,
ECEF_z,
false);
double ECEF_vx, ECEF_vy, ECEF_vz;
ECI2ECEF(vecPos[0].Velocity().m_x*1000.0,
vecPos[0].Velocity().m_y*1000.0,
vecPos[0].Velocity().m_z*1000.0,
t,
ECEF_vx,
ECEF_vy,
ECEF_vz,
true);
printf("\n\nCoordinate and velocity ECEF: \n\n x = %15.8f \n y = %15.8f\n z = %16.8f\n",
ECEF_x,
ECEF_y,
ECEF_z
);
printf("\n vx = %15.8f \n vy = %15.8f\n vz = %15.8f\n",
ECEF_vx,
ECEF_vy,
ECEF_vz
);
Ещё небольшой вопрос. Можно ли использовать TLE для геостационарных спутников?
Хотя, судя по сайту
http://www.satflare.com, у меня что то не правильно. Немного различаются ECEF.