Я пишу программу, которая преобразует положение в системе координат ECI (CIS, EPOCH JD2000.0) в координаты WGS 84 (CTS, ECEF). Для этого я следую тому, что описано в этом документе , и реализую код C++.
Мои познания в астрофизике очень ограничены, поэтому мне трудно понять некоторые термины. В частности, я не могу правильно понять, как вычисляется среднее по Гринвичу боковое время и почему я всегда получаю разные значения.
Например (при условии, что время 2019-01-01 08:00:00
и дата по юлианскому календарю равны 2458484.833333
):
14:42:45.3766
.14:42:45.350
.06:42:45.379163
(с явным смещениемСогласно уравнениям на странице A-26, GMST зависит от количества юлианских столетий (Tu). Выражение H0 точно такое же, как у CelesTrak для θ(0h). Однако я не могу понять, что на самом деле означает du , или, точнее, почему в документе показано du → ±0.5, 1.5, 2.5...
. Более того, чтобы найти Λ (которое указано в секундах времени ), в выражениях нечетко используются значения в радианах и секундах времени.
Может ли кто-нибудь пролить свет на это?
Для этого я следую тому, что описано в этом документе , и реализую код C++.
Вы используете очень старый документ. Он использует прецессионную модель IAU 1982 года. С тех пор было несколько обновлений. Последний набор изменений направлен на устранение концепции звездного времени по Гринвичу. (С точки зрения программного обеспечения, GMST и GAST являются устаревшими концепциями. Несмотря на то, что они все еще поддерживаются в настоящее время, поддержка будет прекращена в некоторых будущих версиях модели вращения Земли.)
Помимо использования устаревшей версии устаревшей концепции, что вы сделали не так? Выражение, которое вы используете для вычисления GMST, находится вверху страницы A-26:
Обратите внимание, что в уравнении (1) есть несоответствие единиц измерения. Уравнение (2) дает результат в звездных секундах, а уравнение (3), умноженное на время суток, дает результат в радианах. Последнее необходимо преобразовать в звездные секунды. Для этого просто умножьте оба члена в уравнении (3) на :
Применив это к 01 января 2019 года, 08:00:00 UTC, мы получим следующее:
Сноски:
Существует проблема с использованием дат по юлианскому календарю для выражения времени, когда важна высокая точность. Проблема в том, что добавление 2,45 миллиона и изменение времени с полудня 1 января 2000 года приводит к потенциальным проблемам с усечением. Следующая представимая дата по юлианскому календарю после полуночи 1 января 2000 года — это 40 микросекунд после полуночи. Сам я стараюсь держаться на пару порядков в стороне от уровня квантования, что означает проблемы для дат на миллисекундном уровне.
Почти каждый научный пакет, поддерживающий даты по юлианскому календарю, либо использует пару чисел с двойной точностью, либо использует какую-то модифицированную дату по юлианскому календарю, например, время с 12 часов дня 16 ноября 1858 года (опускает первые 2,4 миллиона в дате по юлианскому календарю), время с 12 часов дня 23 года. Май 1968 г. (без учета первых 2,44 миллиона) или время, прошедшее с J2000.
Семестр в уравнениях (2) и (4) более известен как dUT1. В этом разница между UT1 (время, использующее среднее вращение Земли в качестве часов) и UTC (время, которое работает с той же скоростью, что и атомные часы, но иногда с дополнительными секундами, чтобы синхронизировать UT1 и UTC). Эти високосные секунды . Просто игнорируйте термин, если это так, но помните, что доли секунды бессмысленны.
Я вычислил GMST, используя метод, описанный в http://aa.usno.navy.mil/faq/docs/GAST.php . Это должен быть авторитетный источник с точностью до 0,1 секунды.
В псевдокоде:
midnight = floor(2458484.833333) + 0.5 // J0 = 2458484.5
days_since_midnight = 2458484.833333 - 2458484.5 // = 0.333333
hours_since_midnight = 0.333333 * 24 // H = 8.0
days_since_epoch = 2458484.833333 - 2451545.0 // D = 6939.833333
centuries_since_epoch = days_since_epoch / 36525 // T = 0.190002
whole_days_since_epoch = 2458484.5 - 2451545.0 // D0 = 6939.5
GMST = 6.697374558
+ 0.06570982441908 * whole_days_since_epoch
+ 1.00273790935 * hours_since_midnight
+ 0.000026 * centuries_since_epoch**2 //=470.712605328
GMST_hours = 470 % 24 // = 14
GMST_minutes = floor(0.712605328 * 60) //=42(.7563197)
GMST_seconds = 0.7563197*60 // =45.38
Этот расчет согласуется с онлайн-калькулятором. Метод здесь (или как описано по ссылке) должен быть прост в реализации.
Карлес Арагуз
Дэвид Хаммен
бинги
Дэвид Хаммен