A A A A Автор Тема: ECI to ECEF from TLE  (Прочитано 4205 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
ECI to ECEF from TLE
« : 08 Окт 2015 [15:43:52] »
Здравствуйте. Не подскажите как перевести координаты и вектор скорости из ECI в систему ECEF ? В нете много информации но ничего не понятно. Мне просто надо перевести без заморачивания =)))
Использую стороннюю библиотеку для расчёта координат по TLE, но она выводит результат в ECI. Так же не понятен один момент - время после эпохи в минутах. Эпоха - это время в которое были измерены параметры спутника (телеметрия) ? Соответственно как вычислить это время ?

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #1 : 08 Окт 2015 [19:07:18] »
Эпоха - это время в которое были измерены параметры спутника (телеметрия) ? Соответственно как вычислить это время ?
Это момент времени, на который даются орбитальные элементы в TLE. Оно есть в TLE, смотрите описание формата.

Мне просто надо перевести без заморачивания =)))
Rg(1) = R(1) * Cos(S) + R(2) * Sin(S)
 Rg(2) = -R(1) * Sin(S) + R(2) * Cos(S)
 Rg(3) = R(3)
 Vg(1) = V(1) * Cos(S) + V(2) * Sin(S) + W * Rg(2)
 Vg(2) = -V(1) * Sin(S) + V(2) * Cos(S) - W * Rg(1)
 Vg(3) = V(3)

R, V -вектора положения и скорости в  ECI.
Rg, Vg - вектора положения и скорости в гринвической системе координат.
S - звездное время на момент времени, соответствующий векторам положения и скорости.
W  = 0.00007292115  - скорость вращения Земли.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #2 : 09 Окт 2015 [10:48:22] »
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.
« Последнее редактирование: 09 Окт 2015 [11:10:15] от Abraziv »

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #3 : 09 Окт 2015 [12:59:30] »
Так. Кажись немного исправил, но опять же не понятно, с сайтом не сходится.
Время вычисляю как:

        int a = (14 - month) / 12;
   int y = year + 4800 - a;
   int m = month + 12*a -3;


   int JDN = day + (int)(153*m + 2)/5 + (int)365*y + (int)y/4 -
                  (int)y/100 + (int)y/400 - (int)32045;

   int JD = JDN + (int)(hour-12)/24 + (int)min/1440 + (int)sec/86400;
   int d = JD - 2451545.0;
   double T = d / 36525.0;
   double GMST  = 24110.54841 + 8640184.812866 * T +
                 0.093104 * T*T - 0.0000062 * T*T*T;

   double W = 0.000072921151467;
   // Время на момент определения координат

   double t = (hour*60*60 + min*60 + sec)*W + GMST*PI/43200;

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #4 : 09 Окт 2015 [13:07:17] »
Вот для asiasat 4 (точка стояния 122) определил как:
С помощью конвертора ECEF to LLA http://www.oc.nps.edu/oc2902w/coord/llhxyz.htm
Latitude  : -0.00272   deg N
Longitude : 121.49059   deg E
Height    : 42156518901.9   m

а сайт http://www.satflare.com говорит:
Latitude [deg]      0.02   
Longitude [deg]   122.05
Altitude [km]      35784.6   

