Часть 2
Часть 3
Часть фотографий была взята с сайта Hack The Moon.
Статья была представлена на 27-й ежегодной конференции по навигации и управлению Американского Общества Астронавтики (AAS) в Брекенридже, штат Колорадо, 6 февраля 2004. Предлагаемая вам версия содержит дополнительные иллюстрации, комментарии и небольшие исправления.
ABSTRACT: Миссия Аполлон 11 совершила успешную посадку на Луну, несмотря на две проблемы с компьютером, повлиявшие на лунный модуль в период управляемой посадки. Неустранённая проблема в интерфейсе радара сближения отняла около 13% времени цикла бортового компьютера, приведя к пяти сбоям программы и перезагрузкам. Менее известная проблема была вызвана ошибочными данными, что привело к флуктуациям тяги двигателя посадки лунного модуля, так как алгоритм управления тягой находился на границе устойчивости. Объяснение этих проблем даёт возможность описать операционную систему бортового компьютера Аполлона и программу управления посадкой на Луну.
Рисунок, изображающий посадку Lunar Excursion Module (LEM) на поверхность Луны. Пилот LEM использовал посадочный радар и визуальные измерения через окно LEM для отслеживания и проверки места посадки.
LM-1, также известная как Аполлон 5, была 6-часовой беспилотной миссией на земной орбите с участием только лунного модуля. Она состоялась 22 января 1968 года. Для тех из нас, кто разрабатывал ПО бортового компьютера LGC (Lunar Module Guidance Computer), это был первый полёт. Событие, которое сейчас кажется нам бесконечно далёким.
Миссия включала в себя два включения двигателя реактивной системы посадки лунного модуля (LM's Descent Propulsion System, DPS). На втором зажигании Алан Кламп (Allan Klumpp), который разрабатывал уравнения управления посадкой на Луну [1], основываясь на работе Джорджа Черри (George Cherry)[2], придумал способ имитации посадки на Луну для земной орбиты. Он состоял из трёх фаз: фаза торможения, фаза «видимости» и финальная фаза приземления посадочного модуля. Первое включение двигателя было нужно для симуляции манёвра перехода на орбиту снижения, предшествущего посадке. Это было первое зажигание двигателя лунного модуля в полёте, продолжавшееся около 38 секунд.
LGC (бортовой компьютер лунного модуля) находился в 9-й фазе миссии LM-1, программы, которая управляла первым зажиганием DPS. Более поздние миссии были организованы более гибко и первое зажигание DPS проводилось на шаге P40 программы. (Более подробно программу полёта можно посмотреть тут. прим. перев.) LM маневрирует в положение поджига. Компьютер начинает обратный отсчёт до зажигания. На 30-й секунде задача READACCS выполняется первый раз. Она читает показания акселерометров в инерциальном модуле космического корабля, ставит на исполнение задачу SERVICER, которая начинает выполняться немедленно, и ставит на исполнение саму себя с задержкой в 2 секунды. Она инициализируется вектором состояния от программы орбитальной интеграции, и навигационные уравнения начинают использовать данные акселерометров для вычисления положения и векторов ускорения. READACCS и SERVICER запускаются каждые две секунды в течение всей фазы полёта с включенным двигателем. За семь с половиной секунд до зажигания начался «грязный» прожиг RCS (Reaction Control System). Мы все подступили ближе к системе связи, которая соединяла нас с центром управления полётом в Хьюстоне.
Мы услышали «Двигатель включен»… и, через несколько секунд… «Двигатель выключен».
Вскоре мы поняли, что случилось. Маленький кусочек кода в SERVICER, называемый «delta-V monitor», решил, что двигатель неисправен и послал команду на выключение двигателя. Но почему? Для того, чтобы позволить двигателю выйти на режим тяги, этот код всегда выжидал некоторый период времени после включения двигателя, перед тем, как начать мониторинг двигателя. Но на этот раз, в конце этого периода двигатель по-прежнему не давал достаточно тяги, чтобы соответствовать критериям монитора тяги двигателя.
Опубликованные расчёты [3] объясняли медленный выход DPS в режим полной тяги тем, что баки лунного модуля находились не под полным давлением. Но расследование, предпринятое автором, показывает, что проблема была в другом. Для топливной системы DPS, при нормальной работе открылся бы клапан, через которое топливо поступает в трубопровод, когда двигатель готов к работе, за несколько секунд до зажигания. Но в лунном модуле клапан, регулирующий поступление топлива из трубопровода в двигатель, вероятно, дал течь. Для предотвращения возможного, преждевременного поступления гиперголического топлива в двигатель (что чревато взрывом), незадолго до полёта было принято решение задержать поступление топлива в двигатель до момента зажигания [4].
Двигатель имел замедленный старт не потому, что баки были под низким давлением, а потому что топливо ещё не дошло до двигателя. Нам было бы очень просто настроить параметр, устанавливающий, сколько времени монитор delta-V должен ожидать перед проверкой двигателя — но никто не сказал нам об этом.
Хьюстон послал сигнал, отключающий бортовой компьютер. Главные цели миссии LM-1 были достигнуты при управлении с Земли. Мы, те, кто программировал компьютер лунного модуля, впали в уныние и разочарование, которое усилилось реакцией публики, не отличающей ошибку в программе от неверных данных. И это не было последним случаем, когда кажущийся безопасным параметр, относящийся к характеристикам посадочного двигателя, поставил миссию почти на грань провала.
* * *
Разработка системы навигации для корабля Аполлон была возложена на Инструментальную Лабораторию Массачусетского Технологического Института (MIT Instrumentation Laboratory) в Кембридже. Под руководством её основателя «Дока» Чарльза Старка Дрейпера (Charles Stark Draper) лаборатория, начиная с 1939 года, играла основную роль в разработке инерциальных систем навигации. Договор с нами на разработку системы навигации и управления Аполлона (Apollo Primary Guidance Navigation and Control System, PGNCS, произносится как «pings») был первым договором, подписанным по программе Аполлона. Док сам записался в полёт на эту миссию.
Навигация сближения. Рисунок изображает сближение и стыковку LEM и командного модуля на лунной орбите после подъёма с лунной поверхности.
Программа, управляющая полётом лунного модуля, называлась SUNBURST. Ко времени полёта LM-1 мы уже работали над SUNDANCE, программой управления миссией Apollo 9 на орбите Земли. SUNDANCE, в свою очередь, превратился в LUMINARY, программу для Apollo 10 и миссии посадки на Луну. Миссией Apollo 11 в июле 1969 года управляла программа LUMINARY версии 99. Версия 116 управляла Apollo 12 в декабре, и т.п.
Программы для этого компьютера мы неофициально называли «верёвками» («ropes») из-за того, что в бортовом компьютере они хранились в ПЗУ, напоминающем верёвку из сплетённых медных проволок. Для лунных миссий память программ была ограничена 36K слов, по 16 бит плюс бит чётности, и плюс к этому, 2K слов ОЗУ. Принимая во внимание память компьютера Apollo AGC и командного модуля (СМ), содержащего программу COLOSSUS, будет верным сказать, что мы сели на Луну, имея 152 Кб памяти.
Рис 2. Лунный модуль программы Аполлон, первичная система управления и навигации (Apollo LM Primary Guidance and Navigation System, PGNS)
AGC собран в крепком, герметичном алюминиево-магниевом корпусе, с анодированием золотистого цвета, размерами приблизительно шесть дюймов на один фут на два фута, весом 70 фунтов и потреблением около 55 ватт. Его логическая схема состояла из 5600 трёхвходовых элементов ИЛИ-НЕ, упакованных по два в плоских интегральных микросхемах. Элдон Холл (Eldon Hall), главный разработчик машины, принял смелое решение использовать микросхемы для компьютера несмотря на незрелость этой технологии в начале 60-х [5].
LGC (со всем оборудованием) находился за астронавтами сзади кабины лунного модуля. Перед астронавтами находилась жёсткая конструкция, называемая «навигационной базой», на которой был смонтирован телескоп наведения и инерциальный измерительный модуль (IMU) в зафиксированных геометрических координатах. Модуль клавиатуры и дисплея (DSKY) был смонтирован между сидениями астронавтов. На рисунке 2 показаны компоненты и высокоуровневые интерфейсы первичной навигационной системы лунного модуля.
Система IMU (инерциально-измерительный блок), собранная в сферическом корпусе диаметром около фута, является сердцем системы навигации. Её же собственным сердцем, окружённым тремя вложенными друг в друга подвесами, является «неподвижный член», маленькая платформа, на которой смонтированы три прецизионных гироскопа и три акселерометра, которые должны находиться в определённом положении для осуществления инерциальной ориентации корабля. Любые отклонения в положении корабля фиксируются гироскопами, и подвесы перемещаются для коррекции положения, всё это происходит с высокой точностью и (почти) не зависит от положения корабля, «неподвижный член» даёт постоянное опорное положение. Матрица REFSMMAT выражает смещение неподвижного члена относительно инерциальной системы отсчёта. Акселерометры измеряют приращение скорости в течение фазы полёта с включенным двигателем в системе координат неподвижного члена.
Рис 3: Модуль дисплея и клавиатуры лунного модуля (DSKY)
DSKY был главным человеко-машинным интерфейсом для LGC. Для дисплея, который имел три регистра общего назначения, каждый из которых хранил знаковое число длиной пять десятичных разрядов, три регистра по две десятичных цифры для индикации текущей фазы полёта (числа от 63 до 68 для посадки на Луну), а также «глагол» и «существительное». Глаголы и существительные нужны для примитивного языка коммуникации между командой и компьютером. Фаза полёта и комбинация глагол/существительное в некоторых случаях задаются программой, а в других случаях вводятся экипажем с клавиатуры с 19 клавишами. Содержание трёх регистров общего назначения зависит от введённого существительного и глагола. DSKY также содержит массив индикаторных лампочек, которые управляются компьютером, и индикаторов активности компьютера, которые зажигаются, когда LGC не находится в состоянии ожидания.
Компьютер AGC в лунном модуле и в командном модуле программировался на двух языках. Один, который мы называли «Basic», или более правильно «Yul», был ассемблером, имеющим около 40 команд [6], за авторством Хью Блэра-Смита (Hugh Blair-Smith). Вторым был интерпретатор, интерпретирующий язык (по сути, набор подпрограмм), разработанный для упрощения навигационных вычислений, включающих вектора и матрицы чисел двойной точности (30-битные числа с фиксированной точкой), но очень медленный. «The Interpreter» был написан Чарьзом Мюнтцом (Charles Muntz).
Цикл памяти AGC имел длительность 11.7 мкс. Сложение с одинарной точностью на ассемблере занимало два цикла. Умножение векторов с двойной точностью в интерпретаторе занимало около 5 мс. Одной из сложностей программирования AGC было жонглирование двумя языками для достижения наилучшего баланса скорости и компактности в каждом конкретном случае.
Программы компьютеров Аполлона были достаточно малы, чтобы уместиться в один листинг, обычно сложенная по сгибам бумага со страницами 11х15 дюймов с толщиной пачки 6 дюймов. Листинг включал в себя таблицу символов, которые можно отслеживать при выполнении потока. Имея один листинг, мы всегда знали, что ответ находится в нём, когда мы искали баг, хотя его было иногда дьявольски сложно найти.
Рис 4. Листинг программы лунного модуля LUMINARY 131
Архитектура LGC была модульной, но эклектичной. Внутри компьютера мы использовали метрическую систему, по крайней мере для задач навигации. Но операторы NASA, и, особенно астронавты предпочитали английскую систему мер. Это означает, что перед выводом на дисплей высота и вертикальная скорость (например), пересчитывается из метрической системы в футы и футы/с. Масса и сила тяги выражались в фунтах. Потому что целью этой статьи отчасти показать, как мы называли вещи в ту эпоху космических кораблей, я буду использовать те единицы измерения, которые были приняты в то время.
Шарж на «Дока» Дрейпера
* * *
Сейчас отдел, в котором производился мониторинг миссии, на Cambridge Parkway 75, переведён в более просторное помещение, на 20 июля 1969 года комната была переполнена, несмотря на усилия по её очистке, предпринимаемые теми из нас, кто принимал наибольшее участие в данной фазе миссии. Мы слушали «сквокбокс» (коммуникационное устройство) в классной комнате, в то время как в четверти миллиона миль отсюда пилотируемый космический корабль вышел из-за Луны и приблизился к нижней точке своей орбиты (perilune), на высоте около 50 000 футов над испещрённой кратерами поверхностью, и включил посадочные двигатели.
Команда набрала на компьютере «глагол 37», что означало фазу P63, подготовку к управляемому снижению, и оставалась пока в командном модуле, пока прожиг двигателя не завершён. Компьютер выполнял алгоритм, рассчитывающий точное время зажигания, и положение, в котором должен быть лунный модуль в этот момент. Далее космический корабль разворачивается в нужное положение. В момент зажигания, сопло двигателя должно быть направлено почти вперёд, против вектора орбитальной скорости корабля.
Сейчас компьютер дал код ошибки 500. Он считал, что антенна радара находится в неверном положении. Команда видела, что переключатели находились в правильном положении, но всё равно переключила их, и ошибка исчезла. Это не было связано с событиями, которые произошли дальше, но укрепили наши подозрения в том, что сигналы, которые сообщают компьютеру положение антенны или переключателей иногда лгут.
Управление передаётся программе BURNBABY — главная программа управления зажиганием, которую мы написали после LM-1, чтобы сэкономить память путём использования сходных алгоритмов в период, предшествующий зажиганию. На DSKY высвечивается «Глагол 6, существительное 62». Средний регистр содержит время в минутах и секундах, начинается обратный отсчёт до зажигания. За 35 секунд дисплей гаснет, за 30 зажигается снова. Это сигнал того, что стартовал алгоритм «Average-G». За 7,5 с начинается «грязный» прожиг. За 5 секунд до старта дисплей мигает, ожидая стартовой команды от экипажа. Баз Олдрин (Buzz Aldrin), пилот лунного модуля, стоит справа от кокпита, на нём лежит главная ответственность по работе с DSKY. Он нажимает «PROCEED».
В момент времени 102:33:05 от начала миссии самовоспламеняющееся топливо поступает в двигатель посадки зажигается при дросселировании 10%. Армстронг не почувствовал даже лёгкого толчка — ускорение было меньше 1/25g. Дисплей высветил «существительное 63» и три дисплея регистров сейчас показывают полную скорость 5559.7 футов/с, и вертикальную скорость -2.2 фута/с, высоту над поверхностью 49971 футов [8]. Подвесы двигателя посадки выровняли вектор тяги посадочного двигателя по центру масс корабля. Через 26 секунд после зажигания программное обеспечение выводит DPS на максимальную тягу 9870 фунтов (43900 Н), 94% от официально заявленных 10500 фунтов, и в то же самое время начинается посадочный манёвр.
P63 была фазой торможения, её единственной целью было гашение вертикальной скорости. Она закончилась через 8 минут, после того, как корабль достиг конечных условий, известных как «высокие ворота» («high gate») на высоте 7400 футов. Рис. 5 иллюстрирует фазы посадки на Луну.
Рис. 5. Фазы посадки на Луну (числа приблизительные)
В момент 102:36:55 от начала миссии Нил Армстронг, командир, стоял с левой стороны кокпита лунного модуля, и использовал джойстик для разворота космического корабля вокруг оси тяги, так, чтобы окно корабля позволило астронавтам смотреть вниз на поверхность, так как в данный момент оно было направлено в космос, и в него была видна Земля. Но корабль вращался слишком медленно. Армстронг переключил ограничение скорости автопилота с 5 град/с на 25 град/c [9]. Непосредственно перед этим манёвром посадочный радар сигнализировал «данные в норме».
Невозможно произвести навигацию столь точно, чтобы безопасно сесть на лунную поверхность без знания текущего расстояния и скорости. Эту информацию даёт радар посадки. Несмотря на проверки правдоподобности, производимые программным обеспечением, данные радара не могли быть включены в вектор состояния без подтверждения команды и центра управления полётами. Примерно через пять минут после зажигания Олдрин ввёл «глагол 16, существительное 68» — запрос на отображение «существительного», при котором третий регистр показывал разность между высотой, которую видит радар, и вычисленной компьютером. Эта переменная, называемая DELTAH, была около -2900 футов. Это находилось в пределах допустимой ошибки. Данные радара поступали в навигационную систему, не оказывая негативного влияния на траекторию полёта.
Затем мы услышали слова «программное предупреждение». В кембридже мы переглянулись. На борту космического корабля, Олдрин увидел, как зажёгся сигнал «PROG» и дисплей высветил снова «глагол 6, существительное 63». Он быстро нажал «глагол 5 существительное 9». На дисплее DSKY появился код предупреждения 1202. Это предупреждение появлялось, если компьютер перегружен, т.е. запущено больше задач, чем на них хватит времени. В Кэмбридже сказали: «предупреждение исполнения, нет места в памяти». Затем Армстронг сказал с резкостью: «дайте нам указания по предупреждению 1202» [10].
События начали развиваться стремительно, слишком быстро, чтобы мы могли передавать данные из Кембриджа. Это делал центр управления полётами в Хьюстоне. Рассказ о том, что случилось дальше, часто повторялся — каково было 26-летнему офицеру Стиву Бэйлсу (Steve Bales) сказать «продолжать» или «отмена». Бейлс принимал участие в недавнем анализе сигналов тревоги LGC, в ходе которого было принято решение продолжать миссию при ошибке 1202, в случае, если она не возникает слишком часто и траектория не отклоняется от расчётной. Его поддержали Джек Гарман (Jack Garman) из NASA и Расс Ларсон (Russ Larson) из MIT, сидевшие в задней комнате. Гарман сказал «продолжать», и связист Чарли Дьюк (Charlie Duke) передал его слова экипажу корабля. В MIT, когда мы поняли, что что-то загадочное расходует время компьютера, мы сидели, затаив дыхание.
Между возникновением сигнала ошибки и ответом «продолжать» из Хьюстона прошло полминуты. За это время центр управления полётом проверил величину DELTAH, и Олдрин набрал «57», код, разрешающий системе навигации принять данные радара. Затем он попробовал набрать «глагол 16, существительное 68» снова и увидел, как DELTAH уменьшилось до 900 футов. Снова загорелся сигнал ошибки. Снова светилось «глагол 5 существительное 9 — 1202». Снова с Земли ответили «продолжать».
Рис. 6. Ожидаемая (точки) и реальная (сплошная линия) сила тяги в процессе посадки (данные симуляции)
Время полёта — 102:39:31, всё идёт как нельзя лучше — дроссельная заслонка закрывается, точно вовремя. «Ага! Дроссельная заслонка закрывается, лучше чем в симуляторе», комментировал Одрин. «Дроссельная заслонка закрывается вовремя!», воскликнул Армстронг, с явным возбуждением. В официальной расшифровке разговоров между космическим кораблём и Землёй в течение фазы посадки только один восклицательный знак — в этом месте[11].
Сопло двигателя посадки подвергается сильной эрозии при работе в режиме от 65% до максимальной тяги. Дроссельная заслонка закрывается, когда тяга, требуемая для посадки, уменьшается до уровня, при котором возврат к максимальному значению уже не потребуется до самого конца фазы торможения. Закрытие дроссельной заслонки очень хорошо показывает, что система управления работает правильно. Также верно и то, что если заслонка застрянет в открытом положении, нужно будет прерывать миссию, потому что через 40 секунд, согласно навигационным уравнениям, корабль должен будет совершить поворот.
Пока лунный модуль был направлен передней частью к поверхности Луны, Армстронг отсчитывал ориентиры, которые указывали, что модуль снизился больше, чем требовалось. Он обнаружил, что компьютер не знает, что посадочный модуль снизился слишком сильно [12]. Иначе двигатель оставался бы на максимуме тяги дольше, чем это происходило в реальности.
Симулятор лунного модуля.
Время миссии 102:41:32, корабль преодолел отметку 7400 футов, снижаясь со скоростью 125 футов/с, «высокие ворота» были достигнуты. Навигационная система сейчас должна выполнять другие задачи. Лунный модуль направлен вперёд, так, что лунная поверхность видна по курсу. На DSKY регистр режима показывал 64, что означало «фазу видимости», и «существительное 64» сменилось на «существительное 63». Вместо скорости в верхнем регистре сейчас отображались два двузначных числа. Одно из них — обозначение точки посадки (landing point designator, LPD), угол, который указывает, на какую метку разметки на окне Армстронг должен смотреть, чтобы увидеть, куда сядет корабль, если будет разрешена автоматическая посадка. Система наведения контролировала рыскание для удержания места посадки вдоль линии прицела. Экипаж может изменить место посадки с помощью ручного контроллера. (Армстронг заявил перед полетом, что он планирует не использовать эту возможность, но, по-видимому, «фаза видимости» продлилась слишком долго). Второе число показывало оставшееся время, в течение которого может быть изменено место посадки. В этой фазе включен алгоритм, позволяющий изменить место посадки, это был самый напряженный период посадки.
Время миссии 102:42:17, происходит ошибка 1201. Снова ошибка Executive (Системное ПО компьютера состояло из двух подсистем: Executive — ОС реального времени и The Interpreter — виртуальная машина, фактически интерпретатор команд для работы с числами двойной точности. прим. перев.) — нет свободной памяти. Через приблизительно 24 секунды снова ошибка 1202. Центр управления в Хьюстоне говорит «продолжать» в обоих случаях. Нил Армстронг, чьё сердце делало от 120 до 150 ударов в этот промежуток времени [13], выполнил эти указания.
Тем не менее, Армстронг успел заметить, что система LPD показала, что «мы приземляемся недалеко от большого скалистого кратера с очень большими скалами, покрывающими большую часть поверхности»[15]. Поэтому в момент 102:43:08 от начала миссии (высота 650 футов) Армстронг, решив, что не может сесть близко к кратеру, перевел переключатель режима автопилота с AUTO на ATT HOLD для ручного управления положением лунным модулем. Он маневрировал с нулевым углом наклона для поддержания горизонтальной скорости и проходил над скалистой местностью.
(ATT HOLD означал, что цифровой автопилот управлял скоростью полета в режиме Attitude-Hold, в котором астронавт мог управлять скоростью полета, отклоняя джойстик. После того, как рукоятка джойстика была отпущена, автопилот обнуляет скорость, чтобы сохранить текущее положение.)
Время миссии 102:43:20, высота 430 футов, Армстронг левой рукой переключил тумблер входа в режим управления скоростью спуска (P66). Теперь компьютер управлял тягой корабля для поддержания скорости спуска, управляемой переключателем ROD. Движение переключателя вверх замедлило спуск на один фут в секунду; движение вниз увеличило скорость спуска на ту же самую величину. С помощью джойстика Армстронг наклонил модуль для обнуления горизонтальной скорости и направил модуль в безопасное место для приземления. После нескольких, «возможно непроизвольных» управляющих движений из-за того, что пыль, поднятая выхлопом двигателя, исказила его восприятие скорости, Армстронг в 102:45:40 совершил посадку космического корабля в Море Спокойствия.