У каждого специалиста в своей области есть профильное ПО. Даже для разработки ПО есть соответствующее ПО. И зачастую большинство специалистов не заботит «открытость» такого ПО. Более того, среди специалистов по разработке/моделированию спутников в России немало встречается авторских решений или решений, специально разработанных для конкретной организации. НО! дальше этого предприятия или даже отдела эти решения никуда не выходят.
Поэтому я хочу рассказать про моделирующую среду для анализа динамики полёта космического аппарата (КА) с открытым исходным кодом – «Проект 42» (далее просто «42»), который использую в своей повседневной профессиональной деятельности.
Небольшое лирическое отступление
Много лет назад, работая в организации ракетно-космической отрасли мой инструмент моделирования был жёстко привязан к этой организации (точнее даже к нашему отделу). Поэтому многие вещи, такие как модель орбитального движения и угловое вращение сложной конструкции я воспринимал как должное, концентрируясь только на самих алгоритмах управления. Каково же было моё разочарование, когда я остался без этого инструмента, уволившись из организации. По сути, алгоритмы управления либо становились сферическими конями в вакууме, либо надо было изобретать велосипед в виде моделирующей среды.
Но выход был найден. Открытое ПО. В частности «42». На тот момент, «42» мне показался наиболее привлекательным из-за его простоты, по сравнению, например, с «Basilisk» (ещё один открытый симулятор динамики КА, который написан на трёх ЯП), и из-за его возможностей – моделирование не только орбитального, но и углового движения и полёт к другим телам солнечной системы.
Подготовка
Первое и самое главное: «42» написан на Си без единой библиотеки, за исключением графики (glew, freeglut). Поэтому собирать его одно удовольствие. Я немного усложню задачу и буду делать это на Windows: то есть мы собираем проект также через Makefile, но с помощью утилиты mingw32-make.
Первое, скачиваем проект с репозитория:git clone https://github.com/ericstoneking/42.git
Далее устанавливаем MinGW (чтобы появилась утилита mingw32-make).
Ниже будет 2 варианта сборки: с GUI и без. Если сразу хочется красивую картину то можно смело пропускать "Вариант без GUI", но надо понимать, что там описаны азы работы с "42".
Вариант сборки "42" без GUI
Устанавливаем пустую переменную GUIFLAG=: и запускаем сборку:mingw32-make GUIFLAG=
Должен появится файл 42.exe и при его запуске (без аргументов) появится вывод процесса моделирования.

