Лунный модуль 1 на МК-61

В результате модификации кода Лунолёта-3 получилась следующая программа:

ЛМ-1

00.ИПA 01.ПA 02.ИП7 03.- 04.Fx<0 05.12 06.ИПB 07./-/ 08.÷ 09.П2
10.БП 11.36 12.FL1 13.20 14.ПП 15.88 16.С/П 17.П9 18.П3 19.П2
20.ИП6 21.ИП3 22.ИП2 23.× 24./-/ 25.ИПD 26.+ 27.Fx≥0 28.16 29.ПD
30.ИП5 31.+ 32.÷ 33.ИП3 34.× 35.П8 36.ИП0 37.ИП8 38.ИП9 39.Fsin
40.× 41.ИПB 42./-/ 43.ПП 44.80 45.+ 46.П0 47.ПП 48.84 49.2
50.÷ 51.ИПC 52.+ 53.ПC 54.ИПE 55.ИП2 56.+ 57.ПE 58.ИПB 59.ИП8
60.ИП9 61.Fcos 62.× 63.ИП4 64.ИПA 65.Fx² 66.÷ 67.- 68.ИП0 69.ПП
70.80 71.+ 72.ПB 73.ПП 74.84 75.2 76.÷ 77.ИПA 78.+ 79.В/О
80.ИП0 81.× 82.ИПA 83.÷ 84.+ 85.ИП2 86.× 87.В/О 88.ИПС 89.ИПО
90.÷ 91.<-> 92.В/О

По адресам 00. - 11. расположен традиционный “посадочный” блок. Две команды по адресам 12. - 13. реализуют цикл “автопилота”. Перед штатным остановом управление передаётся подпрограмме (ПП 88), которая выполняет расчёт времени полёта до цели с текущей горизонтальной скоростью и засылает его в регистр Y. Такое расположение ПП позволяет, прописывая нужный алгоритм расчётов с адреса 88, помимо высоты, выводить при останове вспомогательную информацию, необходимую на разных участках полёта. Получается своеобразный МФД (многофункциональный дисплей), в качестве которого используется содержимое регистра Y, его отображение можно включить в эмуляторе Хохлова. После останова идут команды записи параметров манёвра: угол отклонения тяги от вертикали, удельный расход топлива, время. Расход теперь записывается в П3 и используется при необходимости в цикле автопилота, для пересчёта ускорения и остатка топлива. По адресам 20. - 35. считается реактивное ускорение и сохраняется, как обычно, в регистре 8. По адресам 27 - 28 происходит проверка на перерасход топлива. При перерасходе управление передаётся на адрес 16, а не на 00, как это было в Лунолёте. Иначе, при задействовании автопилота передача управления на адрес 00 приведёт к зацикливанию программы. Из-за быстроты работы эмулятора можно было бы спутать штатный останов с аварийным, но этого не происходит - отрицательная величина при останове всегда указывает, что он нештатный. Расчётный блок, расположенный по адресам 36 - 87, оставлен без изменений, за исключением того, что вместо ускорения свободного падения для экономии программной памяти в формулах использована гравитационная постоянная Луны.

Подготовка регистров.

Перед запуском программы, как обычно, необходимо задать комплект исходных данных, отвечающих ситуации перед посадкой лунного модуля Аполлона 11. Радиус Луны и расстояние от корабля до центра планеты хранятся в регистрах 7 и А. Набираем на клавиатуре усреднённое значение для радиуса: 1738 ВП3 П7. Высота орбиты, на которой произошла отстыковка лунного модуля, судя по отчётам, была около 105,9 км. Набираем 105900 + ПА. В регистрах Д и 5 сохраняем массу топлива и сухую массу корабля в килограммах, взятые из отчёта: 8165 ПД, 6839 П5 (сухая масса включает в себя, естественно, также и полную массу взлётной ступени, с учётом остатка топлива, необходимого для возврата на орбиту). В регистр 6 помещаем скорость истечения продуктов сгорания в м/сек, указанные для лунного модуля - 3050 П6. В регистре 4 сохраняем гравитационную постоянную Луны: 1.62 ИП7 FХ2 х П4. В регистр С засылаем со знаком «минус» дистанцию до места посадки, которая находится на противоположной от нас точке поверхности. Будем считать, что это половина круговой орбиты: ИПА Fπ × (5 792 782,5 м.)/—/ ПС. В регистр О засылаем начальную горизонтальную скорость корабля. Для круговой орбиты это делается командами: ИП4 ИПА ÷ F√ (1629 м/сек) ПО. Напоследок обнуляем вертикальную скорость и счётчик полётного времени - Сх ПВ ПЕ. В регистр "автопилота" обязательно засылаем единицу: 1 П1

Данные введены, запускаем программу командами В/О С/П.

Штатный останов

