このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
Orbit Propagator ブロックによる月面ミッションの分析
この例では、アポロ コマンドおよびサービス モジュールと月面上のローバー間のアクセス間隔を計算して視覚化する方法を示します。モジュールの軌道は、NASAの報告書「アポロCSMモジュールの月軌道パラメータの変動」[2]の参照軌道#2を使用してモデル化されています。これはNASAがアポロ計画のために研究した月の軌道です。 例では以下を使用します:
Aerospace Toolbox
Aerospace Blockset™
Mapping Toolbox™
ミッションパラメータとモジュールの初期条件を定義する
ミッションの開始日と期間を指定します。この例では、MATLAB ® 構造を使用してミッション データを整理します。これらの構造により、例の後半でのデータへのアクセスがより直感的になります。また、グローバル ベース ワークスペースの整理にも役立ちます。
mission.StartDate = datetime(1969, 9, 20, 5, 10, 12.176); mission.Duration = hours(2);
基準軌道#2 [2]に基づいて、mission.StartDate
におけるコマンドおよびサービスモジュール(CSM)のケプラー軌道要素を指定します。参考資料 2 に記載されている参照軌道の基準は次のとおりです。
軌道面には、月面の地球側にある着陸地点のベクトルが含まれていなければならない。その着陸地点のベクトルは、月面座標で経度315度から45度、緯度+5度から-5度の範囲にある。[2]
軌道面は、月面投入後3時間から39時間の間に月着陸側が軌道面から0.5度以上外れないように向けられなければならない。[2]
csm.SemiMajorAxis = 1894578.3; % [m] csm.Eccentricity = 0.0004197061; csm.Inclination = 155.804726; % [deg] csm.RAAN = 182.414087; % [deg] csm.ArgOfPeriapsis = 262.877900; % [deg] csm.TrueAnomaly = 0.000824; % [deg]
傾斜角度は ICRF X-Y 平面に対する相対角度であることに注意してください。ICRF の X-Y 軸は地球の北極に対して垂直です。黄道に対する地球の軸の傾きは約 23.44 度ですが、月の軸の傾きは約 5.145 度です。したがって、ICRF X-Y 平面に対する月の軸の傾きは、およそ 度の間で変化します。これは、上記の約 155.8 度の軌道傾斜角が、月面座標で 度の緯度を維持するという要件を満たす理由を説明しています。
視線アクセス解析で使用する月面上のローバーの緯度と経度を指定します。
rover.Latitude =0; % [deg] rover.Longitude =23.5; % [deg]
モデルを開いて構成する
付属のSimulink®モデルを開きます。このモデルには、出力ポートに接続された Orbit Propagator ブロックが含まれています。 Orbit Propagator
ブロックはベクトル化をサポートします。これにより、ブロック パラメーター ウィンドウで初期条件の配列を指定するか、set_param
を使用することで、1 つのブロックで複数の衛星をモデル化できます。
mission.mdl = "LunarOrbitPropagatorBlockExampleModel";
open_system(mission.mdl);
SimulationInput
オブジェクトを使用して、ミッションのモデルを構成します。SimulationInput
オブジェクトを使用すると、モデルを変更せずに複数のミッションを構成し、それらの設定でシミュレーションを実行できます。
mission.sim.in = Simulink.SimulationInput(mission.mdl);
モデル内の Orbit Propagator ブロックへのパスを定義します。
csm.blk = mission.mdl + "/Orbit Propagator";
ベースワークスペースに Moon プロパティを読み込みます。
moon.F = 0.0012; % Moon ellipticity (flattening) (Ref 1) moon.R_eq = 1737400; % [m] Lunar radius in meters (Ref 1) moon.ReferenceEllipsoid = referenceEllipsoid("moon","meter"); % Moon reference ellipsoid moon.Data = matfile("lunarGeographicalData.mat"); % Load moon geographical data
CSM の初期条件を設定します。前のセクションで定義したケプラーの軌道要素セットを割り当てるには、setBlockParameter
を使用します。
mission.sim.in = mission.sim.in.setBlockParameter(... csm.blk, "startDate", string(juliandate(mission.StartDate)),... csm.blk, "stateFormatNum", "Orbital elements",... csm.blk, "orbitType", "Keplerian",... csm.blk, "semiMajorAxis", string(csm.SemiMajorAxis),... csm.blk, "eccentricity", string(csm.Eccentricity),... csm.blk, "inclination", string(csm.Inclination),... csm.blk, "raan", string(csm.RAAN),... csm.blk, "argPeriapsis", string(csm.ArgOfPeriapsis),... csm.blk, "trueAnomaly", string(csm.TrueAnomaly));
ブロックの位置と速度の出力ポートを、月固定フレームを使用するように設定します。月の固定フレームは、平均地球/極軸 (ME) 参照システムです。
mission.sim.in = mission.sim.in.setBlockParameter(... csm.blk, "centralBody", "Moon",... csm.blk, "outportFrame", "Fixed-frame");
プロパゲーターを構成します。
mission.sim.in = mission.sim.in.setBlockParameter(... csm.blk, "propagator", "Numerical (high precision)",... csm.blk, "gravityModel", "Spherical Harmonics",... csm.blk, "moonSH", "LP-100K",... % moon spherical harmonic potential model csm.blk, "shDegree", "100",... % Spherical harmonic model degree and order csm.blk, "useMoonLib", "off");
setModelParameter を使用してモデルレベルのソルバー設定を適用します。数値プロパゲーターを使用する場合、最高のパフォーマンスと精度を得るには、可変ステップ ソルバーを使用します。
mission.sim.in = mission.sim.in.setModelParameter(... SolverType="Variable-step",... SolverName="VariableStepAuto",... RelTol="1e-6",... AbsTol="1e-7",... StopTime=string(seconds(mission.Duration)));
モデル出力ポート データをタイムテーブル オブジェクトのデータセットとして保存します。
mission.sim.in = mission.sim.in.setModelParameter(... SaveOutput="on",... OutputSaveName="yout",... SaveFormat="Dataset",... DatasetSignalFormat="timetable");
モデルを実行してCSMエフェメリスを収集する
上記で定義した SimulationInput
オブジェクトを使用してモデルをシミュレートします。この例では、Orbit Propagator ブロックは、月を中心とした固定座標フレームで位置と速度の状態を出力するように設定されています。
mission.sim.out = sim(mission.sim.in);
モデル出力データ構造から位置と速度データを抽出します。
csm.TimetablePos = mission.sim.out.yout{1}.Values; csm.TimetableVel = mission.sim.out.yout{2}.Values;
timetable
オブジェクトでミッションの開始日を設定します。
csm.TimetablePos.Properties.StartTime = mission.StartDate;
プロセスシミュレーションデータ
月の赤道半径と平坦化を使用して、緯度、経度、高度を計算します。値は度とメートルで表示されます。
csm.MEPos = [csm.TimetablePos.Data(:,1) ... csm.TimetablePos.Data(:,2) csm.TimetablePos.Data(:,3)]; lla = ecef2lla(csm.MEPos, moon.F, moon.R_eq); csm.LLA = timetable(csm.TimetablePos.Time, ... lla(:,1), lla(:,2), lla(:,3), ... VariableNames=["Lat", "Lon", "Alt"]); clear lla; disp(csm.LLA);
Time Lat Lon Alt ____________________ _________ _______ __________ 20-Sep-1969 05:10:12 -2.3072 175.32 1.5639e+05 20-Sep-1969 05:10:22 -2.3039 174.83 1.5639e+05 20-Sep-1969 05:11:12 -2.2846 172.39 1.5639e+05 20-Sep-1969 05:13:36 -2.2061 165.35 1.5639e+05 20-Sep-1969 05:16:00 -2.0947 158.31 1.564e+05 20-Sep-1969 05:18:24 -1.952 151.27 1.5641e+05 20-Sep-1969 05:20:48 -1.7804 144.24 1.5641e+05 20-Sep-1969 05:23:12 -1.5824 137.21 1.5642e+05 20-Sep-1969 05:25:36 -1.3608 130.17 1.5641e+05 20-Sep-1969 05:28:00 -1.119 123.14 1.5641e+05 20-Sep-1969 05:30:24 -0.86057 116.11 1.564e+05 20-Sep-1969 05:32:48 -0.58934 109.09 1.564e+05 20-Sep-1969 05:35:12 -0.30942 102.06 1.5639e+05 20-Sep-1969 05:37:36 -0.025001 95.032 1.5639e+05 20-Sep-1969 05:40:00 0.25967 88.006 1.564e+05 20-Sep-1969 05:42:24 0.54034 80.978 1.564e+05 20-Sep-1969 05:44:48 0.81284 73.951 1.5641e+05 20-Sep-1969 05:47:12 1.0732 66.923 1.5642e+05 20-Sep-1969 05:49:36 1.3175 59.893 1.5643e+05 20-Sep-1969 05:52:00 1.5422 52.863 1.5646e+05 20-Sep-1969 05:54:24 1.7439 45.831 1.5649e+05 20-Sep-1969 05:56:48 1.9194 38.797 1.5652e+05 20-Sep-1969 05:59:12 2.0662 31.763 1.5656e+05 20-Sep-1969 06:01:36 2.1821 24.728 1.566e+05 20-Sep-1969 06:04:00 2.2652 17.691 1.5664e+05 20-Sep-1969 06:06:24 2.3145 10.655 1.5668e+05 20-Sep-1969 06:08:48 2.3291 3.6183 1.5673e+05 20-Sep-1969 06:11:12 2.309 -3.418 1.5676e+05 20-Sep-1969 06:13:36 2.2544 -10.454 1.5679e+05 20-Sep-1969 06:16:00 2.1663 -17.489 1.5682e+05 20-Sep-1969 06:18:24 2.046 -24.522 1.5683e+05 20-Sep-1969 06:20:48 1.8953 -31.554 1.5685e+05 20-Sep-1969 06:23:12 1.7163 -38.585 1.5686e+05 20-Sep-1969 06:25:36 1.5116 -45.614 1.5686e+05 20-Sep-1969 06:28:00 1.2844 -52.642 1.5686e+05 20-Sep-1969 06:30:24 1.0381 -59.668 1.5686e+05 20-Sep-1969 06:32:48 0.77625 -66.693 1.5685e+05 20-Sep-1969 06:35:12 0.50273 -73.718 1.5684e+05 20-Sep-1969 06:37:36 0.22159 -80.741 1.5683e+05 20-Sep-1969 06:40:00 -0.062926 -87.765 1.5682e+05 20-Sep-1969 06:42:24 -0.34651 -94.789 1.568e+05 20-Sep-1969 06:44:48 -0.62489 -101.81 1.5677e+05 20-Sep-1969 06:47:12 -0.89393 -108.84 1.5673e+05 20-Sep-1969 06:49:36 -1.1497 -115.87 1.5669e+05 20-Sep-1969 06:52:00 -1.3884 -122.89 1.5664e+05 20-Sep-1969 06:54:24 -1.6064 -129.92 1.566e+05 20-Sep-1969 06:56:48 -1.8006 -136.96 1.5656e+05 20-Sep-1969 06:59:12 -1.9679 -143.99 1.5652e+05 20-Sep-1969 07:01:36 -2.1058 -151.03 1.5647e+05 20-Sep-1969 07:04:00 -2.212 -158.06 1.5641e+05 20-Sep-1969 07:06:24 -2.2849 -165.1 1.5635e+05 20-Sep-1969 07:08:48 -2.3235 -172.14 1.563e+05 20-Sep-1969 07:10:12 -2.3299 -176.25 1.5626e+05
結果
3D 月面上の CSM 軌道を表示
figure; axis off; colormap gray; view(-5,23); axesm("globe","Geoid", moon.ReferenceEllipsoid); geoshow(moon.Data.moonalb20c, moon.Data.moonalb20cR, DisplayType="texturemap"); plot3(csm.MEPos(:,1), csm.MEPos(:,2), csm.MEPos(:,3),"r");
CSM 地上トレースとローバー位置の 2D 投影を表示
figure; colormap gray; axesm(MapProjection="robinson"); geoshow(moon.Data.moonalb20c, moon.Data.moonalb20cR, DisplayType="texturemap"); plotm(csm.LLA.Lat, csm.LLA.Lon, Color="r"); plotm(rover.Latitude, rover.Longitude, "xy", LineWidth=3);
関心のある時点でのCSMの視野を表示
分析する対象時間 (TOI) を定義します。この例では、データセット内の 30 番目のサンプルを選択します。
csm.TOI.LLA = csm.LLA(30,:);
月の中心から測定された軌道衛星の視線 (LOS) 視野 (FOV) の角度半径を計算します。
csm.TOI.FOV.Lambda0 = acosd(moon.R_eq / (moon.R_eq + csm.TOI.LLA.Alt)); % [deg] [csm.TOI.FOV.Lats, csm.TOI.FOV.Lons] = ... scircle1(csm.TOI.LLA.Lat, csm.TOI.LLA.Lon, csm.TOI.FOV.Lambda0);
TOI をプロットします。CSM の位置は緑色の十字で示され、LOS 視野は破線の円で示されます。
figure; colormap gray; axesm(MapProjection="robinson"); geoshow(moon.Data.moonalb20c, moon.Data.moonalb20cR, DisplayType="texturemap"); plotm(csm.TOI.FOV.Lats, csm.TOI.FOV.Lons, "g--", LineWidth=1); % CSM visibility projected onto the map plotm(csm.LLA.Lat, csm.LLA.Lon, Color="r"); % CSM ground trace plotm(csm.TOI.LLA.Lat, csm.TOI.LLA.Lon, "g+", MarkerSize=8); % sub-CSM point plotm(rover.Latitude, rover.Longitude, "xy", LineWidth=3);
ローバーからの CSM 視線可視性を表示
月が球体であると仮定してアクセス間隔を推定します。
lambda_all = acosd(moon.R_eq ./ (moon.R_eq + csm.LLA.Alt)); % [deg] angular radius of CSM FOV measured from Moon center d = distance(csm.LLA.Lat, csm.LLA.Lon, ... rover.Latitude, rover.Longitude); % [deg] angular distance between sub-CSM point and rover rover.Access.InView = csm.LLA(lambda_all - d > 0,:); % timetable containing the in view data samples rover.Access.InView.Time.Format = "HH:mm:ss"; clear lambda_all d;
軌道モジュールとローバー間のアクセス間隔をプロットします。
if height(rover.Access.InView) ~= 0 % Look for breaks in the timestamps to identify pass starts rover.Access.StartIdx = [1, find(diff(rover.Access.InView.Time) > minutes(5))]; rover.Access.StartTime = rover.Access.InView.Time(rover.Access.StartIdx); rover.Access.StopIdx = [rover.Access.StartIdx(2:end)-1, height(rover.Access.InView)]; rover.Access.StopTime = rover.Access.InView.Time(rover.Access.StopIdx); rover.Access.Duration = rover.Access.StopTime - rover.Access.StartTime; % Show pass intervals in table rover.Access.IntervalTable = table(rover.Access.StartTime, rover.Access.StopTime, rover.Access.Duration, ... VariableNames=["Pass Start", "Pass End", "Duration"]); disp(rover.Access.IntervalTable); disp(' '); % Set up figure window/plot figure; colormap gray; axesm(MapProjection="robinson") geoshow(moon.Data.moonalb20c, moon.Data.moonalb20cR, DisplayType="texturemap") title(join(["Passes Between", string(csm.LLA.Time(1)), ... "and", string(csm.LLA.Time(end))])); % Plot inView, rover, and CSM orbit plotm(rover.Access.InView.Lat, rover.Access.InView.Lon, "+g"); plotm(rover.Latitude, rover.Longitude, "xy", LineWidth=3); plotm(csm.LLA.Lat, csm.LLA.Lon, Color="r"); % Plot pass inteval rover.Access.EdgeIndices = rover.Access.InView(sort([rover.Access.StartIdx rover.Access.StopIdx]), :); for j = 1 : height(rover.Access.EdgeIndices) textm(rover.Access.EdgeIndices.Lat(j) + 10, ... rover.Access.EdgeIndices.Lon(j), ... string(rover.Access.EdgeIndices.Time(j)), Color="y", Rotation=30); end else disp("The CSM is not visible from the rover during the defined mission time.") end
Pass Start Pass End Duration __________ ________ ________ 05:54:24 06:08:48 00:14:24
参考文献
[1] ウィリアムズ、デビッド・R博士「月ファクトシート」、惑星ファクトシート、NSSDCA、NASAゴダード宇宙飛行センター、2020年1月13日、https://nssdc.gsfc.nasa.gov/planetary/factsheet/moonfact.html。
[2] タイマー、T.P.(NASA ミッション分析オフィス)「アポロ CSM モジュールの月軌道パラメータの変化」、NASA TM X-55460。メリーランド州グリーンベルト:ゴダード宇宙飛行センター、1966年2月。