От орбитальных данных до 3D‑орбиты в браузере: как я делал интерактивную карту спутников

—

от автора

Интерфейс мини игры «Орбитальные миссии»

Визуализация объектов в околоземном пространстве

Intro

Вы тоже стали чаще замечать движущиеся точки света на ночном небе? За последние годы околоземное пространство действительно сильно изменилось. Я разработчик со стажем больше семи лет, около трёх из них работаю в космической отрасли, и даже меня масштабы роста немного пугают.

В конце 2018 года на орбите работало примерно 1957 спутников. Сейчас их уже около 16 тысяч. А общее количество регулярно отслеживаемых искусственных объектов перевалило за 47 тысяч (кроме действующих аппаратов туда входят отработавшие спутники, ступени ракет и обломки).

Но вместе с ростом населения околоземного пространства я почему‑то не вижу сопоставимого роста интереса к нему у обычного человека. Ну летают какие‑то спутники, и что.

Мне кажется, проблема отчасти в способе подачи. Одно дело увидеть таблицу с NORAD ID, высотой и наклонением орбиты, и совсем другое — покрутить Землю, увидеть тысячи объектов вокруг неё, приблизиться к конкретному аппарату или посмотреть целиком на устройство Starlink или разворачиваемую отечественную группировку «Рассвет».

Я загорелся идеей сделать такую визуализацию более доступной для широких масс. И вот тут начинается самое интересное — как это все визуализировать на экране, и главное, как заинтересовать.

Так появился Above Us. И довольно быстро выяснилось, что нарисовать красивую Землю было далеко не самой сложной частью.

Первый шаг

Что для этого нужно? Конечно же, информация о том, какой спутник в какой точке находится в каждый момент времени визуализации. В сфере, где я работаю, информация о положении спутника хранится в виде эфемерид (наборы точек положения спутника в определенные моменты времени). Это точно, надежно, профессионально, но громоздко, к тому же я не нашел, чтобы кто то в открытом доступе предоставлял такие данные. Но благодаря Кеплеру это и не нужно, ведь в кеплеровской модели состояние орбиты на заданную эпоху можно описать шестью элементами.

Как это работает? Очень просто — 5 чисел описывают орбиту:

  • большая полуось. Это размер орбиты. Половина большой оси эллипса. От большой полуоси зависит орбитальный период: чем она меньше, тем больше витков в сутки делает спутник.

  • эксцентриситет. Это форма. Эксцентриситет показывает, круг это или насколько вытянут эллипс.

  • наклонение. Наклон информирует, под каким углом орбита наклонена к экватору.

  • долгота восходящего узла. Разворот. Куда смотрит орбита в плоскости экватора (от точки весеннего равноденствия до восходящего узла — точки, где спутник пересекает экватор с юга на север ).

  • аргумент перигея. Разворот. Задаёт положение перигея внутри плоскости орбиты (перигей — ближайшая к земле точка орбиты).

И только одно число — средняя аномалия, определяет положение аппарата на орбите (к ней прилагается эпоха, то есть момент измерения).

Интерфейс Above Us. Кеплеровы элементы

Интерфейс Above Us. Кеплеровы элементы

Но не все так просто. Если бы Земля была идеально сферической, атмосферы не существовало, а Солнце и Луна не притягивали спутники, то нам достаточно было бы один раз получить параметры орбиты, чтобы всегда знать, где находится объект в любой момент времени.

В реальности орбита постоянно изменяется. На неё влияют несферичность гравитационного поля Земли, атмосферное торможение на низких орбитах, притяжение Солнца и Луны, давление солнечного излучения и другие эффекты.

Поэтому нельзя взять параметры спутника пятилетней давности, прокрутить по законам Кеплера время вперёд и ожидать, что в реальности он будет именно там, где мы рассчитали. Да, есть модель SGP4, умеющая правильно распространять во времени объекты с учётом возмущений, заложенных в модель (об этом ниже), но ее недостаточно. Нужны регулярно уточняемые элементы орбиты и модель.

