# Tales from the Lunar Module Guidance Computer 著者: [[Don Eyles]](Apollo Lunar Module Guidance Computer のフライトソフトウェアエンジニア、[[MIT Instrumentation Laboratory]]) 初出: 第27回 AAS Guidance and Control Conference(2004年2月6日、Breckenridge, Colorado)、AAS 04-064。本ページが対象とするのは追加の図版・補足・訂正を加えた著者公式サイト掲載版。 Apollo 11 の月面着陸(1969年7月20日)で発生した二つのソフトウェア/ハードウェア境界の不具合──**1201/1202 プログラムアラーム**(ランデブーレーダーのインターフェース仕様齟齬による CPU 時間喪失)と、**スロットル振動「キャッスレーション(castellation)」**(スロットル制御アルゴリズムの限界安定性)──を、開発当事者自身が一次資料(社内メモ・PCR・ICD)に基づいて解説する回顧録。副産物として Apollo Guidance Computer(AGC)のリアルタイム OS(Executive/Waitlist、優先度駆動プリエンプティブスケジューリング、リスタート保護)の設計思想が詳細に語られる。 > [!contradiction] Margaret Hamilton の帰属記述との個人帰属の粒度差 > [[Margaret Hamilton]] ページは [[SRE Book]] 序文を典拠に、Apollo 11 の1202アラーム対応の優先度ベースタスクスケジューリングを「Hamilton のチームが設計した」と記す。本ソースは同じ Executive/Waitlist 方式の具体的設計者として [[Hal Laning]] を個人名で明記し、Hamilton には言及していない。組織的リーダー(Hamilton)と個別設計者(Laning)の違いである可能性が高く、必ずしも矛盾しないが、読者の誤読を避けるため両ページに明示する。 ## 背景: AGC とフライトソフトウェアの制約 - ハードウェア: 5600 個の 3 入力 NOR ゲート、6×12×24 インチ・70 ポンド・55 ワット。メモリは固定(読み取り専用)36K ワード + 消去可能(RAM)2K ワード、1 ワード15 ビット+パリティ。LM(LGC)と CM(COLOSSUS)を合わせても総メモリは 152 KB。 - ソフトウェアは「Basic(Yul)」(約40命令のアセンブラ、Hugh Blair-Smith 設計)と「Interpretive」(倍精度ベクトル・行列演算用のリスト処理型インタプリタ、Charles Muntz 設計)の二言語で書かれた。 - プログラムは "rope"(コア・ロープメモリ)と呼ばれた。LM-1(SUNBURST)→ SUNDANCE(Apollo 9)→ LUMINARY(Apollo 10・月着陸ミッション群)と系譜が続く。Apollo 11 を飛行したのは LUMINARY rev. 99。 ## LM-1(1968年): 「タンク未加圧」説の否定 LM-1(Apollo 5)の DPS(降下推進系)初回噴射で、エンジン点火後まもなく delta-V monitor が「エンジン故障」と誤判定し自動でエンジンオフを発行、ミッションは地上制御に切り替わった。公式記録(*Chariots for Apollo*)はタンク未加圧を原因としたが、著者の調査では真因は別にある。リーク疑惑のあった燃料制御バルブへの配慮から、通常より遅いタイミングでエンジンアームする手順変更が飛行直前に決定されており、この変更が delta-V monitor の待機時間パラメータに反映されなかった。「コンピュータエラー」と「データの誤り(手順変更が伝わらなかったこと)」を区別しない当時の報道への異議がここで提示される。 ## Apollo 11: 1201/1202 プログラムアラーム ### Executive の設計 [[Hal Laning]] が設計した Executive/Waitlist 方式は、固定時間割り当ての「ボックスカー式(boxcar)」executive を避け、可変長の「ジョブ(job)」に優先度を与えプリエンプティブに実行する構成を取った(→ [[優先度駆動リアルタイム実行系]])。ジョブの状態保存には 8 個の「core set」(12 レジスタ)、ベクトル/行列演算を伴うジョブにはさらに 5 個の「VAC area」(43 レジスタ)が割り当てられる。要求に対し core set/VAC area が枯渇すると Executive は `BAILOUT` を呼び、1202(core set 枯渇)または 1201(VAC area 枯渇)のアラームコードを発行する。 ### 根本原因: ランデブーレーダーのインターフェース仕様齟齬 Apollo 11 の降下中、着陸に不要なランデブーレーダー(RR)は SLEW/AUTO モードで電源投入されたままだった。PGNS と ATCA(Grumman 製姿勢制御アセンブリ)間の ICD は「28V 800Hz 信号の周波数同期」のみを規定し「位相同期」を規定していなかった。実装上、両系統の 800Hz 信号は周波数は一致するが位相はランダムであり、位相差が 90°/270° 付近になると CDU(coupling data unit)が最大レート(毎秒6400パルス/軸)でカウンタを暴走的に増減させた。これが LGC の計算時間の約13%(実測13.36%が上限)を奪い(TLOSS)、10%まで縮小していたマージンを食い潰して Executive のジョブ滞留・core set/VAC area 枯渇・BAILOUT アラームを引き起こした(→ [[インターフェース仕様の齟齬による障害]])。この不具合は LM-3 の射場試験で既に検出・記録されていたが、修正されないまま Apollo 11 に持ち越されていた。 Steve Bales(ミッションコントロール誘導担当)、Jack Garman、Russ Larson(MIT)の判断で "go" が継続されたのは、事前のアラーム分類レビューで 1202 を「頻発せず軌道が逸脱しなければ go」と定めていたためである。 ### 意図せぬ耐障害機構としてのリスタート保護 Apollo 11 の1年ほど前から、ハードウェア割り込みや電源瞬断でもミッション継続できるよう「リスタート保護」が導入されていた(→ [[リスタート保護]])。ソフトウェアは要所に「waypoint」を登録し、リスタート時は各ジョブを直近の waypoint から再開する。この仕組みが、TLOSS で滞留した未完了 SERVICER ジョブスタブを一掃し、かつリスタート保護対象外の非重要処理(DELTAH モニタ等)を打ち切ることで、Executive の資源逼迫を自己解消する副次効果を持っていた。P63(制動フェーズ)ではこの自己修復で着陸続行が可能だったが、P64(可視フェーズ、着陸点再指定処理が追加され余裕が10%未満)ではアラームが繰り返し発生し、Armstrong が ATT HOLD への手動切り替え(MET 102:43:08)で計算負荷を軽減して収束させた。 ## スロットル「キャッスレーション」問題 Apollo 12 のテレメトリで Clint Tillman(Grumman)が発見した約25%(peak-to-peak)のスロットル振動。[[Allan Klumpp]] の解析により、IMU が機体重心から前方約4フィートに搭載されていたための「IMU bob」(姿勢変化時の見かけ上の垂直速度)が一因と判明したが、これだけでは説明が不十分だった。 真因はスロットル制御アルゴリズムの遅延補償誤りにある。ICD 記載のエンジンタイムラグは0.3秒だったが、著者([[Don Eyles]])は自身のシミュレーション観察に基づき0.2秒分のみ補償するようコードを実装した(Klumpp は「小さな判断は担当者に委ねる」方針で介入しなかった)。事後解析(Klumpp、および Bellcomm の J. A. Sorensen による独立レポート)は、実際のエンジンタイムラグはエンジン性能改善後で約0.075秒に短縮されており(ICD は未更新)、0.2秒補償は既に過補償だったことを示した。もし ICD の記載通り0.3秒分を補償していたら、スロットルは不安定化し降下エンジンが最小・最大スラスト間で振動、アボートが避けられなかった可能性が高い(→ [[制御ループの安定性とタイムラグ補償]])。 ## 恒久対策とその後 - RR モードスイッチ運用手順の変更、および RR モードが LGC でない場合に RR カウンタをゼロクリアするロジックの追加。 - Klumpp による「occasional whole SERVICER job を意図的に破棄する」対策(Apollo 13向け)。 - IMU bob 補正とスロットル遅延補正の修正(Apollo 13以降。ただし Apollo 13 自体は着陸に至らず未飛行)。 - 「variable SERVICER」(固定2秒周期の制約撤廃)や「P66 LPD」(John Young 発案、AUTO 切替時の即時ホバー地点表示)は開発・シミュレーション検証まで進んだが、Apollo 17 が最終着陸ミッションと決定されたため保守的判断でフライトせず。 - Apollo 14 では中断スイッチの誤信号を、レジスタ操作による回避手順(61キーストローク)で無効化。 ## 関連ページ - エンティティ: [[Don Eyles]] / [[Allan Klumpp]] / [[Hal Laning]] / [[Apollo Guidance Computer]] / [[MIT Instrumentation Laboratory]] / [[Margaret Hamilton]] - 概念: [[優先度駆動リアルタイム実行系]] / [[リスタート保護]] / [[インターフェース仕様の齟齬による障害]] / [[制御ループの安定性とタイムラグ補償]] / [[べき等性]] / [[根本原因分析]] / [[ポストモーテム]] - 関連ソース: [[@1985__Tandem__Why Do Computers Stop and What Can Be Done About It]] / [[@1998__CtL__How Complex Systems Fail]] / [[@2016__OReilly__SRE Book - Preface]] ![[_attachments/tales-lunar-module/fig01-pgns-architecture.jpg]] (LM の Primary Guidance, Navigation and Control System (PGNS) の概観図。慣性センサとコンピュータ、DSKY、姿勢ジェット/エンジンジンバル/推力コマンドの関係を示す。Source: Tales from the Lunar Module Guidance Computer, Figure 2) ![[_attachments/tales-lunar-module/fig02-dsky.jpg]] (LM の Display and Keyboard Unit (DSKY)。動詞(verb)・名詞(noun)コードとフェーズ番号、3つの汎用レジスタ、19キーのキーボードで構成される乗員とLGCの主要インターフェース。Source: 同記事, Figure 3) ![[_attachments/tales-lunar-module/fig03-rendezvous-radar-interface.jpg]] (PGNS・ATCA・ランデブーレーダー間のインターフェース図。ATCA と PCM/timing electronics それぞれから CDU に送られる 800Hz 基準信号の位相不一致が、1201/1202 アラームの根本原因である。Source: 同記事, Figure 7) ![[_attachments/tales-lunar-module/fig04-castellation-action-item.jpg]] (1970年4月22日付、R. Larson から D. Moore・D. Eyles・A. Klumpp 宛のアクションアイテム memo M-143。GAEC(Grumman)が P66 で観測した「キャッスレーション」効果の原因調査を依頼する手書き文書。当時の障害調査プロセスを示す一次資料。Source: 同記事, Figure 11) ![[_attachments/tales-lunar-module/fig05-throttle-oscillation-data.jpg]] (Apollo 12 実飛行データとビットバイビットシミュレータ(LUMINARY 163使用)の比較。ピッチレート・スロットル・推定高度変化率が同期して振動する「キャッスレーション」現象を示す。Source: 同記事, Figure 12)