По следам Аполлонов на МК-61

До двадцать первого века мой старый МК-61 не дожил, и вместо него я с удовольствием использую эмулятор под Андроид, от Вадима Хохлова. Эта штука вселяет душу моего старого ПМК в бренное тело современного смартфона - чудесная вещь! Для таких, как я, практически "машина времени":)
Вспоминая школьное время, помню первое разочарование от только что приобретённого МК-61 - долгое время расчёта при полётах на “Кон-Тики”. И вторая беда - невозможность сохранять программы после выключения питания. Виртуальная копия ПМК полностью устраняет оба недостатка - позволяет ускорять работу раз в 100, и сохранять состояние памяти вместе с содержимым регистров.

Открываю скан журнала Техника - Молодёжи №9 за 1986г.
...Глядя на пожелтевшие листы, чувствую, как внутри разливается щекочущее приятное чувство. Это просыпается ностальгия по тем временам, когда в середине восьмидесятых, я, двенадцатилетний пионер, листая в школьной библиотеке журнал “Техника - Молодёжи”, наткнулся на странные шифровки - смесь буквенных аббревиатур с математическими символами. Шифровки оказались программами для микрокалькуляторов. И ПМК, и их непонятные шифры сразу вызвали во мне интерес и странное восхищения. Я внимательно прочитал статью, и мои чувства оправдались. Это была настоящая магия: загружая шифрованные заклинания в память ПМК, можно было заставить маленькую счётную машинку унести тебя в космос - на орбиту Луны или других планет.
Дальше были регулярные просиживания в библиотеке с журналами, мечты о собственном ПМК, которые, в следующем году, наконец, осуществились. В старших классах я провел с машинкой много часов, осваивая “космические” программы, пролетев с героями эпопеи “Путь к Земле” на маленьком, не приспособленном к длительным перелётам, лунолёте “Кон-Тики”, все этапы их захватывающего путешествия...

Принимаюсь за изучение первой орбитальной космической программы «Лунолёт 3», наиболее подходящей для реконструкции посадки Аполлона:

00.ИПА 01.ПА 02.ИП7 03.- 04.Fx<0 05.12 06.ИПВ 07./-/ 08.÷ 09.П2 
10.БП 11.36 12.ИП4 13.ИПА 14.÷ 15.F√ 16.ИП7 17.× 18.XY 19.С/П 
20.П9 21.П8 22.П2 23.÷ 24.ИПД 25.ИП8 26.- 27.Fx≥0 28.00 29.ПД 
30.ИП5 31.+ 32.÷ 33.ИП6 34.× 35.П8 36.ИП0 37.ИП8 38.ИП9 39.Fsin 
40.× 41.ИПВ 42./-/ 43.ПП 44.89 45.+ 46.П0 47.ПП 48.93 49.9 
50.0 51.× 52.Fπ 53.÷ 54.ИПА 55.÷ 56.ИПС 57.+ 58.ПС 59.Fcos
60.Fx<0 61.61 62.Fx≥0 63.63 64.С/П 65.ИПВ 66.ИП8 67.ИП9 68.Fcos 69.×
70.ИП7 71.ИПА 72.÷ 73.Fx2 74.ИП4 75.× 76.- 77.ИП0 78.ПП 79.89 
80.+ 81.ПВ 82.ПП 83.93 84.2 85.÷ 86.ИПА 87.+ 88.В/О 89.ИП0 
90.× 91.ИПА 92.÷ 93.+ 94.ИП2 95.× 96.В/О