Обратим внимание на последнюю строку вывода – ускорение процесса моделирования составило 659 раз. Это моя цифра, у вас будет другая.
Поясню, что произошло – запуск моделирование аппарта. Какого аппарата? Спросите Вы.
Когда запускается исполняемый файл 42 (без аргументов!), то по умолчанию директорией с исходными данными (ИД) будет ./InOut. Здесь есть файлы с расширением txt, а есть файлы 42 (и ещё парочка csv). txt – это файлы исходных данных, то есть описание сценария и , а файлы с расширением 42 – это файлы с результатами моделирования.
Теперь по структуре файлов ИД.
Файл, с которого всё начинается - Inp_Sim.txt. В нём прописан сценарий моделирования и учёт внешних факторов (их параметры), действующие на КА. Также в нём есть ссылки на файл орбиты Orb_LEO, файл спутника SC_Simple и файл команд Inp_Cmd.
Для файла орбиты Orb_<моя орбита>.txt можно задавать
- центральную орбиту, это т.н. задача двух тел, где одно тело – это планета, другое – спутник;
- орбиту «три тела», для учёта взаимодействия трёх тел. Например, Земля-Луна-спутник;
При этом можно задавать орбиту как минимум тремя способами: (а) привычные для российских специалистов – кеплеровские элементы (КЭ), (б) ТЛЕ файл – (НЕ)привычные КЭ закодированные в двух строках (т.н. «двухстрочники»), (в) баллистический вектор состояния – радиус-вектор и вектор скорости.
Так как симулятор «42» изначально позиционировался в целях моделирования углового движения и системы управления уг. движением КА, в файле SC_<мой спутник>.txt в первую очередь представлена информация о параметрах углового движения (тензор инерции КА, нач. скорость и уг. положение) и значительная часть – это описание характеристик датчиковой аппаратуры и исполнительных органов.
Файл команд Inp_Cmd.txt – это последний файл, который указан в Inp_Sim. По сути, это скриптовый файл для «42», шпаргалка по его синтаксису приведена ниже метки EOF. Приведу пример,
%lf SC[%ld] Cmd Angles = [%lf %lf %lf] deg, Seq = %ld wrt %c Frame
Мы хотим для первого (и пока единственного) аппарата на 5000-й секунде моделирования, чтобы одна его ось была сориентирована в центр Земли (в надир), другая – по вектору скорости. В русскоязычной терминологии такая ориентация называется орбитальной или ОСК, в англоязычной LVLH. Тогда в файле Inp_Cmd мы запишем
5000 SC[0] Cmd Angles = [0 0 0] deg, Seq = 123 wrt L Frame
SC[0] – это значит спутник с индексом 0, см. файл Inp_Sim.
wrt L Frame – значит выражено в системе координат L(VLH).
Angles = [0 0 0] – нулевые углы в L(VLH), то есть спутник смотрит строго в центр Земли и по вектору скорости.
Seq = 123 – это последовательность задания углов ориентации. Т.к. углы нулевые (или если углы малы), то последовательность не играет роли. Но в общем случае порядок задания углов важен (в отличие от кватернионов, просто имейте в виду, что в «42» они активно используются и как правило обозначаются q или Q).
Давайте попробуем наш скрипт в деле
<<<<<<<<<<<<<<<<< 42: Command Script File >>>>>>>>>>>>>>>>>
0.0 SC[0] qrn = [0.0 0.0 0.0 1.0]
1000.0 SC[0] qrl = [0.0 1.0 0.0 0.0]
2000.0 Point SC[0].B[0] Primary Vector [0.0 0.0 1.0] at VELOCITY
2000.0 Point SC[0].B[0] Secondary Vector [1.0 0.0 0.0] at SUN
5000 SC[0] Cmd Angles = [0 0 0] deg, Seq = 123 wrt L Frame
EOF
Вы увидите в консоли, что ваша команда учитывается. А как проверить, что КА действительно летает в заданной системе координат? Давайте откроем файлы ./InOut/time.42 и ./InOut/wbn.42. Это файлы моментов времени и угловой скорости спутника. Теперь найдём строку, соответствующую моменту 5000 секунд – это 501-я строка. Мы видим, что после 501-й строки скорость спутника во втором столбце становится гораздо больше, чем в первом и третьем (примерно в 1012) и приобретает постоянное значение -1.131365*10-3.
Прикинем угловую скорость на круговой орбите с высотой h=400 км. Именно такая орбита указана в файле Orb_LEO. Воспользуемся формулой w = (mu/r3), здесь r = h + Re, где Re – средний радиус Земли, mu – гравитационный параметр Земли = 398 600,4415(8) км3с−2
Тогда w = (398 600,4416/(400+6371)3)=0.0011331559…рад/с≈1.13315*10-3 рад/с
Это значение близко к указанному в файле wbn.42.
Вариант сборки "42" c GUI
Конечно, гораздо удобнее анализировать угловое движение через 3D.
Для этого надо собрать «42» с интерфейсом, предварительно установив библиотеки freeglut и glew.
Готовую freeglut с уже собранным DLL для Windows можно найти по ссылке. Обратите внимание что я использую MinGW (не MSVC).
С glew немного посложнее, хотя для него есть также готовый DLL, но у меня он не пошёл и пришлось собирать из исходников. Я руководствовался этой статьёй по сборке и установке glew.
После того как вы «установили» glew и freeglut (по сути просто скопировали lib и h файлы куда надо), необходимо скопировать папки glew и freeglut в 42 (при этом переименовать glew в GLEW).
И ещё важный момент, без которого ничего не соберётся. Открываем Makefile, находим условие со сборкой под Windows (__MSYS__) и задаём для переменной EXTERNDIR текущую папку ./ вместо /c/42ExternalSupport/.
(Возможно, потребуется почистить проект от старой сборки: mingw32-make clean)
Теперь запустим mingw32-make без каких-либо параметров. Должен (опять) появится файл 42.exe. И только сейчас нам понадобятся freeglut.dll (libfreeglut.dll) и glew32.dll. Они должны лежать в той же директории, что и 42.exe. Запускаем.

Чтобы увидеть оси аппарата и ОСК просто поставьте нужные метки (см. красные стрелки).
И в заключении запустим папку Demo, где собрано моделирование нескольких КА на разных планетах. Вводим команду из папки 42: ./42.exe Demo

Это, как можно догадаться, Сатурн, чтобы перейти к другим аппаратам просто нажимайте +/- Host (см. красная стрелка на рисунке выше)

P.S.: планирую написать следующую статью о том, как разработать и протестировать алгоритм управления космическим аппаратом. Возможно кому-то будет интересно, как моделировать группировки – это тема также отдельной статьи. Ну и ещё может быть полезна работа "42" через сокеты и распараллеливание с помощью MPI
Комментарии (3)

agat000
22.04.2026 09:41Зашел тут очередной разговор про орбитальные лифты… А есть такой симулятор, что мог бы показать работу такого шайтан-девайса?
КСП и Орбитер такого не умеют, чтобы просчитать 100-километровый объект с распределенной массой и градиентом сопротивления атмосферы. Может кто то делал “утилитарное” ПО на эту тему?
AndreyDmitriev
Любопытно было бы посмотреть на моделирование полной траектории облёта Луны КА "Артемида-2".
bjfssd757
Я не уверен, но, возможно, именно просчёт траектории лучше делать в GMAT, а в 42 уже запускать симуляцию