Ну высота на сайте идет от референц-эллипсойда.

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #5 : 09 Окт 2015 [14:24:42] »
Но мне кажется у вас опечатка в формулах. Неужели аргументами тригонометрических функций являются секунды, может всё таки радианы ? Иными словами мы должны скорость вращения Земли (рад/с) умножить на время S и как раз получим радианы. Так ?
Скорость вращения Земли дает только поправку при вычисления вектора скорости во вращающейся системе координат. Если вам нужны координаты подспутниковой точки, то вектор скорости и не нужен совсем. Аргументом тригонометрических функций является звездное время в радианах.
Уберите этот
double s_zv  = W * t;
бессмысленный ужас :).
И этот double t = (hour*60*60 + min*60 + sec)*W + GMST*PI/43200 тоже.
Звездное время - это и есть GMST, оно вычисляется как функция от юлианской даты.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #6 : 09 Окт 2015 [14:27:47] »
Спасибо за ответ. А есть формулы по которым я смогу вычислить координаты (позицию спутника на орбите и его вектор скорости)?  :)
Мне нужна именно позиция спутника и его вектор скорости именно в ECEF.

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #7 : 09 Окт 2015 [14:34:31] »
Мне нужна именно позиция спутника и его вектор скорости именно в ECEF.
Смотрите ответ 1 в  теме :).
Между ECI и ECEF разница в угле поворота, равном звездному времени. Одна система неподвижна, другая вращается. В векторном виде это выглядит так Rg=Mz(S)*R, где Mz(S)-матрица поворота вокруг оси Z. Если продиффиринцировать это векторное уравнение по времени, то будет формула для вычисления вектора скорости во вращающейся системе координат. Эти формулы и приведены в ответе 1.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #8 : 09 Окт 2015 [14:37:46] »
Все это понятно. Как мне найти S - звёздное время?
Странно конечно, но вычисляя по приведенным мной формулам погрешность по долготе составила примерно пол градуса и по широте в 1 десятую, это совпадение ?

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #9 : 09 Окт 2015 [14:53:00] »
Нашёл вот такие формулы вычисления звездного времени

        double dwhole = 367.0*year-int(7*(year+int((month+9)/12))/4)+int(275*month/9)+day-730531.5;
   double dfrac = (hour+minute/60.0+second/3600.0)/24.0;
   double d = dwhole+dfrac;

   double GMST = 281.46061837+360.98564736629*d;
   GMST = GMST-360*int(GMST/360);
   if(GMST < 0)   GMST = 360.0 + GMST;

   double t = GMST*PI/180.0;

Но по ним все равно получается погрешность аж в один градус по долготе.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #10 : 09 Окт 2015 [15:05:31] »
Короче нашёл метод в тех же библиотеках:
double t = julian.ToGmst();

Теперь осталось узнать какую дату надо скармливать в конструктор cJulian
cJulian julian(year,month,day,hour,minute,second);

cEciTime eci = satSGP4.PositionEci(julian);

Вы не знаете случайно ?

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #11 : 09 Окт 2015 [15:07:14] »
Дату и всемирное время то самое, на которые вы вычисляете положение ИСЗ.

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #12 : 09 Окт 2015 [15:12:13] »
Спасибо огромное. Правда отличия с сайтом http://www.satflare.com/track.asp?q=27718#TOP всё равно есть небольшие.

Вот что получилось у меня для азиасата 4

Latitude,Longitude, Height (ellipsoidal) from ECEF

Latitude  : -0.00272   deg N
Longitude : 121.98339   deg E

сайт даёт следующее
Latitude [deg]      0.02   
Longitude [deg]   122.05