Выполнение начинается с проверки высоты, и, если она отрицательна, реализуется алгоритм «посадки»: высота делится на вертикальную скорость с обратным знаком, получаем расчётное время прохождения траектории под поверхностью. Знак получается отрицательный, если высота и скорость меньше нуля. Далее управление передаётся на адрес 36, где, очевидно, располагается основной расчетный блок скоростей и координат.
По адресам 12-16 вычисляется корень из результата деления ускорения свободного падения g на текущее расстояние до центра планеты, и умножается на её радиус. Это - формула первой космической скорости для орбиты заданного радиуса. Далее содержимое регистров X и Y меняются местами. При останове на экране оказывается высота, в регистре Y - первая космическая.
После останова, идут три команды записи в память параметров манёвра: угол отклонения вектора тяги от вертикали (в регистр 9), расход топлива (в регистр 8 ), время манёвра (в регистр 2).
Дальше - контрольный блок перерасхода топлива. Если расход больше наличного количества, манёвр блокируется и управление передаётся на начало программы. Если топлива хватает, происходит расчет реактивного ускорения, оно засылается в регистр 8 и используется в основном расчётном блоке, расположенном по адресам 36 - 96.
Помимо основного, в этой программе предусмотрен дополнительный «демонстрационный» останов на шаге 64. Перед этим происходит вызов из памяти содержимого регистра 1 или 3, в зависимости от того, каков знак угловой координаты корабля. В результате получается наглядная индикация двух случаев - «корабль над видимой стороной Луны», «корабль над обратной стороной Луны». Сама проверка, размещённая по адресам 60 - 63, устроена необычно. После проверки по адресу 60, на следующем шаге, как обычно, стоит адрес перехода 61. Необычность в том, что он «ссылается сам на себя». Если условие нарушается, ПМК берёт адрес перехода (61) и передаёт управление на этот адрес. Теперь этот же (!) код программы (61) интерпретируется уже не как адрес, а как код команды ИП1 - извлечение из памяти содержимого регистра 1. Аналогичная ситуация возникает по адресу 63: первый раз код 63 интерпретируется как адрес перехода, второй раз - как код 63, соответствующий команде ИП3!…

Глядя на этот код сейчас, в 2021 году, к ностальгии по школьным годам примешивается изрядная доля восхищения. Подумать только, в микроскопические - по нынешним временам - 96 БАЙТ (без всяких гига-, мега-, кило-!) умещён алгоритм, моделирующий такой непростой процесс, как пилотирование космического аппарата! По современным меркам, (для молодых современных программистов) наверное, даже сложно себе представить, что такое вообще возможно:)

Итак, с алгоритмом разобрались. Вообще-то, произвести посадку можно и без каких-то переделок. Засылаем в регистры исходные данные, скорректированные на основе информации о параметрах лунных модулей, и вперёд... Но есть несколько вещей, которые хочется улучшить:

1) Главный момент, отличающий управление лунным модулем от Лунолёта - это ограничение на максимальную тягу маршевого двигателя. В Лунолётах ограничение было разве что на превышение ускорения в три g, да и то, в орбитальных программах не было и его.
2) В программе КЭИ горизонтальная координата рассчитывается в угловом виде - что вызвано, очевидно, именно потребностью “демонстрационного блока”. В нашем случае, хотелось бы использовать линейный вид координаты, позволяющий контролировать дистанцию до места посадки и точность прилунения.
3) Поскольку регистров у МК-61 на один больше, желательно ещё организовать счётчик времени.
и, наконец -
4) Помнится, в орбитальных программах самым утомительным было долгое «болтание по орбите». Из-за невысокой точности модели, приходилось учитывать ограничение на время манёвра в 100-200 секунд (для эллиптических орбит), при том, что один виток занимал около 6500 секунд. Да и торможение / разгон до орбитальной скорости, с учётом ограничений на расход топлива в 5% от общей массы (см. рекомендации к Лунолётам 1 и 2) занимает немало времени. Можно ли как-то обойти это неудобство, используя возможности МК-61?

Очевидно, что резервы у программы "Лунолёт-3" богатые. Помимо запаса в 9 строк неиспользованного программного кода (с учётом 105 шагов у МК-61), ещё и два «декоративно-прикладных» регистра 1 и 3, в которых хранятся «видеосообщения». Жаль жертвовать такой красотой, но если надо, то придётся. Тут вспоминается заявление самого Коршунова, когда он знакомился с документацией к лунолёту, оснащённому красочными дисплеями - «учтите, я всё это выброшу…»

Начнём с простого:

(2) переход от угловой координаты к линейной.
Как обоснованно утверждала редакция КЭИ, математика - лучшее подспорье для программиста на ПМК, имеющего ограниченные ресурсы) А в данном случае, математика показывает, что переход к линейной величине горизонтального смещения позволяет даже сэкономить несколько шагов программной памяти. Вместо команд перевода в градусы по адресам 49-55 нужно вставить всего лишь деление на двойку, и в результате получим искомую величину горизонтального смещения в метрах.

