← → / PgUp PgDn — навигация
1 / 20 содержание
Отчёт об исследовании и разработке · июль 2026

StarGlyph

Слепое распознавание участка звёздного неба по фотографии
и наложение карты созвездий на снимок

Как по шумному кадру аналоговой видеокамеры — не зная ни направления, ни поворота, ни поля зрения — определить, куда смотрел объектив, и подписать звёзды, созвездия и планеты. Прототип на Rust + Tauri, проверенный на 20 реальных снимках.

10 / 20
реальных кадров решено вслепую
22.2°±0.4°
поле зрения, восстановленное консистентно
< 1″
точность эфемерид планет (vs JPL Horizons)
~1 мин
пакетная обработка всех 20 кадров
Проект starglyph/engine · v0.1 · разработано агентной командой (Claude Code)
Аннотация

О чём эта работа

Построена полная система слепой астрометрической привязки (blind plate solving): по единственному снимку ночного неба система находит координаты центра кадра, поворот и масштаб, после чего рисует поверх фотографии линии созвездий, подписи ярких звёзд и положения планет.

Конвейер: робастная детекция звёзд на шумном аналоговом видео → сопоставление четырёхзвёздных геометрических паттернов по хэш-индексу (семейство алгоритмов astrometry.net / TETRA[1,2]) → независимая статистическая верификация гипотезы → нелинейное уточнение позы и оптики (Левенберг–Марквардт) → эфемериды планет VSOP87[9]. Критерий приёмки — работа на 20 реальных кадрах камеры видеонаблюдения: решено 10 из 20, остальные честно диагностируются как бедные звёздами.

Формат. Презентация построена как научно-технический отчёт: постановка → метод → эксперименты → результаты → выводы. Все числа — из воспроизводимых прогонов по репозиторию; источники алгоритмов — в конце.
StarGlyph · R&D-отчёт
1 · Постановка задачи

Вход — фотография. Выход — карта неба поверх неё

фото: тёмное, шумноеRA?Dec?roll?FOV?StarGlyphдетекция звёздпаттерны + хэш-индексверификация (log-odds)уточнение (LM)оверлей-геометрияCassiopeiaЮпитероверлей: созвездия, звёзды, планетыRA 1h05m · Dec +60°14′ · FOV 22.3°

Рис. 1. Задача «lost in space»: априори неизвестны все четыре параметра — направление (RA, Dec), поворот кадра (roll) и угловой масштаб (FOV).

  • Blind — никаких подсказок: ни направления, ни времени наведения, ни фокусного расстояния объектива.
  • Неизвестных четыре: RA, Dec, roll, FOV — а сравнивать приходится со 119 626 звёздами каталога HYG[7].
  • Секретный ингредиент точности: звёзды — идеальные маяки, их координаты известны до долей угловой секунды.
  • Та же математика управляет звёздными датчиками ориентации спутников (star trackers)[5] и телескопами-роботами.
