Space rocket control program bug
1962年7月22日、フロリダ州ケネディー宇宙センターから、金星探査機;マリナ―1号を搭載したアトラス・アジェナロケットが打ち上げられた。
アトラス・アジェナロケットは、大陸間弾道ミサイル;アトラスをベースとしたロケットであり、同型のファミリーは、米国の有人飛行であるマーキュリー宇宙船を打ち上げた事でも有名である。
しかし、計画された飛行経路から外れたため、打ち上げの293秒後に、指令破壊により爆破、残骸は大西洋に落下した。これは、飛行ソフトウェアのバグが原因とされており、宇宙開発界隈で非常に有名な失敗例の1つである。
ロケットの軌道制御には、FORTRANが使用されていた。その中で問題のソースコードは次の通りとされる。
IF (TVAL .LT. 0.2E-2) GOTO 40
DO 40 M = 1, 3
W0 = (M-1)*0.5
X = H*1.74533E-2*W0
DO 20 N0 =1, 8
EPS = 5.0*10.0**(N0-7)
CALL BESJ(X, 0, B0, EPS, IER)
IF (IER .EQ. 0) GOTO 10
20 CONTINUE
DO 5 K = 1. 3
T(K) = W0
Z = 1.0/(X**2)*B1**2+3.0977E-4*B0**2
D(K) = 3.076E-2*2.0*(1.0/X*B0*B1+3.0977E-4**(B0**2-X*B0*B1))/Z
E(K) = H**2*93.2943*W0/SIN/(W0)*Z
H = D(K)-E(K)
5 CONTINUE
10 CONTINUE
Y = H/W0-1
40 CONTINUE
このソースコードのミスは、10行目の「DO 5 K = 1. 3」にある。
実際は、「DO 5 K = 1, 3」と打つべき所をカンマではなく、コロンと打ち間違えた事により、宣言されていない変数代入として、「DO5K=1.3」となってしまった。このため、意図した「5 CONTINUE」ループが実行されず、結果として計算精度が問題になり、失敗したとされる。
ただし、この話は都市伝説であり、実際の原因は、地上からの電波誘導のリンクが切れ、ロケット内部の慣性誘導のみとなった際、内部数式の平均化関数を使用しろと手書きで指示していた所を、平均化されない生値を使用する様にソースが組まれおり、その結果、制御系が補正指示を常に与え、正常な軌道から外れた。精度を高めるためのループ問題は、マーキュリー宇宙船の誘導系開発時に発生した、という説もある。
指令破壊されたアトラス・アジェナロケットは、以下で動画を見る事が出来る。
0 件のコメント:
コメントを投稿