После останова на экране отображаются наиболее важные на этом этапе параметры полёта: в регистре Х - 105900 (текущая высота в метрах), в регистре У - 3555,9 со знаком «минус» (время полёта до цели с текущей горизонтальной скоростью, в секундах). Знак минус означает, что мы приближаемся к заданной точке, положительная величина будет говорить о «перелёте» и удалении от неё.

Вся остальная необходимая информация хранится в своих регистрах:
Вертикальная скорость , м/сек - ИПВ
Горизонтальная скорость, м/сек - ИПО
Расстояние до цели в метрах - ИПС
Остаток топлива в килограммах - ИПД
Величина реактивного ускорения, м/сек2 - ИП8

Ввод манёвра

После анализа данных, очередной манёвр задаётся следующими командами:
(угол отклонения вектора тяги от вертикали, градусы) ПП (секундный расход топлива, кг) ПП (время, с) С/П.
В отличие от программ КЭИ, в программе ЛМ-1 необходимо задавать не суммарный расход топлива, а его удельную величину (килограммов в секунду). Для посадочной ступени лунного модуля NASA указывает максимальную тягу 45 040 Ньютонов. Фактически, это ограничение связано с максимальным секундным расходом сгораемого топлива. Определить его несложно: 45040 В↑ ИП6 ÷ (14.767). Для лунного модуля это максимальная величина секундного расхода. ПМК не проверяет эту величину, поэтому контроль за её превышением остаётся на совести пилота.
Состояние стека после запуска программы не имеет значения, поэтому при вводе манёвра можно смело использовать вспомогательные расчёты, просматривать содержимое регистров и т.п.

Автопилот

Для включения автопилота, перед запуском очередного манёвра нужно заслать в регистр 1 количество циклов повтора. После отработки и штатного останова, в регистре автопилота остаётся единица, т.е. автопилот автоматически “отключается”.

Аварийный останов

Если при останове в регистре Х оказалась отрицательная величина - это указывает на перерасход топлива. При отключённом автопилоте следует нажать В/О С/П и повторить ввод манёвра. Если перерасход произошёл во время полёта на автопилоте, перед В/О С/П его необходимо отключить - заслать 1 П1. Перед этим можно проанализировать содержимое ИП1, чтобы понять, на каком цикле топливо закончилось.

МФД

В программе ЛМ-1 перед штатным остановом запускается подпрограмма, записанная с адреса 88. В исходном варианте программы она делает вычисление времени, оставшегося до цели. При необходимости, с этого адреса можно прописывать алгоритм расчёта любой нужной нам величины. Так как этот участок программы не связан с основным расчётным блоком, делать это можно “на ходу”, т.е. во время любого штатного останова - подстраивая “показания приборов” под решение текущей задачи. Главное, не забыть поставить в конце дописанного кода команду возврата из подпрограммы (В/О).

Вот теперь всё готово для того, чтобы попробовать повторить посадку лунного модуля Аполлона на поверхность Моря Спокойствия!
Задача: обеспечить мягкую посадку вблизи заданной точки. Мягкой является посадка со скоростью до 3 м/сек. В аварийном режиме NASA гарантирует падение с высоты в 12 метров, что соответствует вертикальной скорости в 6 м/сек. Если же скорость окажется выше, за сохранность модуля поручиться, увы, нельзя…

Метки публикаций: 

Комментарии

Неплохая программа получилась.
Погонял немного, сверил расчеты, при небольших шагах достаточно точно считает.
И "автопилот" тут значительно помогает. Отличная функция! :)

Но, на долгие перелеты этот алгоритм, похоже, не расчитан. Погрешность накапливается весьма серьезная.
Например, после баллистического участка в 3200 сек в примере https://pmk.arbinada.com/ru/node/1588 получается:
С шагом 100 сек: высота 11375 м, скорость горизонтальная 1692.87 м/с, вертикальная -8.50 м/с.
С шагом в 10 сек: 8558 м, 1696.03 м/с, -8.88 м/с.
С шагом в 1 сек: 8326 м, 1696.33 м/с, -8.87 м/с
Интегратор GMAT дает при аналогичных исходных данных (высота/составляющие скорости/грав.постоянная): 8225м, 1696.40 м/с и -8.91 м/с.

Да и просто по формулам при скорости 1606.5 в апоселений на высоте 105,9 км периселений должен быть на высоте примерно 7.2 км, никак не 10-11 км.
В этом и есть главная проблема. Расчитав маневр по стандартной формуле для гомановского трансфера, придется выбирать очень небольшой шаг, чтоб не сильно промахнуться.

Для таких орбитальных траекторий, лучше было бы использовать другие алгоритмы.
В стандартных алгоритмах расчета движения по кеплеровской орбите единственная неточность, которая обычно возникает - это пройденное угловое расстояние за определенное время.
Можно, например, глянуть алгоритм из программы "Гравилет":
https://epizodsspace.airbase.ru/bibl/tehnika_-_molodyoji/1987/5/48-52.html