Так вот, изначально (с 50-х годов), самым распространенным форматом для подобной информации был TLE — дословно это Two‑Line Element Set, то есть двухстрочный набор элементов. В первой строке метаинформация о спутнике и эпоха (момент времени на который актуальна информация), А во второй строке — основные параметры орбиты, близкие по смыслу к кеплеровым элементам и подготовленные для модели SGP4. Но в 2026 году номера NORAD спутников перестали влезать в выделенные для них 5 значные числа. Так что для новых приложений более подходящим стал формат OMM (2009 года) в котором свободно можно выражать все вышеуказанные параметры в виде всеми любимого XML или обычным текстовым KVN. И самое хорошее во всей этой истории то, что такой компактной информацией некоторые готовы поделиться вполне бесплатно.

CelesTrak

Изначально я выбрал CelesTrak как источник орбитальной информации для объектов, потому что во‑первых — он отдает OMM поля в удобных форматах JSON и CSV. Во‑вторых — это бесплатно. В‑третьих — он отдает всю актуальную информацию для всех активных объектов бороздящих просторы космоса. За эти три пункта я очень благодарен Доктору Т. С. Келсо, астродинамику и основателю некоммерческого веб‑сервиса CelesTrak. Я бы выразил свою благодарность через кнопку donate на его сайте, но оплата из РФ ограничена используемыми там платежными системами, да и расценки на донат там не очень для меня подъемные, учитывая что мой проект еще более некоммерческий чем его.

Но тут образовались три проблемы. Во‑первых — для дополнительной информации нужно качать дополнительный каталог. Во‑вторых — не указана страна принадлежности! И в‑третьих — последнее время на этот ресурс возросла нагрузка и они стали жестко отсекать сессии, даже те, которые скачивают в соответствии с описанным ими же регламентом, а тех, кто качает чаще, банят. А моему IP из РФ вообще бессрочно порезали скорость до считанных килобайт в секунду. Но тем не менее это все еще хороший бесплатный вариант для получения информации практически из первых рук (он берет сырые данные из space‑track.org, обогащает их, группирует и переформатирует. Space‑track в свою очередь берет данные напрямую у 18-й эскадрильи космических сил США, которая и проводит наблюдения за объектами).

Поэтому пришлось перейти на

Space‑Track

Точнее, не полностью перейти. В Space‑Track нет информации о том, какие спутники активные, а это очень важно. Как же еще отделить космические аппараты от мусора? Поэтому с CelesTrak я забираю информацию об активных спутниках, а также названия и международные обозначения (у них есть группировка и удобные наименования). Названия и активность спутников меняются редко, поэтому я забираю каталог с CelesTrak раз в неделю. С другой стороны, запуски новых космических аппаратов происходят практически каждый день, поэтому позже, когда добавлю функционал отслеживания пусков, вероятно сокращу интервал или сделаю точечную досылку.

В итоге схема такая:

  • Состав и имена. Берутся из CelesTrak.

  • Орбиты и страна. Берутся из Space‑Track.

  • Новые спутники. Запущенные после снимка списка CelesTrak добавляются из Space‑Track.

  • Если Space‑Track недоступен. Работает один CelesTrak. Страна не показывается, слой мусора сообщает, что данных нет.

Прокрутка времени: модель SGP4

Как говорилось выше, элементы привязаны к определённой эпохе. Но нам нужно знать, где спутник сейчас или через час. Для этого работает SGP4 — это стандартная модель распространения для GP/TLE‑элементов.

Она «проматывает» спутник вперёд или назад по орбите. Идеальная орбита была бы эллипсом, по которому тело ходит вечно. Но реальная орбита меняется, и SGP4 это учитывает:

  • Земля слегка сплюснута, и плоскость орбиты медленно поворачивается.

  • Верхние слои атмосферы тормозят низкие спутники.

  • Притяжение Луны и Солнца слегка сдвигает орбиту.

Поэтому элементы привязаны к эпохе и регулярно обновляются. Чем дальше от эпохи, тем сильнее обычно растёт ошибка, причём скорость её накопления сильно зависит от конкретного объекта и орбиты.

На выходе SGP4 даёт положение спутника (x, y, z) в километрах относительно центра Земли и его скорость. Такая система координат называется TEME.

Поправка на вращение Земли

Эти координаты записаны в «неподвижной» системе, привязанной к звёздам (по заумному — землецентрическая квазиинерциальная система, которая не вращается вместе с Землёй). А Земля под спутником вращается: полный оборот за 23 ч 56 мин.

