このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
衛星シナリオによる宇宙機姿勢プロファイルの解析
この例では、Simulink ® で衛星の軌道と姿勢の状態を伝播し、衛星シナリオで計算された軌道と姿勢プロファイルを可視化する方法を示します。使用するもの:
Aerospace Blockset ™ 宇宙機ダイナミクス ブロック
Aerospace Blockset 姿勢プロファイル ブロック
Aerospace Toolbox
satelliteScenarioオブジェクト
宇宙機ダイナミクス ブロックは、数値積分を使用して宇宙機の並進および回転ダイナミクスをモデル化します。時間の経過に伴う 1 つまたは複数の宇宙機の位置、速度、姿勢、角速度を計算します。最も正確な結果を得るには、許容誤差設定が低い (1e-8 未満) 可変ステップ ソルバーを使用します。ミッションの要件に応じて、許容範囲を大きくすることで速度を上げることができます。そうすると、ソリューションの精度に影響する可能性があります。
姿勢プロファイル ブロックは、衛星の指定されたアライメント軸を指定されたターゲットに合わせる最短の四元数回転を返します。この例では、衛星はミッションの開始時に天底を指し、次にターゲット 1 に合わせるように旋回し、再び天底を指し、最後にターゲット 2 を指すように旋回します。両方のターゲットは地理的な場所として提供されます。
Aerospace Toolbox satelliteScenario オブジェクトを使用すると、以前に生成され、タイムスタンプが付けられたエフェメリスと姿勢データを、時系列または時刻表オブジェクトとしてシナリオに読み込むことができます。データはシナリオの時間ステップに合わせてシナリオ オブジェクト内で補間され、Simulink モデルで生成されたデータを新規または既存の satelliteScenario オブジェクトに組み込むことができます。この例では、衛星の軌道と姿勢の状態が Spacecraft Dynamics ブロックで計算され、このデータを使用して、アクセス分析のために新しい satelliteScenario オブジェクトに衛星が追加されます。
モデル例を開く
このサンプル モデルは、衛星がアマゾンの熱帯雨林地域を上空飛行し、その地域の画像をキャプチャして森林破壊の傾向を追跡する地球観測ミッションを実行するように構成されています。衛星は、アクティブに画像を撮影していないときや、ノルウェーのスヴァールバル諸島の地上局にダウンリンクしていないときは、天底を向いています。
mission.mdl = "SpacecraftDynamicsCustomAttitudeExampleModel";
open_system(mission.mdl);
ミッションパラメーターと衛星初期条件の定義
ミッションの開始日と期間を指定します。この例では、MATLAB ® 構造を使用してミッション データを整理します。これらの構造により、例の後半でのデータへのアクセスがより直感的になります。また、グローバル ベースのワークスペースを整理するのにも役立ちます。
mission.StartDate = datetime(2021,1,1,12,0,0); mission.Duration = hours(1.5);
Spacecraft Dynamics ブロックの衛星プロパティを設定する
衛星の初期軌道要素を指定します。
mission.Satellite.blk = mission.mdl + "/Spacecraft Dynamics"; mission.Satellite.SemiMajorAxis = 7.2e6; % meters mission.Satellite.Eccentricity = .05; mission.Satellite.Inclination = 70; % deg mission.Satellite.ArgOfPeriapsis = 0; % deg mission.Satellite.RAAN = 215; % deg mission.Satellite.TrueAnomaly = 200; % deg
衛星の初期姿勢状態を指定します。
mission.Satellite.q0 = [0.1509 0.4868 0.3031 -0.8052];
mission.Satellite.pqr = [0, 0, 0]; % deg/s提供された初期条件と必要な伝播設定を使用して、Spacecraft Dynamics ブロックを構成します。これらの値は、Simulink のプロパティ インスペクターから設定することもできます。
set_param(mission.Satellite.blk, ... "startDate", string(juliandate(mission.StartDate)), ... "stateFormatNum", "Orbital elements", ... "orbitType", "Keplerian", ... "semiMajorAxis", string(mission.Satellite.SemiMajorAxis), ... "eccentricity", string(mission.Satellite.Eccentricity), ... "inclination", string(mission.Satellite.Inclination), ... "raan", string(mission.Satellite.RAAN), ... "argPeriapsis", string(mission.Satellite.ArgOfPeriapsis), ... "trueAnomaly", string(mission.Satellite.TrueAnomaly)); set_param(mission.Satellite.blk, ... "attitudeFormat", "Quaternion", ... "attitudeFrame", "ICRF", ... "attitude", mat2str(mission.Satellite.q0), ... "attitudeRate", mat2str(mission.Satellite.pqr));
軌道伝播には EGM2008球面調和関数重力モデルを使用します。
set_param(mission.Satellite.blk, ... "gravityModel", "Spherical Harmonics", ... "earthSH", "EGM2008", ... % Earth spherical harmonic potential model "shDegree", "120", ... % Spherical harmonic model degree and order "useEOPs", "on", ... % Use EOP's in ECI to ECEF transformations "eopFile", "aeroiersdata.mat"); % EOP data file
重力勾配トルクの寄与を姿勢力学計算に含めることができます。
set_param(mission.Satellite.blk, "useGravGrad", "on");
ターゲット指向のための姿勢プロファイルブロックを構成する
姿勢 Profile ブロックは 2 つの地上地点を対象としており、1 つ目は森林伐採を観測するブラジルのアマゾン熱帯雨林の地点、2 つ目はノルウェーのスヴァールバル諸島の地上局に画像データをダウンリンクする地点です。ブロックは、以下に示すようにモデル内に事前構成されています。

ポインティング モードパラメーターに「LatLonAlt をポイント」オプションが選択されています。z 軸は、衛星の主なアライメントベクトルとして使用されます。これは、衛星の機体の z 軸が、シミュレーション全体を通じてブロックに渡される地理座標を指していることを意味します。LVLH フレームの y 軸は、移動方向の軌道沿いを指し、二次制約ベクトルとして定義されます。衛星の機体の x 軸が二次位置合わせベクトルとして指定されます。これにより、プライマリーアライメントを乱すことなく、ミッション全体を通じて可能な限り衛星を前方に向けることができます。
望ましい出力を生成するためのSimulinkモデルの設定
set_param を使用してモデルレベルのソルバー設定を適用します。最高のパフォーマンスと精度を得るには、可変ステップ ソルバーを使用します。最大ステップ サイズを、大きな時間ギャップのない出力データが得られる値に設定します。
set_param(mission.mdl, ... "SolverType", "Variable-step", ... "SolverName", "VariableStepAuto", ... "RelTol", "0.5e-5", ... "AbsTol", "1e-5", ... "MaxStep", "5", ... "MinStep", "auto", ... "StopTime", string(seconds(mission.Duration)));
モデル出力ポート データを timetable オブジェクトの dataset として保存します。
set_param(mission.mdl, ... "SaveOutput", "on", ... "OutputSaveName", "yout", ... "SaveFormat", "Dataset", ... "DatasetSignalFormat", "timetable");
モデルを実行して衛星エフェメリスと姿勢プロファイルを収集する
モデルのシミュレーションを実行します。この例では、Spacecraft Dynamics ブロックは、慣性 (ICRF/GCRF) 座標系で位置と速度の状態を出力します。
mission.SimOutput = sim(mission.mdl);
衛星シナリオの作成と可視化
分析のために、衛星シナリオ オブジェクトを作成します。1 分のタイムステップを指定します。
scenario = satelliteScenario(mission.StartDate, ...
mission.StartDate + mission.Duration, 60);ブラジルとスヴァールバル諸島の地上局として 2 つのターゲットを追加します。
gsNO = groundStation(scenario, 78, 21, Name="Svalbard, NO")gsNO =
GroundStation with properties:
Name: Svalbard, NO
ID: 1
Latitude: 78 degrees
Longitude: 21 degrees
Altitude: 0 meters
MinElevationAngle: 0 degrees
ConicalSensors: [1x0 matlabshared.satellitescenario.ConicalSensor]
Gimbals: [1x0 matlabshared.satellitescenario.Gimbal]
Transmitters: [1x0 satcom.satellitescenario.Transmitter]
Receivers: [1x0 satcom.satellitescenario.Receiver]
Accesses: [1x0 matlabshared.satellitescenario.Access]
Eclipse: [1x0 Aero.satellitescenario.Eclipse]
CoordinateAxes: [1x1 matlabshared.satellitescenario.CoordinateAxes]
MarkerColor: [1 0.4118 0.1608]
MarkerSize: 6
ShowLabel: true
LabelFontColor: [1 1 1]
LabelFontSize: 15
gsAmazon = groundStation(scenario, -4.9, -66, Name="Amazon Rainforest")gsAmazon =
GroundStation with properties:
Name: Amazon Rainforest
ID: 2
Latitude: -4.9 degrees
Longitude: -66 degrees
Altitude: 0 meters
MinElevationAngle: 0 degrees
ConicalSensors: [1x0 matlabshared.satellitescenario.ConicalSensor]
Gimbals: [1x0 matlabshared.satellitescenario.Gimbal]
Transmitters: [1x0 satcom.satellitescenario.Transmitter]
Receivers: [1x0 satcom.satellitescenario.Receiver]
Accesses: [1x0 matlabshared.satellitescenario.Access]
Eclipse: [1x0 Aero.satellitescenario.Eclipse]
CoordinateAxes: [1x1 matlabshared.satellitescenario.CoordinateAxes]
MarkerColor: [1 0.4118 0.1608]
MarkerSize: 6
ShowLabel: true
LabelFontColor: [1 1 1]
LabelFontSize: 15
観測衛星をシナリオに追加します。SimOutput オブジェクト内の位置 timetable データを更新して、余分なデータ ポイントを削除します。
mission.Satellite.Ephemeris = retime(mission.SimOutput.yout{1}.Values, ...
seconds(uniquetol(mission.SimOutput.tout, .0001)));
sat = satellite(scenario, mission.Satellite.Ephemeris, ...
"CoordinateFrame", "inertial", "Name", "ObservationSat");衛星に、搭載カメラを表す 35 度の半角を持つコニカル センサーを追加します。シナリオ ビューアーで視野の可視化を有効にします。可視化を支援するために、センサーは衛星から 10 m 離れた +z 方向に取り付けられています。
snsr = conicalSensor(sat, MaxViewAngle=70, MountingLocation=[0 0 10]); fieldOfView(snsr);
コニカル センサーと 2 つの地上局間のアクセスを追加します。
acNO = access(snsr, gsNO)
acNO =
Access with properties:
Sequence: [4 1]
LineWidth: 3
LineColor: [0.3922 0.8314 0.0745]
acAmazon = access(snsr, gsAmazon)
acAmazon =
Access with properties:
Sequence: [4 2]
LineWidth: 3
LineColor: [0.3922 0.8314 0.0745]
pointAt メソッドを使用して、記録された姿勢timetable を衛星に関連付けます。パラメーターExtrapolationMethod は、 timetable範囲外での指示動作を制御します。
mission.Satellite.AttitudeProfile = retime(mission.SimOutput.yout{3}.Values, ...
seconds(uniquetol(mission.SimOutput.tout, .0001)));
pointAt(sat, mission.Satellite.AttitudeProfile, ...
"CoordinateFrame", "inertial", "Format", "quaternion", "ExtrapolationMethod", "nadir");シナリオを表示して操作するには、 衛星シナリオ ビューアー を開きます。
viewer1 = satelliteScenarioViewer(scenario);

衛星に 3D モデルを割り当て、その座標軸を可視化します。赤、緑、青の矢印は、衛星ボディ座標系の x、y、z 軸に沿っています。
sat.Visual3DModel = "SmallSat.glb";
coordinateAxes(sat, Scale=2);
camtarget(viewer1, sat);
シナリオを開始するには、衛星を天底に向けます。マゼンタのマーカーはコニカル センサーを表します。

衛星はアマゾンの熱帯雨林にあるターゲット 1 に近づくと、このターゲットを指し示して追跡するように旋回します。


撮影セグメントが完了すると、衛星は再び天底を指します。

衛星が北極の地上局の範囲内に入ると、この目標を指すように旋回します。


カスタムジンバル ステアリング
この例では、搭載カメラが衛星の機体に固定されている MATLAB および Simulink の単純な地球観測衛星ミッションのカスタム姿勢データをインポートする方法を示します。もう 1 つの一般的なアプローチは、センサーをジンバルに固定し、宇宙機の機体ではなくジンバルを操作してセンサーの方向を調整することです。上記のシナリオを変更して、センサーをジンバルに取り付け、ジンバルを操作して衛星の真下の領域を均一にスキャンします。
衛星を常に天底を指すようにリセットし、以前に指定したカスタム姿勢プロファイルを上書きします。
delete(viewer1);
pointAt(sat, "nadir");既存のセンサー オブジェクトを削除して衛星から削除し、同じプロパティを持つ新しいセンサーをジンバルに取り付けます。
delete(snsr); gim = gimbal(sat); snsr = conicalSensor(gim, MaxViewAngle=70, MountingLocation=[0 0 10]); fieldOfView(snsr);
ジンバル ステアリングの方位角と仰角を定義して、衛星の下の時間経過に伴うスイープ パターンをモデル化します。
gimbalSweep.Time = seconds(1:50:5000)'; gimbalSweep.Az = [... 45*ones(1,7),... 45:-5:-45,... -45*ones(1,13),... -45:5:45,... 45*ones(1,13),... 45:-5:-45,... -45*ones(1,13)]; gimbalSweep.Az(end-2:end) = []; gimbalSweep.Az = gimbalSweep.Az + 90; gimbalSweep.El = [... 0:-5:-30,... -30*ones(1,19),... -30:5:30,... 30*ones(1,19),... 30:-5:-30,... -30*ones(1,19),... -30:5:30]; gimbalSweep.El(end-2:end) = [];
コマンドされた方位角と仰角の値を時間の経過に沿ってプロットします。
figure(1) hold on; plot(gimbalSweep.Time', gimbalSweep.Az); plot(gimbalSweep.Time', gimbalSweep.El); hold off; legend(["Az (deg)", "El (deg)"]);

方位角と仰角をtimetable に保存します。
gimbalSweep.TT = timetable(gimbalSweep.Time, [gimbalSweep.Az', gimbalSweep.El']);
timetable でジンバルを操縦します。提供されたデータの範囲外のタイムステップでは、ジンバルはデフォルトの方向に戻ります。
pointAt(gim, gimbalSweep.TT);
更新されたシナリオを 衛星シナリオ ビューアー で表示します。
viewer2 = satelliteScenarioViewer(scenario);