Критерий приёмки. Система обязана работать не на синтетике, а на приложенных 20 реальных кадрах (data/input/*.bmp) — шумных, тёмных, с облаками.
StarGlyph · 1 · Задача
2 · Данные

20 кадров аналоговой видеокамеры, 740×576, 8 бит

Кадр как есть — почти чёрный
Рис. 2а. Кадр CD_2011-09-19_0000 как есть: почти чёрный. Полезный сигнал живёт в 2–5 младших градациях из 256.
Тот же кадр после стретча
Рис. 2б. Тот же кадр после перцентильного стретча (p10…p99.95): проступают звёзды Лебедя, зернистый шум и виньетка тракта. Так же работает режим «усиление яркости» в GUI.
  • Серия 23:48–23:52 (13 кадров) — камера панорамирует; на кадр 5–13 детекций.
  • Пара CD_0000/0020 — два кадра одной точки неба с интервалом ~20 с.
  • Серия g128 (5 кадров) — самая богатая: 16–33 детекции, но и облака.
Проверка данных против легенды. Имена файлов (Exp-20m) намекали на 20-минутные выдержки со звёздными треками — измерения кадров показали точечные звёзды и интервалы 10–20 с между файлами. Работаем по данным, а не по именам: это короткие экспозиции.
StarGlyph · 2 · Данные
2.1 · Данные · артефакты

Аналоговый тракт оставляет отпечатки — их надо снять до детекции

Горячий столбец x=4
Рис. 3а. Левый край кадра (×4): яркий «горячий» столбец x=4.
02550x=4: «горячий» (46)x=3: «мёртвый» (0)020406079номер столбца

Рис. 3б. Медиана яркости по столбцам (первые 80): выброс x=4 (горячий) и провал x=3 (мёртвый). Вычитание медианы столбца/строки убирает и это, и полосовой шум чересстрочной развёртки.

Горячие пиксели в трёх кадрах
Рис. 3в. Окрестности точек (221, 448) и (458, 354) в трёх разных кадрах (столбцы). «Звезда», которая не движется вместе с небом, — горячий пиксель сенсора.
Вывод. Часть «детекций» — не звёзды. Дальше конвейер обязан это переживать: фильтры площади и статистическая верификация.
StarGlyph · 2.1 · Артефакты
3 · Детекция звёзд

От пикселей к субпиксельным центроидам

ШагЧто и зачем
1 · Медианы столбцов/строкснимают горячий столбец и бандинг
2 · Mesh-фон 32 pxsigma-clip по ячейкам — идея SExtractor[6]; переживает облака и виньетку
3 · Оценка шумаробастно через MAD: σ = 1.4826·med|I−med I|
4 · Согласованный фильтрсвёртка с гауссианой σ=1.2 px (7×7) — форма PSF звезды
5 · Порог + компоненты2.5σ по свёртке, пик ≥ 4σ; 8-связная разметка
6 · Фильтры блобовядро ≥ 2 px (режет одиночные горячие пиксели), площадь ≤ 150 (облака/Луна), вытянутость ≤ 2.5 (треки), кайма 8 px
7 · Центроидоконный взвешенный, 3 итерации, σw=1.5 px → субпиксельная точность
8 · Отбортоп-40 по потоку; 2 яруса чувствительности (базовый + глубокий для бедных кадров)
Интуиция согласованного фильтра. Свёртка изображения с ожидаемой формой сигнала (гауссова PSF) максимизирует отношение сигнал/шум для точечного источника — та же идея, что в радиолокации. Порог применяется уже к свёрнутому полю.
33 детекции на кадре g128_40ms_1s
Рис. 4. Кадр g128_40ms_1s (стретч): 33 принятых детекции. Облако в левом верхнем углу корректно не порождает ложных звёзд — его убивают mesh-фон и фильтр площади.
StarGlyph · 3 · Детекция
4 · Слепое отождествление

Почему нельзя «просто перебрать» и что придумали вместо

Перебор гипотез «в лоб» безнадёжен: ~10³ перекрывающихся направлений × ~10² углов поворота × ~10¹ масштабов — порядка 10⁶ поз, и каждую надо сверить с каталогом. Ключевая идея семейства astrometry.net[1] — обратить задачу:

  • заранее вычислить для каталога геометрические коды малых групп звёзд, инвариантные к повороту и масштабу;
  • сложить их в хэш-индекс;
  • на кадре построить те же коды из детекций и искать совпадения за ~O(1).

Каждое совпадение — это сразу гипотеза позы: какие звёзды каталога соответствуют каким точкам кадра. Осталось её проверить (след. слайды).

Родословная. Треугольники и «пирамиды» звёздных датчиков[5] → непрерывные 4-звёздные коды astrometry.net[1] → хэш-таблицы отношений рёбер TETRA[2] → движок tetra3 (ESA)[3]. StarGlyph использует Rust-порт tetra3[4], обёрнутый собственной верификацией и уточнением.
кадр (детекции)каталог (другой масштаб и поворот)код (инвариант)хэш-таблица паттерноводна ячейка → гипотеза позысоответствия кадр ↔ каталог

Рис. 5. Вместо прохода по пространству поз — индексирование инвариантов: похожие четвёрки звёзд попадают в одну ячейку хэш-таблицы независимо от поворота и масштаба кадра.

StarGlyph · 4 · Слепое отождествление
4.1 · Слепое отождествление · паттерны

Код четвёрки: шесть расстояний → пять отношений

d4d3d5d6d1d2ABCDd₆ — наибольшее ребро (нормировка)code = (0.57, 0.61, 0.65, 0.86, 0.89)

Рис. 6. Четыре звезды дают 6 попарных расстояний. Сортируем, делим на наибольшее — остаются 5 чисел в (0, 1], одинаковых для кадра и каталога.

code(A,B,C,D) = ( d₁/d₆, d₂/d₆, d₃/d₆, d₄/d₆, d₅/d₆ ),  d₁ ≤ … ≤ d₆
  • Инвариантность: поворот и масштаб не меняют отношений расстояний — неизвестные roll и FOV исчезают из поиска.
  • Квантование кода задаёт ячейку хэш-таблицы; допуск сопоставления ~0.5–0.6% на компоненту.
  • Масштаб восстанавливается после совпадения: отношение углового размера каталожной четвёрки к пиксельному даёт фокус/FOV.
  • Поза — из соответствий «кадр ↔ каталог» задачей Вахбы (оптимальное вращение, кватернион).
  • Ложные совпадения неизбежны (шум, горячие пиксели) — поэтому дальше обязательна верификация.
Почему 4, а не 3? Треугольников слишком много и они слишком похожи друг на друга: у четвёрки код длиннее (5 компонент против 2) — экспоненциально меньше случайных коллизий в индексе.
StarGlyph · 4.1 · Паттерны
4.2 · Слепое отождествление · стратегия поиска

Не одна база, а спектр: полосы FOV и лестница попыток

10152230406070поле зрения (FOV), градусы — логарифмическая шкалабаза-разведчик 10–70° · грубая, лёгкая← плотная полоса 17–30°1200 паттернов/поле · m ≤ 6.515°25°40°60°слепые затравки 15 / 25 / 40 / 60° (±35%) + узкий заход 22°±5°лестница префиксов (ярчайшие детекции):8→10→12→16→20→30

Рис. 7. Стратегия перебора масштабов. База-«разведчик» покрывает 10–70°; если уверенного решения нет — на лету строится плотная полоса 17–30° (1200 паттернов на ячейку неба, звёзды до m≤6.5), заточенная под узкое поле этих камер. Обе базы генерируются из HYG при первом запуске (~1 мин) и кэшируются на диск.

  • Лестница префиксов [8, 10, 12, 16, 20, 30]: сначала пробуем 8 ярчайших детекций, затем расширяем. Яркие центроиды точнее, а шумовой хвост (горячие пиксели!) не успевает отравить четвёрки.
  • Порядок попыток: трек-подсказка (если есть) → FOV-подсказка → узкий поиск 22°±5° → слепые затравки 15/25/40/60° (±35%) → плотная полоса.
  • Подсказки — это ускорение, а не допущение: пакетный прогон стартует полностью вслепую.
Инженерный компромисс. Плотность паттернов × предел зв. величины × полоса FOV = размер базы и время генерации. Выбранная конфигурация — баланс: сотни МБ кэша и секунды на кадр вместо гигабайт и минут.
StarGlyph · 4.2 · Мультимасштаб
5 · Верификация

Сырому решению верить нельзя — проверяем всей картинкой

Гипотезу позы проверяем независимо от движка: проецируем в кадр все звёзды каталога до m≤6.8 и считаем, сколько из M детекций легло на предсказанные позиции (радиус 3 px). Каждая детекция — испытание Бернулли:

log-odds = H·ln0.85p + (M−H)·ln0.151−p,   p = M·πr²W·H

0.85 — полнота (вероятность, что реальная звезда попала в свой кружок при верной позе); p — вероятность случайного попадания (площадь кружков к площади кадра).

Числовой пример (кадр g128_40ms_1s): M=33 детекции, r=3 px, кадр 740×576 → p≈0.0022; совпало H=13.
log-odds = 13·ln(388) + 20·ln(0.150) = 77.5 − 37.9 = +39.6 — случайной позе такое не светит (порог +18 ≈ 10⁸:1).
порог +1823:50:14+37.923:51:03+40.523:51:33-13.3 ★23:51:48-15.4 ★CD 0000+30.5CD 0020+30.5g128 1s+39.6g128 2+24.9g128 3h+19.1g128 4-0.7 ★★ принят жёстким гейтом движка (совп. ≥ 6, P<10⁻⁵) + H ≥ 6

Рис. 8. log-odds десяти решённых кадров. Правило приёма двухканальное: log-odds ≥ 18 и H ≥ 6, либо жёсткий гейт движка (совпадений ≥ 6, вероятность ложного срабатывания < 10⁻⁵) плюс H ≥ 6. Второй канал спас три настоящих решения, которым глубокий шумовой хвост детектора утащил log-odds в минус.

StarGlyph · 5 · Верификация
5.1 · Уточнение

Левенберг–Марквардт: поза, фокус и урок про дисторсию

По инлаерам минимизируем пиксельные невязки по пяти параметрам θ = {RA, Dec, roll, f, k₁} с радиальной моделью дисторсии:

x = cx + f·u·(1 + k₁r²),   y = cy − f·v·(1 + k₁r²)
  • Демпфированный Гаусс–Ньютон (LM): шаг (JᵀJ + λI)δ = Jᵀres.
  • k₁ при FOV≈22° слабо идентифицируем: без регуляризации один и тот же объектив «получал» k₁ разных знаков от кадра к кадру — фит впитывал шум центроидов.
  • Лечение — мягкий прайор k₁ ~ N(0, 0.1): дополнительная строка резидуалов с весом 10. Настоящий многоточечный сигнал дисторсии он не задавит.
  • Итог по кадрам: RMS невязок 0.9–1.7 px на 740×576.
Кейс «звёздная вспышка». На одном кадре оверлей выпустил лучи через весь экран. Причина: при k₁<0 функция r·(1+k₁r²) немонотонна — за пиком дальние точки неба «отражаются» обратно в кадр. Лечение — геометрический предохранитель: точка невидима, если r² ≥ −1/(3k₁).
0.51.01.52.00.51.0истинный угловой радиус u = r/f (недисторсированный)радиус на снимкерадиусы, попадающие в кадр (FOV 22°)k₁ = 0пик: u* = √(−1/3k₁) ≈ 1.13«зеркальный двойник»: точка в 60°+ от осипроецируется внутрь кадра → лучи-«вспышка»отбрасывается: r² ≥ −1/(3k₁)

Рис. 9. Радиальная модель при k₁=−0.26: после пика (u*≈1.13) кривая заворачивает — математически корректные проекции физически бессмысленны. Красная зона отбрасывается предохранителем; это и был источник «вспышки».

StarGlyph · 5.1 · Уточнение
6 · Каталог во времени

Звёзды движутся: эпоха кадра ≠ эпоха каталога

HYG хранит позиции на эпоху J2000 и собственные движения (μα*, μδ). При загрузке каталога позиции сдвигаются на эпоху кадра (из имени файла) векторно, без сингулярностей у полюсов:

u′ = normalize( u + Δt·(μα*·ê + μδ·n̂) )

u — единичный вектор звезды; ê, n̂ — восточный и северный орты касательной плоскости; Δt — годы от J2000. Тест-якорь: звезда Барнарда, ~10.3″/год.

А прецессия, нутация, аберрация? Сознательно не моделируются: солвер подгоняет позу в той же системе J2000/ICRS, в которой задан каталог, и эти плавные развороты кадра поглощаются самой подгонкой. Моделировать их отдельно значило бы чинить то, что не сломано.

Проверка конвенций — тестами, не верой

  • Геометрия (проекция, базис камеры, кватернионы) написана в f64 и кросс-проверена против независимой реализации симулятора (dev-зависимость в тестах).
  • Сквозные тесты: синтетический кадр из каталога → детекция → решение → сравнение позы с «истиной».
  • LM-тест: возмущаем позу/фокус/k₁ — уточнение обязано вернуться к истине.
  • Всего в прототипе 56 автотестов; clippy в режиме -D warnings.
StarGlyph · 6 · Каталог во времени
7 · Планеты (задача со звёздочкой)

Эфемериды VSOP87: планеты на снимке без интернета

СолнцеЗемляпланета «сейчас»τ назад — её и видимVSOP87AVSOP87Aлуч зренияτ = |g| / c, c = 173.1446 а.е./сутповтор VSOP87 в момент (t − τ) — одна итерацияэклиптика J2000→ экватор: поворот ε₀=23.44°

Рис. 10. Астрометрическое положение: гелиоцентрические векторы VSOP87A → геоцентрический вектор → одна итерация поправки за световое время (мы видим планету там, где она была τ назад) → поворот из эклиптики в экватор J2000.

  • VSOP87A[9] — аналитические ряды для прямоугольных гелиоцентрических координат в фиксированной эклиптике J2000 (вариант A выбран осознанно: C/D дают координаты «на дату» и смешали бы системы).
  • Световое время: τ = |g|/c, c = 173.1446 а.е./сут; одной итерации достаточно для субсекундной сходимости.
  • Наклон эклиптики ε₀ = 23.439291° (IAU 1976)[10].
  • Сверка с JPL Horizons[14] (астрометрические RA/Dec ICRF, 2011–2026): расхождения — доли угловой секунды.
  • Блеск — фазовые полиномы Астрономического альманаха (для размера маркера).
Честность про Луну. Направление — усечённый ряд ELP-2000/82[11], ~0.1° геоцентрически. Но суточный параллакс до 0.95° (зависит от места наблюдателя) не учитывается — поэтому маркер Луны в приложении помечен «≈». Для звёзд и планет параллакс пренебрежим.
StarGlyph · 7 · Планеты
8 · Приложение

Rust-ядро + Tauri v2: один движок для CLI и GUI

starglyph-clisolve · batch-solvedetect · overlayприёмка и отладкаapps/desktop (Tauri v2)commands: load / solve / pngпрогресс: ipc::Channelsolve в spawn_blockingPNG бинарным Responseui (static)canvas-слоизум/пан · стретчслои оверлея · tzstarglyph-core — вся наукаcatalog (HYG + собств. движения) · constellations (d3-celestial)image_input · detect · geom (f64) · index+solve (tetra3 + верификация + LM)overlay (проекция в пиксели) · ephem (VSOP87/ELP) · contracts (DTO)данныеHYG v4.2 (.csv.gz) · созвездия (GeoJSON)кэш баз паттернов (bootstrap + dense)simulator-core (фаза 1)синтетика: не смешивается с распознавателем,конвенции геометрии сверены тестами

Рис. 11. Вся наука — в starglyph-core; CLI и десктоп — тонкие оболочки над ним. Симулятор синтетики (фаза 1) архитектурно отделён от распознавателя и делит с ним только конвенции геометрии (сверенные тестами).

  • Tauri v2[15]: фронтенд — статические HTML/CSS/JS без npm и фреймворков; вся тяжесть — в Rust.
  • Решение — в spawn_blocking + rayon; прогресс стадий — типизированный ipc::Channel.
  • Кадры в webview — бинарным Response (PNG), без base64-оверхеда.
  • Просмотр: canvas-слои (изображение / оверлей), зум/пан, стретч-переключатель, слои созвездий/подписей/планет/сетки, часовой пояс с пересчётом оверлея без повторного решения.
  • Headless-приёмка: starglyph-cli batch-solve и запуск GUI с --auto-solve.
StarGlyph · 8 · Приложение
8.1 · Приложение · интерфейс

Результат глазами пользователя

StarGlyph: Кассиопея
Рис. 12а. Кадр g128_40ms_1s: «W» Кассиопеи легло на реальные звёзды снимка — Schedar, Caph, Cih, Ruchbah, Segin; карточка решения: RA 1h05m, Dec +60°14′, FOV 22.3°×17.5°, 13/33 звёзд, 1.54 px.
StarGlyph: Лебедь
Рис. 12б. Пара CD_0000: крест Лебедя (Deneb, Sadr, Fawaris) на почти чёрном кадре; включено «усиление яркости».

Дизайн: тёмная астро-тема, чтобы оверлей и снимки читались в темноте; жёлтые кружки — детекции, голубые линии — созвездия; в подвале — атрибуция данных (HYG CC BY-SA 4.0, d3-celestial BSD-3-Clause).

StarGlyph · 8.1 · Интерфейс
9 · Результаты

Приёмка на 20 реальных кадрах: 10 решены полностью вслепую

КадрRA°Dec°Roll°FOV°HRMS pxlog-oddsмс
23:50:1410.58+64.56-40.122.4560.91+37.9106
23:51:0314.82+62.53-13.722.1860.95+40.5103
23:51:3317.01+64.56-19.922.3861.65-13.3 ★1254
23:51:4816.64+58.41-16.522.4461.71-15.4 ★373
CD 0000299.23+45.37-37.522.3161.28+30.5151
CD 0020299.30+45.39-37.522.3261.44+30.5133
g128 1s16.39+60.23-65.622.35131.54+39.6847
g128 252.98+52.84-35.521.63101.11+24.9673
g128 3h55.44+43.80-35.221.6491.08+19.1195
g128 4314.65+36.55+36.221.6761.70-0.7 ★1014

H — сопоставленные звёзды; время — на 4 CPU-ядрах, с прогретым кэшем баз. Полный пакет: ~61 с на все 20 кадров.

21.5°22.0°22.5°медиана 22.32°10 независимых слепых решений · один физический объектив

Рис. 13. Восстановленное поле зрения всех 10 решений: 22.2°±0.4° — один и тот же физический объектив, хотя решения независимы. Это сильный внутренний признак корректности.

Перекрёстные проверки
· пара CD_0000/0020 (одна точка неба): решения совпали до 0.07°;
· серия 23:48–23:52 монотонно дрейфует по небу — камера панорамировала;
· созвездия на оверлеях визуально ложатся на звёзды снимков (рис. 12).
StarGlyph · 9 · Результаты
9.1 · Результаты · анализ отказов

Почему 10 кадров не решились — и почему это честно

0102030948:31749:17749:31649:42749:511050:06950:14950:241150:35851:031351:24851:33951:48серия 23:48–23:52 (панорамирование)12CD 000012CD 0020пара CD33g128 1s29g128 228g128 3h26g128 416g128 5hсерия g128решён вслепуюотказ

Рис. 14. Детекции базового яруса по кадрам (цвет — исход решения). Из каждого столбика ~2 детекции — горячие пиксели. Нерешённые кадры несут 4–6 пригодных звёзд — четвёрок для устойчивого паттерна из них почти не собрать.

Негативный эксперимент. Гипотеза: поднять предел базы m6.5 → m7.0 — больше каталожных звёзд, больше шансов на бедных кадрах. Результат: те же 10/20 (медиана FOV не сдвинулась), базы тяжелее в разы. Отклонено и задокументировано: узкое место — в данных (звёзд на кадре мало), а не в полноте каталога.
Отказ — тоже результат. Система не выдаёт ложных поз: неудача диагностируется кодами «слишком мало звёзд» / «нет уверенного сопоставления». Рычаги на будущее: стекинг соседних кадров серии (+√N к SNR), калибровка дисторсии по уверенным решениям, топоцентрическая Луна.
StarGlyph · 9.1 · Отказы
10 · Выводы

Что показало это исследование

  • Слепая привязка работает на плохих данных: 8-битное аналоговое видео 740×576 с 8–30 звёздами решается за секунды — при условии робастной детекции.
  • Готовый движок ≠ готовое решение. tetra3 дал сопоставление паттернов; продуктом его сделали независимая log-odds-верификация, двухканальное правило приёма и LM-уточнение с регуляризацией.
  • Статистика важнее эвристик: явная вероятностная модель (Бернулли, полнота 0.85) и спасла настоящие решения, и не пропустила ложных.
  • Геометрия проверяется перекрёстно: консистентный FOV (22.2°±0.4°), сходимость co-pointed пары до 0.07°, визуальное попадание созвездий.
  • Модель камеры — до границы применимости: немонотонность радиальной модели при k₁<0 — реальная ловушка, найденная на реальном кадре.
  • Честная диагностика отказов ценнее натянутых решений: нерешаемые кадры объяснены данными и подтверждены негативным экспериментом.
10/20
кадров вслепую
0
ложных решений
0.9–1.7 px
RMS невязок
56
автотестов
<1″
планеты vs Horizons
StarGlyph · 10 · Выводы
Источники

Литература, данные, инструменты

  1. Lang D., Hogg D. W., Mierle K., Blanton M., Roweis S. Astrometry.net: Blind Astrometric Calibration of Arbitrary Astronomical Images. The Astronomical Journal 139(5), 1782–1800 (2010). arXiv:0910.2233.
  2. Brown J., Stubis K., Cahoy K. TETRA: Star Identification with Hash Tables. Proc. 31st AIAA/USU Conf. on Small Satellites, SSC17-VIII-1 (2017).
  3. Pettersson G. et al. tetra3 — a fast lost-in-space plate solver for star trackers. ESA, github.com/esa/tetra3.
  4. tetra3 — Rust-порт движка, crates.io/crates/tetra3, v0.8.0. Лицензии MIT / Apache-2.0.
  5. Mortari D., Samaan M. A., Bruccoleri C., Junkins J. L. The Pyramid Star Identification Technique. Navigation 51(3), 171–183 (2004).
  6. Bertin E., Arnouts S. SExtractor: Software for source extraction. Astronomy & Astrophysics Suppl. 117, 393–404 (1996) — mesh-фон, sigma-clipping.
  7. Nash D. The HYG Database v4.2 (компиляция Hipparcos, Yale BSC, Gliese). astronexus.com/hyg · CC BY-SA 4.0.
  8. ESA. The Hipparcos and Tycho Catalogues. ESA SP-1200 (1997).
  1. Bretagnon P., Francou G. Planetary theories in rectangular and spherical variables. VSOP87 solutions. Astronomy & Astrophysics 202, 309–315 (1988); Rust-крейт vsop87 v3.
  2. Meeus J. Astronomical Algorithms, 2nd ed. Willmann-Bell (1998) — гл. 22, 25, 33, 47.
  3. Chapront-Touzé M., Chapront J. The lunar ephemeris ELP 2000. Astronomy & Astrophysics 124, 50–62 (1983).
  4. Levenberg K. (1944); Marquardt D. W. (1963) — метод демпфированных наименьших квадратов. Quart. Appl. Math. 2, 164–168; J. SIAM 11(2), 431–441.
  5. Frohn O. d3-celestial — данные линий созвездий (GeoJSON). github.com/ofrohn/d3-celestial · BSD-3-Clause.
  6. JPL Horizons System — эталонные эфемериды для сверки. ssd.jpl.nasa.gov/horizons.
  7. Tauri v2 — каркас десктоп-приложения. tauri.app.
  8. Liebe C. C. Star trackers for attitude determination. IEEE Aerospace and Electronic Systems Magazine 10(6), 10–16 (1995).
Воспроизводимость. Код, данные и этот отчёт: github.com/starglyph/engine · приёмка: cargo run -rq -p starglyph-cli -- batch-solve ../data/input · лицензии данных: THIRD_PARTY_LICENSES.md. Снимки в data/input/ — собственность автора проекта.