Поэтому мы вычисляем угол поворота Земли на нужный момент. Для этого используется «звёздное время» (опирается на скорости вращения Земли относительно неподвижных звёзд). Затем мы поворачиваем систему координат так, чтобы она вращалась вместе с планетой. После этого можно сказать, над какой широтой и долготой находится спутник.

«Зачем вращать систему координат вместе с землей, когда у тебя уже есть неподвижная СК?» Да, я перевожу неподвижные координаты в подвижные, потому что так удобнее для задач 3D сцены.

Почему расчёт в браузере и в отдельном потоке

Как я уже говорил, хранить координаты точек (эфемериды) локально — это очень дорого, тем более что они устаревают и обновляются примерно каждый день. Всё считается на клиенте, сервер координат не отдаёт. Сервер только раздаёт орбитальные элементы. Поэтому расчёт вынесен в отдельный поток (Web Worker), чтобы интерфейс не тормозил.

Подробнее

Когда открывается сайт, браузер скачивает с сервера каталог спутников. В нём нет готовых координат, а есть орбитальные элементы. Это короткий «паспорт» орбиты каждого объекта.

Из паспорта нужно получить место на глобусе «прямо сейчас». Для этого браузер запускает фоновый поток (Web Worker), чтобы интерфейс не тормозил. В нём работает модель SGP4 из библиотеки satellite.js. Она берёт паспорт и нужный момент времени и вычисляет, где спутник находится в этот момент. Модель учитывает, что орбита со временем слегка меняется: Земля сплюснута, есть атмосфера, действуют Луна и Солнце.

Ответ модели даётся в системе координат, привязанной к звёздам, а не к Земле. Земля под спутником вращается, поэтому worker делает ещё один шаг. Он поворачивает систему на угол, на который Земля успела провернуться, и после этого позиция привязана к карте. Теперь видно, над какой точкой поверхности находится спутник.

Worker не пересчитывает всё каждый кадр. Основной поток отправляет ему запрос не чаще чем раз в 75 миллисекунд, и только после того, как пришёл ответ на предыдущий. В запросе список видимых объектов и текущее время симуляции. Worker считает всех пачкой, складывает координаты в один массив и возвращает его. Когда массив приходит, основной поток записывает его в геометрию, и точки на экране сдвигаются. Между ответами они стоят на месте, плавной интерполяции нет. Камера и вращение глобуса при этом обновляются на каждом кадре отдельно, поэтому сцена выглядит плавной.

На моем ноутбуке один SGP4 занимает около 0,6–0,7 микросекунды. Расчёт 30 000 объектов занимает около 18 миллисекунд, то есть он укладывается в интервал между запросами с запасом.

Ну вот и готова основа, вокруг которой все должно «завертеться».

Немного о процессе создания

Визуализация спутника на фоне земли в "Орбитальных миссиях" Above Us.

Визуализация спутника на фоне земли в «Орбитальных миссиях» Above Us.

Конечно же не было команды разработчиков разного уровня и года работы, конечно я использовал «Суперинтеллект» в качестве инструмента разработки. Может притянуть негатив, но все же скажу, что те кто делал крупные проекты с помощью современных технологий, ощутил на себе, что ИИ не снимает с человека труд, он просто забирает что может, освобождая силы человека для не менее сложных задач более высокого уровня. Так что делал я этот проект один в лице ПО, ПМ, Тимлида, тестировщика и бизнес аналитика. Уже почти месяц потной работы и миллиарды токенов за спиной. В команде разработчиков Astra, Opus 5.5, Soul 6, Sonnet 5.5 и DeepSeek Flash 4.1 (хорошо себя зарекомендовал). Astra достойна похвалы, с ней мы добились реалистичного вида планеты. Не средствами Cesium и не одной фотографией, натянутой на шар. Это отдельный шейдер GLSL в Three.js, который собирает вид планеты из нескольких текстур и рассчитывает освещение для текущего времени симуляции, чтобы было похоже на правду, а атмосфера не просто давала характерную синеву, но и солнце реалистично краснело на закате. Потом конечно долго и мучительно это все оптимизировалось используя хитрости из геймдева, чтобы визуализация не превращалась в слайд шоу.