(3) Счётчик времени.
Для счётчика времени задействуем дополнительный Е-регистр МК-61, и высвободившиеся ячейки программной памяти: ИП2 ИПЕ + ПЕ.

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

Самое простое решение напрашивается сразу: после проверки высоты вставляем две команды: 12.FL1 13.36 - и всего делов! Перед запуском программы записываем в рег.1 единицу, и программа КЭИ будет работать в обычном режиме до тех пор, пока не понадобится "включить автопилот". Всё, что для этого потребуется - заслать число повторов манёвра в П1, после чего ввести обычный манёвр. ПМК, перед штатным остановом, повторит его заданное количество раз, причём проверка высоты будует производиться как положено, после каждого цикла повторения манёвра "автопилотом".

К примеру, для баллистического отрезка пути в 3500 секунд (это примерно половина орбиты, как раз для пролёта от апо- к пери-центру) задаём манёвр командами 35 П1, 0 ПП, ПП, 100 С/П и ждём десяток - полтора секунд при работе ПМК в ускоренном режиме. Невольно подумалось, а почему эта возможность не была реализована редакцией КЭИ ещё тогда, в 80-х? Точно сказать нельзя, но современное воплощение МК-61, в виде полноценного эмулятора, позволяет к тому же ускорять режим эмуляции раз в 100 - и потому грех им не воспользоваться теперь, спустя 35 лет.

В принципе, можно считать проблему решённой, но... как быть, если манёвр не баллистический (то есть двигатель - работает)? В таком случае расчёт тяги и коррекция остатка топлива будет выполнен только на первом цикле автопилота, в последующих циклах будет использоваться постоянное значение тяги из регистра 8. Передать управление на начало блока расчёта реактивного ускорения можно, но перед этим нужно инициализировать стек, заслав в него последовательно расход топлива и время манёвра. Проблема в том, что расход топлива не сохраняется! Изначально расход запоминается в рег.8, но после расчёта реактивного ускорения рег.8 используется уже для него, а величина расхода теряется. Так что, если хотим, чтобы автопилот можно было использовать и при торможениях/разгонах, без использования дополнительного регистра не обойтись никак. Как видим, высвободившийся от графических излишеств рег.3 тут оказывается весьма кстати. Короче говоря, получилось история в духе легендарного Коршунова - "красочные дисплеи" мы без сожаления выбросим, а на их место установим полезный во всех отношениях автопилот :)

(1) ограничение по тяге.
Характеристики посадочной ступени Аполлона 11:
Масса, включая топливо: 10 334 кг.
Масса горючего и окислителя: 8165 кг.
Тяга двигателя: 45,04 кН, дросселирование 10—60 % от полной тяги.
Удельный импульс: 3,05 км/с (311 секунд).

Исходя из этих данных, по формуле для расчёта реактивного ускорения, которая используется в программах КЭИ, можно посчитать:
Fтяги = a/(М+m) = C * dm / t,
и из этого уравнения выразить максимальный удельный расход топлива для двигателя:
(dm/t) = Fтяги / C

Подставляя значения, получаем 45,04 / 3,05 = 14,767 (кг/сек)

Каким образом контролировать максимальный расход? В принципе, можно делать это и в "ортодоксальной" версии программы. Но делать это, каждый раз деля массу на время и сверяя с допустимой величиной, перед вводом очередного манёвра - очень неудобно. Гораздо проще изменить “управляющий” алгоритм таким образом, чтобы пилот задавал не общий расход топлива, а его удельную величину.

Такой подход - а) гораздо больше соответствует реальному управлению тягой двигателя (меняя положение РУДа, пилот, фактически, задаёт именно величину удельного (секундного) расхода топлива, и б) позволяет пилоту самому легко контролировать максимальную тягу - не задавая расход больше предельной величины в 14,767 кг/сек.

В плане именно игровом, можно было бы сделать контроль автоматическим, блокируя перерасход, но пока, будет вполне достаточно положиться на совесть пилота)

Подытожу план модернизации программы "Лунолёт-3"
1. От угловой координаты в рег.С - переходим к линейной.
2. От ввода общего расхода топлива за манёвр - переходим к вводу удельного расхода (кг/сек)
3. Регистры 1 и 3 используем для установки на борт "автопилота": в рег.1 храним кол-во циклов повтора, в рег.3 запоминаем расход.
4. Рег.Е задействуем для счётчика времени полёта.

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