2018年4月23日月曜日

宇宙ロケットの制御プログラムバグ, Space rocket control program bug

宇宙ロケットの制御プログラムバグ
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 件のコメント:

コメントを投稿