В идеале, удельный угловой момент (Vгориз*R) и удельная энергия (сумма кинетической V^2/2 и потенциальной -GM/R) должны всегда оставаться константами при расчете баллистического перелета в системе двух тел.

Жаль только, что совместить в одной программе, два алгоритма (один для маневров и второй для более точной баллистики) в МК-61/52 вряд ли реально, учитывая ограничения по количеству шагов программы.

З.Ы. Ввел программу в Free42, прогнал баллистическую траекторию c шагом 0.1 сек, результат: 8229 м, 1696.39 м/с, -8.91 м/с. Практически один в один с GMAT. :)

Упомянул в предыдущем сообщении программу "Гравилет" и пришла в голову мысль, что эта программа как-то не очень заслуженно была обойдена вниманием, хотя идея в ее основе заложена замечательная.
Мне ни разу не попадались примеры решения этой задачи, поставленной перед публикой в том далеком 1987-ом году ("Первое задание КЭИ — вернуться на астероид (то есть в область радиусом порядка 1000 м от начала координат").
Возможно, было в каком-то номере ТМ, но я пропустил. Буду благодарен, если кто вспомнит, где это решение публиковалось.
Поэтому, решил изучить проблему подробней.
Начал с того, что ввел программу (усовершенствованную версию из конца статьи) в Free42 и как обычно начал испытательные полеты и сверку результатов с эмулятором МК-61.
Тут же стало понятно, откуда взялись 1000 м в статье. Примерно такого порядка накапливается ошибка при работе с величинами вроде 1e9 (радиус орбиты астероида) на МК-61.
В Free42 мантисса намного длиней поэтому расхождения в сотни метров пошли сразу же..
Далее, вдохновленный примером реализации автопилота в ЛМ-1, решил добавить этот же функционал в программу на Free42 и сделать вычисления еще точней.
Подошел к реализации немного по-другому, т.к. опыт пилотирования ЛМ-1 показал, что каждый раз вводить кол-во шагов немного утомительно, поэтому решил просто записывыть максимальный шаг в определенный регистр а дальше уже выполнять соответствующее кол-во шагов в зависимости от того интервала, что ввел пользователь.
Получилось на мой взгляд достаточно удобно.
Кроме этого, вместе со скоростью Free42 при таком подходе можно выполнять полеты с мизерным шагом (например, 0.01 сек) и добиваться точности, сравнимой с точностью при применении серьезных методов численного интергирования.
Так же, решил проверить еще и сам алгоритм, применяемый в "Гравилете".
Мало ли что, машина-то действительно инопланетная, аналогов нет. Совсем нет. GMAT менять на ходу гравитацию не умеет, не говоря уже о том, чтоб считать антигравитацию.
Врялся за Python. Попробовал применить PyKep, который здорово помогал расчитывать сложные траектории с грав.маневрами при полетах в Орбитере, но который тут тоже оказался бессилен.
Ну никому, видимо, не считая авторов ТМ, до сих пор не приходило в голову моделировать антигравитацию :)
Пришлось для расчета антигравитации применить SciPy и Рунге-Кутты.
В итоге, алгоритм, используемый в Гравилете, отлично прошел проверку. При небольшом шаге все сходится с точностью до миллиметров.

Полетал пару дней, осваивая инопланетную технику.
Первым делом пришлось отучиваться от привычных шаблонов по части маневров в космосе, вбитых в голову всеми предыдушим симуляторами - от Лунолетов до Orbiter-а и KSP.
Скорей-всего, у Коршунова были похожие проблемы ;)

В итоге, после серии проб и ошибок пришел к выводу, что более-менее оптимальная траектория для возврата на астероид могла бы быть такой:
(время маневра, K-гравитации): (300, 0), (150, 9), (87, -9), (285, 0), (28, 9), (58, 2), (147, 1), (3, 0), (4.9, -1)
Основные тут - первые три маневра (150, 9), (87, -9), (285, 0) , остальное - торможение и маневры у астероида, причаливание.

Визуально траектория выглядит так:
grav

Сам модифицированный Гравилет для Free42/HP-42s/DM42 залил сюда: https://0x0.st/-k6G.zip
Отличия от оригинала только в отключенных видеосообщениях и использовании регистра 01 для "автопилота" (в нем задается максимальный шаг расчета).

Признаться, и я совсем забыл про эту программу! И даже, кажется, не играл в неё раньше - попробую)

Спасибо за отзыв)

По точности - действительно, значительные отклонения получаются от "идеальной" мат.модели. Я пытался встроить расчёт апо-, пери- центра в программу, и столкнулся с тем, что расчётные высоты очень сильно отличаются от тех, куда попадаешь при полёте с шагом в 100 сек.
Действительно, для более-менее приемлемой точности нужно задавать шаг итерации в 1 секунду, но на моём Ксиоми Редми 3S в таком случае полёт будет происходить практически в "режиме реального времени" - 60 расчётных секунд эмулятор обсчитывает за 40 с)))