Main Content

アポロ月着陸船のデジタル自動操縦の開発

"月着陸船のデジタル自動操縦の設計に取り組んだことは、エンジニアとしての私のキャリアの中で、最大の出来事でした。ニール・アームストロングが LM (月着陸船) から月面に着陸したとき、アポロ プログラムに携わったすべてのエンジニアが誇りと達成感を覚えました。私たちは、目標を達成したのです。これまで存在したことのないテクノロジーを開発し、大変な努力と細かな所にまでいたる細心の配慮により、完璧に動作するシステムを作り上げました" Richard J. Gran、The Apollo 11 Moon Landing:Spacecraft Design Then and Now

この例では、リチャードおよびアポロの月着陸船デジタル自動操縦の設計チームに加わったエンジニアが、1961 年当時に Simulink® および Aerospace Blockset™ を使用できたと仮定した場合、どのようにその設計を行うことができたかを示します。

モデルの説明

当時もし Simulink があったなら、アポロ月着陸船の自動操縦の設計期間は驚くほど短縮できたことでしょう。

if ~bdIsLoaded("aero_dap3dof")
    open_system("aero_dap3dof");
end

Reaction Jet Control サブシステムは、現在 Draper Laboratory と呼ばれる、MIT Instrumentation Laboratories (MIT IL) により推奨 (および実装) されたデジタル自動操縦の設計をモデル化します。このモデル内の Stateflow® ブロック線図では、位相面制御アルゴリズムを実装するロジックが指定されています。次で説明されています。技術的な記事 The Apollo 11 Moon Landing: Spacecraft Design Then and Now. Stateflow ブロック線図は、ブロック線図のどの領域で月着陸船を動かすかによって、Fire_region または Coast_region にあります。これらの領域間の遷移は、特定のパラメーターに依存します。Stateflow ブロック線図では、別のステートに遷移するかどうかが決定された後、どの反動ジェットに点火されるのかが計算されます。

月着陸船の遷移ダイナミクスおよび回転のダイナミクスは Lunar Module Dynamics サブシステム内で近似されます。モデルの Visualization 領域で、Simulink スコープ、Simulink 3D Animation によるアニメーション、位相面プロットなど、月着陸船の状態と自動操縦の性能のさまざまな可視化方法にアクセスします。

対話型コントロール

月着陸船モデルを対話的に操作するには、自動操縦設定と月着陸船の初期状態を Commands 領域で変更します。たとえば、デジタル自動操縦の設計で加速した初期の本体比をどのように扱うのかを確認するには、Configure LM Attitude でスライダー コンポーネントを使用します。

ミッションの説明

LM デジタル自動操縦には自由度が 3 つあります。つまり、設計上、反動ジェット推進機は車両の軌道軌跡に影響することなく車両を回転するように設計および指示されます。したがって、このモデルの並進ダイナミクスは、Aerospace Blockset からの Spacecraft Dynamics ブロックを使用した旋回移動の伝播を通じて近似されます。ブロックは、Moon Spherical Harmonic Gravity モデル LP-100K を使用するように構成されています。

デジタル自動操縦の設計動作を示すために、動力降下の開始直前に、"Apollo 11 Mission Report" から "降下軌道投入" ミッション セグメントが選択されました。

(画像著作権: NASA)

"降下軌道投入" の噴射は打ち上げ後 101 時間 36 分 14 秒に開始され、30 秒間継続しました。この噴射は月着陸船が軌跡上でおよそ 1 時間にわたり、その軌道を約 60 海里から 50,000 フィートまで下げるように設定します。50,000 フィートでモジュールはその動力降下を開始しました。

降下軌道投入噴射直後に、月着陸船のおおよその軌跡でモデル aero_dap3dof を初期化します。

mission.t_rangeZero             = datetime(1969,7,16,13,32,0); % lift-off
mission.t_descentInsertionStart = mission.t_rangeZero + hours(101) + minutes(36) + seconds(14);
mission.t_descentInsertion      = mission.t_descentInsertionStart + seconds(30);
mission.t_poweredDescentStart   = mission.t_rangeZero + hours(102) + minutes(33) + seconds(5.2);

