Песочница орбит¶
Страница /orbit-sandbox/ — инструмент для работы с орбитальными элементами без
привязки к каталогу портала: разобрать TLE на параметры и собрать обратно, рассчитать
предварительную TLE для будущего запуска, посмотреть трассу на глобусе на любое время и
получить прогноз пролётов. Доступна без входа. Все расчёты, кроме пролётов, выполняются
в браузере (network/static/js/orbit_math.js, satellite.js); пролёты считает сервер
теми же функциями skyfield, что и страница станции.
Форматы¶
На вход принимаются, с автоопределением по первому символу:
Формат |
Признак |
Примечание |
|---|---|---|
TLE, 2 или 3 строки |
строки, начинающиеся с |
Проверяются длина 69, контрольные суммы, совпадение номеров |
Alpha-5 |
буква в колонках 3–7 |
Номера от 100000 ( |
GP JSON |
|
Запись CelesTrak/Space-Track ( |
OMM XML |
|
CCSDS OMM, теги с теми же именами полей |
На выход — вкладки TLE, Alpha-5, JSON и OMM XML с кнопкой копирования. Для номеров до 99999 вкладки TLE и Alpha-5 совпадают.
Орбитальные параметры¶
Форма показывает элементы TLE: эпоху, среднее движение (козаевское, об/сут),
эксцентриситет, наклонение, долготу восходящего узла, аргумент перигея, среднюю
аномалию, B*. Высоты перигея и апогея, период, большая полуось и скорость — производные,
их считает SGP4 (satrec.a, alta, altp), поэтому они относятся к средним элементам.
Правка любого поля пересчитывает остальные и TLE. Правка высот перигея и апогея даёт
среднее движение через обращение формулы инициализации SGP4:
a = (hp + ha) / (2·R⊕) + 1
e = (ha − hp) / (ha + hp + 2·R⊕)
n = ke · a^−3/2
δ = 0.75 · J2 · (3cos²i − 1) / (a² · (1 − e²)^3/2)
n_TLE = n · (1 + δ)
Без множителя (1 + δ) — так делал faketle из sattools — орбита 500 км получается на
несколько километров выше или ниже заданной.
Расчёт TLE для запуска¶
Исходные данные: космодром (справочник из sattools или координаты), время пуска T0,
задержка Δt до прохода трассы над площадкой (по умолчанию 300 с), направление
выведения (на север — восходящий участок, на юг — нисходящий), высоты перигея и апогея,
наклонение, аргумент перигея, B*.
Алгоритм (launch_elements в orbit_math.js):
Эпоха
T = T0 + Δt; среднее движение и эксцентриситет — из высот, как выше.Геодезическая широта площадки переводится в геоцентрическую:
φ = atan((1 − f)² · tan φ_gd),f = 1/298.26.Аргумент широты
u = asin(sin φ / sin i); для нисходящего участкаu = π − u. Если|sin φ| > sin i, орбита над площадкой не проходит — ошибка.Смещение по долготе от узла
Δλ = atan2(cos i · sin u, cos u); долгота восходящего узлаΩ = GMST(T) + λ − Δλ.Средняя аномалия — из истинной
ν = u − ωчерез уравнение Кеплера.Две итерации уточнения: элементы прогоняются через SGP4 на момент
T, по фактической подспутниковой точке считаются те же(Ω, u), разность прибавляется. Это снимает короткопериодические члены J2 и разницу средних и оскулирующих элементов; итоговая ошибка положения меньше 0,001°.
Перенос пуска — просто новое T0: плоскость поворачивается вместе со звёздным временем
(≈ 0,9856° в сутки), отдельного инструмента вроде launchtle не нужно. Такая TLE
описывает орбиту только после выведения; всё, что раньше эпохи, — фикция. Высота в
строке «Положение» — оскулирующая и отличается от средней на величину до ±10 км.
Расчёт TLE по вектору состояния¶
Когда в документации на пуск есть вектор положения и скорости на момент отделения, он точнее геометрии над космодромом. Блок принимает X, Y, Z (км), VX, VY, VZ (км/с), время пуска, смещение до отделения в секундах и систему координат вектора:
Система |
Что делается |
|---|---|
Гринвичская, зафиксированная на момент пуска |
Инерциальная система с осью X на меридиане Гринвича в момент КП (так даны параметры в российских документах на пуск). Поворот вокруг Z на GMST момента пуска даёт TEME |
J2000 |
Прецессия IAU-76 к среднему экватору и равноденствию даты; нутацией (≈1″) пренебрегаем |
TEME |
Без преобразования |
Алгоритм (state_elements в orbit_math.js, аналог rv2el из sattools):
Вектор в TEME → оскулирующие элементы (a, e, i, Ω, ω, ϑ) классической процедурой.
Средние элементы SGP4 ищутся итерацией: элементы прогоняются через SGP4 на эпоху, из полученных r, v считаются оскулирующие, разность с целевыми прибавляется к средним. Для околокруговых орбит e и ω по отдельности плохо обусловлены (короткопериодический член J2 — постоянное смещение вектора эксцентриситета, и поправка по e уводит его в минус), поэтому итерация идёт по вектору эксцентриситета (e cos ω, e sin ω) и аргументу широты u = ω + M. Шесть проходов дают невязку по положению в десятки метров.
Среднее движение — козаевское из средней большой полуоси (см. выше).
Оскулирующие элементы и невязка показываются под кнопкой: их можно сверить с таблицей в документе (большая полуось, e, i, Ω, ω, ϑ, оскулирующий период). Средняя большая полуось в TLE отличается от оскулирующей на несколько километров — это и есть причина, по которой оскулирующие элементы нельзя записывать в TLE напрямую.
Пролёты¶
GET /orbit-sandbox/passes/ (только AJAX, без входа) принимает tle1, tle2, start
(ISO 8601, по умолчанию сейчас), hours (до 48 для точки, до 24 для станций),
min_horizon и mode: stations — подключённые станции с координатами, point —
lat, lon, alt. Ответ — список пролётов, отсортированный по восходу:
[{"station": {"id": 1, "name": "…", "lat": 55.7, "lon": 37.6},
"rise": "…", "rise_az": 229.0, "tca": "…", "tca_alt": 45.0,
"set": "…", "set_az": 40.0}]
Для своей точки station равен null. Пролёт, начавшийся до start, в ответ не
попадает. Один адрес может сделать 30 запросов в минуту; сверх этого — 429.
Файлы¶
network/base/views/orbit_sandbox.py— страница и эндпоинт пролётов.network/static/js/orbit_math.js— чистая математика, единственный форматтер TLE на JS в проекте; тесты вtests/js/orbit_math.test.jsпротив satellite.js, в том числе на векторе состояния из реального документа на пуск.network/static/js/orbit_sandbox.js— формы, глобус, вызов эндпоинта.network/base/test_orbit_sandbox.py— тесты эндпоинта и кросс-проверка TLE, полученной в JS, питоновским SGP4.