В общем этот пост не про ИИ, но все же этот момент я опустить не мог.

Технически сам поток выглядит примерно так CelesTrak/Space‑Track — Fastify/SQLite — React — Web Workers с SGP4 — Three.js/WebGL‑сцена.

Так что получилось?

Получилась основная сцена с двумя режимами — схема, где можно сосредоточиться на спутниках, и реалистичный режим, где можно почувствовать себя космонавтом, глядящим на всю эту картину со стороны. Сцена позволяет увидеть масштаб. Научиться видеть и различать геостационарные орбиты, низкие околоземные, средние и эллиптические орбиты (геосинхронные и геостационарные пока объединяю в одну категорию GEO, но планирую разделить в будущем). Есть предустановленные фильтры для типов орбит, которые сразу на старте подкрасят их разными цветами.

Фильтры для стран. Хотите узнать какая из них оставила больше мусора?) Или визуально оценить долю спутников каждой страны?

Параллельно с фильтрами развилась демонстрация созвездий спутников, GPS, ГЛОНАСС, Starlink, OneWeb, Рассвет и так далее. Есть краткое описание созвездий, принцип действия, визуализация орбит, слоев и даже зон покрытия.

Так же есть функция «Что надо мной?». Это главная фишка сайта. Запрашиваются геоданные, либо вводится город вручную, и показываются только те спутники, которые сейчас находятся в геометрической видимости для пользователя (по 10 градусов над горизонтом и радиус 2,5 тыс. км. Для крупных и ярких низкоорбитальных аппаратов такое расстояние вплоне допустимо). Причем спутники будут отображаться в зависимости от времени суток (для наблюдения спутника Солнце должно быть ниже горизонта как минимум на 6 градусов, а спутник не должен находиться в тени Земли), но это можно отключить.

И конечно же «Уведомления». Вы выбираете спутник, место (можно разрешить геолокацию) и за сколько минут предупредить. Сайт рассчитывает время пролёта и сохраняет напоминание на сервере. Перед пролётом сервер отправляет push‑уведомление в этот браузер, даже если вкладка закрыта. Аккаунт не нужен, это плюс. На другом устройстве уведомление нужно настроить заново, это минус.

Уведомление в действии

Уведомление в действии

Визуализация орбит и кеплеровых элементов. Ну без этого никак, это база.

Получилась анимация, показывающая «Почему спутники не падают?», и даже мини‑игра «Орбитальные миссии», где нужно самостоятельно управлять спутником, чтобы выйти на нужную орбиту. Устройство спутника и механика управления основаны на реальных принципах (управлять спутником как самолетом в игре было слишком просто. я постарался сделать максимально приближенно к реальному как смог — физика полета, количество и мощность двигателей, принципы маневрирования, запас топлива и тд). За миссии даются звезды, но даже я не смог пройти все миссии на три звезды.

Интерфейс мини игры "Орбитальные миссии"

Интерфейс мини игры «Орбитальные миссии»

Работаю над добавлением миссии максимальной сложности аналогичной миссии Артемида-2.

И не знаю что делать с мобильной версией. Невозможно все уместить в такой маленький экран. Там тесно. Будем посмотреть.

Долгий путь к финалу статьи, который должен оставить только заинтересованных

Да, несомненно, в какой‑то мере я демонстрирую результат своего труда, чтобы получить свою порцию дофамина, который даст силы двигаться дальше. Ведь из «попробую, почему бы и нет» это превратилось в «это стало важным для меня, я не знаю что делать с этой ответственностью».

Но в большей степени я здесь за помощью.

Потому что главный вопрос — что бы я ни делал, я не вижу продукт, который действительно что‑то способен популяризировать. Я не достиг цели «дать всем пощупать спутники, чтобы космос стал ближе». Всего этого недостаточно. Я не прав, но я не пойму в чем. Если вы нашли минутку и зашли на Above Us, то прошу также найти минутку и написать: что захотелось сделать первым; что оказалось непонятно; ради чего вернулись бы второй раз; чего не хватило; что выглядит игрушкой.

ссылка на оригинал статьи https://habr.com/ru/articles/1090752/