disp(timetable([mission.t_rangeZero, mission.t_descentInsertionStart, ...
    mission.t_descentInsertion, mission.t_poweredDescentStart]', ...
    {'Range Zero (lift-off)', 'Descent Orbit Insertion (Engine ignition)', ...
    'Descent Orbit Insertion (Engine cutoff)', 'Powered Descent (Engine ignition)'}', VariableNames="Mission Phase"));
            Time                            Mission Phase                
    ____________________    _____________________________________________

    16-Jul-1969 13:32:00    {'Range Zero (lift-off)'                    }
    20-Jul-1969 19:08:14    {'Descent Orbit Insertion (Engine ignition)'}
    20-Jul-1969 19:08:44    {'Descent Orbit Insertion (Engine cutoff)'  }
    20-Jul-1969 20:05:05    {'Powered Descent (Engine ignition)'        }

"降下軌道投入 (エンジン カットオフ)" および "動力降下開始 (エンジン点火)" におけるモジュールの軌跡については、"Apollo 11 Mission Report" (Table 7-II.- Trajectory Parameters) に提供されています。

mission.Latitude_deg  = [-1.16, 1.02]';    % [deg]
mission.Longitude_deg = [-141.88, 39.39]'; % [deg]
mission.Altitude_mi   = [57.8, 6.4]';      % [nautical miles]
mission.Altitude_ft   = convlength(mission.Altitude_mi, 'naut mi', 'ft');
mission.Velocity_fps  = [5284.9, 5564.9]'; % [ft/s] (in Inertial frame)
mission.FlightPathAngle_deg = [-0.06, 0.03]'; % [deg] (measured upward from local horizontal plane)
mission.HeadingAngle_deg = [-75.19 -101.23]'; % [deg] (measured East of North)
disp(table({'Range Zero (lift-off)'; 'Descent Orbit Insertion (Engine ignition)'}, ...
    mission.Latitude_deg, mission.Longitude_deg, mission.Altitude_mi, ...
    mission.Velocity_fps, mission.FlightPathAngle_deg, mission.HeadingAngle_deg, ...
    VariableNames=["Mission Phase", ...
    "Latitude (deg)", "Longitude (deg)", "Altitude (mi)", ...
    "Velocity (ft/s)", "Flight path angle (deg)", "Heading (deg)"]));
                    Mission Phase                    Latitude (deg)    Longitude (deg)    Altitude (mi)    Velocity (ft/s)    Flight path angle (deg)    Heading (deg)
    _____________________________________________    ______________    _______________    _____________    _______________    _______________________    _____________

    {'Range Zero (lift-off)'                    }        -1.16             -141.88            57.8             5284.9                  -0.06                 -75.19   
    {'Descent Orbit Insertion (Engine ignition)'}         1.02               39.39             6.4             5564.9                   0.03                -101.23   

モデルの初期化

上記で定義されたデータを使用して、ミッション フェーズ "降下軌道投入 (エンジン カットオフ)" のモデル パラメーターを初期化します。

初期化関数 aero_dap3dofdata には、月の向きに関する情報が必要です。これは、Aerospace Blockset 関数 moonLibration を使用して計算できます。この関数には "Ephemeris Data for Aerospace Toolbox" が必要です。このデータがまだインストールされていない場合は aeroDataPackage を使用してインストールします。

mission.LibrationAngles_deg = moonLibration(juliandate(mission.t_descentInsertion), "405");

この例では、t_descentInsertion に対応する保存されている秤動角データを使用します。上記のコマンドは、必要な天体位置データをインストールしてから使用します。

mission.LibrationAngles_deg = [0.006379917345247; 0.382328074214300; 6.535718297208969];

初期化関数を実行します。

[moon, ic, vehicle, rcs] = aero_dap3dofdata(...
    mission.Latitude_deg(1), mission.Longitude_deg(1), mission.Altitude_ft(1), ...
    mission.Velocity_fps(1), mission.FlightPathAngle_deg(1), ...
    mission.HeadingAngle_deg(1), mission.LibrationAngles_deg)
moon = struct with fields:
    r_moon_eq: 5702428
       f_moon: 0.0012

ic = struct with fields:
       t_runtime: 120
    pos_inertial: [-3.6488e+06 -4.4381e+06 -1.9070e+06]
    vel_inertial: [4.0625e+03 -3.3792e+03 86.4867]
         euler_0: [-30 -10 -60]

vehicle = struct with fields:
    inertia_0: [3x3 double]
       mass_0: 33296

rcs = struct with fields:
     Force: 100
     L_arm: 5.5000
        DB: 0.0060
      tmin: 0.0140
     alph1: 0.0550
     alph2: 0.0039
     alph3: 0.0050
     alphu: 0.0063
     alphv: 7.8553e-04
    alphs1: 0.0055
    alphsu: 6.2855e-04
    alphsv: 7.8553e-05
    clockt: 0.0050
      delt: 0.1000

おわりに

1961 年当時、デジタル自動操縦の開発は骨の折れる事業でした。必要な産業基盤がほとんど整っておらず、すべてのものが開発途上にありました。以下は、技術的な記事The Apollo 11 Moon Landing: Spacecraft Design Then and Now」記事からの抜粋です。

"自動操縦のマシン コードが非常に複雑である理由の 1 つとして、操縦軸を中心とする回転の制御に使用可能なジェットの数が多かったことが挙げられます。そこで、aero_dap3dof に示すように、自動操縦で制御する軸を "ジェット軸" に変更するという決定が下されました。この変更によりコードの行数が大幅に削減され、既存のコンピューターでの自動操縦のプログラミングがはるかに簡単になりました。この改善がなければ、わずか 2000 ワードのストレージでは自動操縦を開発できなかったでしょう。この変更から得られる教訓は、エンジニアが設計中のシステムでコーディングの機会を与えられた場合、その設計を変更することによってコードを大幅に改善する可能性は大いにあるということです。"

参考文献

[1] National Aeronautics and Space Administration Manned Spacecraft Center, Mission Evaluation Team. (November 1969). Apollo 11 Mission Report MSC-00171. "https://www.nasa.gov/specials/apollo50th/pdf/A11_MissionReport.pdf" から取得

[2] Richard J. Gran, MathWorks. (2019). The Apollo 11 Moon Landing: Spacecraft Design Then and Now. https://www.mathworks.com/company/newsletters/articles/the-apollo-11-moon-landing-spacecraft-design-then-and-now.html から取得

関連するトピック