И кому верить?=)))

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #13 : 09 Окт 2015 [15:25:57] »
Расхождение на уровне угловой минуты - это не смертельно.
Проверьте, кстати, давность орбиты (tle).

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #14 : 09 Окт 2015 [15:32:43] »
Спасибо Вам. Откуда вы так осведомлены ?

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #15 : 10 Окт 2015 [09:10:04] »
Не подскажите, как рассчитать dF Допплера по известной точке приёма (x y z в ECEF), координатам спутника (ECEF ) и вектору скорости полученному из TLE?
Скажите данные полученные из TLE Vx Vy Vz - это проекции вектора скорости, а вектор выходит из центра ECEF или из ИСЗ ? Судя по значениям выходит из центра.
 Я так понимаю угловая скорость вращения ИСЗ и Земли должны совпадать, но из-за возмущаемых факторов угловая скорость немного отличается (спутник описывает восьмёрку).
 По логике мне необходимо определить угол tau между вектором скорости и прямой соединяющей спутник с точкой приёма пересчитанную на начало координат. Далее по умножаю угловую скорость вращения Земли на расстояние до ИСЗ (Vs), далее вычитаю вычисленную скорость из  модуля скорости полученной  из TLE (Vs').
Потом по формуле
V = ||Vs - Vs'||*cos(tau) - радиальная скорость
dF = V*f0/c

Не уверен в этой формуле правда.
« Последнее редактирование: 10 Окт 2015 [16:13:10] от Abraziv »

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #16 : 10 Окт 2015 [22:49:08] »
Если вам нужна радиальная скорость относительно наблюдателя, то она вычисляется как проекция вектора скорости на топоцентрический вектор:
v_rad=v*cos(tau)
где
v - модуль вектора скорость ИСЗ в гринвической системе координат (ECEF)
tau - угол между вектором скорости и топоцентрическим вектором, вычисляется элементарно через скалярное произведение векторов:
cos(tau)=v*p/|v|/|p|

Топоцентрический вектор (вектор наблюдатель-ИСЗ) p находится тоже просто:
p=r-Robs
где
r - вектор положения ИСЗ в ECEF
Robs - вектор положения наблюдателя в ECEF, тут http://www.astronet.ru/db/msg/1190817/node25.html есть формулы для вектора положения точки на земном геоиде (последние формулы на странице).


Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #17 : 11 Окт 2015 [08:41:48] »
Спасибо за ответ. Эти формулы очевидны, я к ним и сам пришёл. Но мне нужно определить Допплеровский сдвиг частоты,а не скорость. Скажите пожалуйста, если угловая скорость ИСЗ совпадает с угловой скоростью объекта на Земле (Земли), то Допплеровский сдвиг будет равен нулю? Я имею введу, что  скорость ИСЗ больше скорости вращения объекта приёма на Земле, оно и очевидно длина окружности проходимая ИСЗ гораздо больше длины окружности Земли. Так вот Допплер зависит только от угловой скорости? Как вообще его найти, мои формулы верны ? Я исходил из предположения что для одинаковой угловой скорости Допплер равен 0.
Заранее спасибо.
« Последнее редактирование: 11 Окт 2015 [12:14:55] от Abraziv »

Оффлайн AbrazivАвтор темы

  • Новичок
  • *
  • Сообщений: 46
  • Благодарностей: 0
  • Мне нравится этот форум!
    • Сообщения от Abraziv
Re: ECI to ECEF from TLE
« Ответ #18 : 22 Окт 2015 [14:07:22] »
Upsilon Можно ещё спросить? Из TLE согласно модели SGP4 мы получаем реальный вектор линейной скорости с которым двигается спутник на орбите?
Просто по сути спутник на орбите летит с вектором линейной скорости который образуется как сумма вектора скорости удерживающий спутник на орбите (модуль которого определяется как v = R*w0, R - расстояние до спутника, w0 - угловая скорость вращения Земли. Я правильно понимаю?) и второй составляющей, вызванная паразитными силами ? Если я правильно понимаю, как мне получить тот паразитный вектор скорости, из-за которого (как я себе представляю) и возникает эффект Допплера. Если же угловая скорость вращения спутника совпадает с углововай скоростью вращения Земли, то Допплер как я понял не возникает, так (т.е. паразитного вектора скорости нет)?

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: ECI to ECEF from TLE
« Ответ #19 : 22 Окт 2015 [14:25:19] »
Из TLE получается вектор скорости в инерциальной системе координат. Эта система координат с вращением Земли не связана. Если Земля перестанет вращаться, от вектор скорости ИСЗ в ECI не изменится.
Вам всего лишь нужно вычислить лучевую скорость ИСЗ относительно наблюдателя. У вас все для этого есть. Забудьте про угловые скорости, помимо углов есть еще и направления. Работайте с векторами.
А паразитных компонент вектора скорости не существует.