メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

衛星コンステレーションと航空機間のアクセスの解析

この例では、航空機と Walker-Delta 衛星コンステレーションの軌道をモデル化する方法と、航空機と衛星コンステレーション間のアクセスを解析および可視化する方法を示します。

ミッションの開始日と期間を定義する

ミッションの開始日と期間を指定します。

mission.StartDate = datetime(2021,1,1,12,0,0);
mission.Duration = hours(2.5);

航空機の軌跡を定義する

航空機の軌跡は、緯度 39.5 度、経度 -75 度、高度10000 メートルから始まり、緯度 45.9 度、経度 -61.2 度、高度10000 メートルで終わります。飛行時間は2.5時間です。軌跡は10秒ごとにサンプリングされます。geoTrajectory オブジェクトを使用して軌跡を定義します。

startLLA = [39.5 -75 10000];
endLLA = [45.9 -61.2 10000];
timeOfTravel = [0 2.5*3600]; % s
sampleRate  = 10;        % s
aircraft.trajectory = geoTrajectory([startLLA;endLLA], timeOfTravel, SampleRate=sampleRate);

geoplot を使用して航空機の軌跡をプロットします。

timeSamples = 0:10:9000; % s
lla = lookupPose(aircraft.trajectory, timeSamples);
geoplot(lla(:,1), lla(:,2), "b-");
geolimits([30 50], [-110 -50]);

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type line.

新しい衛星シナリオに航空機を追加する

satelliteScenario オブジェクトを作成する。satelliteScenario オブジェクトは、衛星、地上局、プラットフォーム、およびそれらの相互作用で構成されるミッション シナリオを表します。このオブジェクトでは、軌跡や解析結果の視覚化も可能になります。

mission.scenario = satelliteScenario(mission.StartDate, ...
    mission.StartDate + mission.Duration, 60);

衛星シナリオ ビューアーを起動してミッションを可視化します。

mission.viewer = satelliteScenarioViewer(mission.scenario);

シナリオに航空機を追加します。衛星シナリオで航空機の軌跡を表すには、geoTrajectory オブジェクトによって表されるカスタム軌跡を持つ Platform オブジェクトを使用します。Platform オブジェクトを作成するには、関数 platform を使用します。航空機の軌道を非表示にして、地上の軌跡を可視化します。航空機を可視化するために 3D モデルを追加します。カメラのターゲットを航空機に設定します。

aircraft.obj = platform(mission.scenario,aircraft.trajectory, Name="Aircraft");
aircraft.obj.MarkerColor = "green";
hide(aircraft.obj.Path);
show(aircraft.obj.GroundTrack);
aircraft.obj.Visual3DModel = "NarrowBodyAirliner.glb";
camtarget(mission.viewer, aircraft.obj);

衛星シナリオ ビューアーのホーム ボタンをクリックすると、ビューアーは地球中心のビューに戻ります。

衛星シナリオにウォーカー・デルタコンスタレーションを追加する

walkerDelta 関数を使用して、シナリオに Walker-Deltaコンスタレーションを追加します。隣接面の同等の衛星の真近点角の変化は、Phasing*360/totalSatellites として計算されます。緯度引数は、最初の軌道に沿った衛星の分布の開始点を定義します。

constellation.Radius = 7200000; % meters
constellation.Inclination = 70; % deg
constellation.TotalSatellites = 12;
constellation.GeometryPlanes = 4;
constellation.Phasing = 1;
constellation.ArgLat = 15; % deg

constellation.obj = walkerDelta(mission.scenario, ...
    constellation.Radius, ...
    constellation.Inclination, ...
    constellation.TotalSatellites, ...
    constellation.GeometryPlanes, ...
    constellation.Phasing, ...
    ArgumentOfLatitude=constellation.ArgLat, ...
    Name="Sat");

コンスタレーションにセンサーを追加する

半角を設定できるコニカル センサーを各衛星に追加します。衛星シナリオ ビューアーで視野の視覚化を有効にします。可視化を支援するために、センサーは衛星から 10 m 離れた +z 方向に取り付けられています。

sensor.HalfAngle = 35; % deg
sensor.Names = constellation.obj.Name + " satellite";
sensor.obj = conicalSensor(constellation.obj, MaxViewAngle=sensor.HalfAngle*2, MountingLocation=[0 0 10], Name=sensor.Names);
sensor.FOV.obj = fieldOfView(sensor.obj);

航空機を指すようにコンスタレーションを設定する

コンスタレーション内のすべての衛星を航空機に向けるように設定します。

pointAt(constellation.obj,aircraft.obj);

衛星から航空機へのアクセス間隔を決定する

コンステレーション内の衛星と航空機間のアクセス間隔を解析します。

accessAnalysis.obj = access(sensor.obj, aircraft.obj);
accessAnalysis.Intervals = accessIntervals(accessAnalysis.obj);
accessAnalysis.Intervals = sortrows(accessAnalysis.Intervals,"StartTime");
disp(accessAnalysis.Intervals)
          Source            Target      IntervalNumber         StartTime                EndTime           Duration    StartOrbit    EndOrbit
    __________________    __________    ______________    ____________________    ____________________    ________    __________    ________

    "Sat_4 satellite"     "Aircraft"          1           01-Jan-2021 12:14:00    01-Jan-2021 12:27:00       780          1            1    
    "Sat_9 satellite"     "Aircraft"          1           01-Jan-2021 12:19:00    01-Jan-2021 12:35:00       960          1            1    
    "Sat_6 satellite"     "Aircraft"          1           01-Jan-2021 12:48:00    01-Jan-2021 13:04:00       960          1            1    
    "Sat_8 satellite"     "Aircraft"          1           01-Jan-2021 12:55:00    01-Jan-2021 13:10:00       900          1            1    
    "Sat_5 satellite"     "Aircraft"          1           01-Jan-2021 13:23:00    01-Jan-2021 13:39:00       960          1            1    
    "Sat_7 satellite"     "Aircraft"          1           01-Jan-2021 13:32:00    01-Jan-2021 13:46:00       840          1            2    
    "Sat_4 satellite"     "Aircraft"          2           01-Jan-2021 13:57:00    01-Jan-2021 14:14:00      1020          2            2    
    "Sat_12 satellite"    "Aircraft"          1           01-Jan-2021 13:57:00    01-Jan-2021 13:59:00       120          2            2    
    "Sat_9 satellite"     "Aircraft"          2           01-Jan-2021 14:09:00    01-Jan-2021 14:22:00       780          2            2    
    "Sat_11 satellite"    "Aircraft"          1           01-Jan-2021 14:26:00    01-Jan-2021 14:30:00       240          2            2    

システム全体のアクセス率を計算する

システム全体のアクセス率を決定します。これは、シナリオの開始時刻から終了時刻までに、少なくとも 1 つの衛星が航空機にアクセスできる時間の割合です。

accessStatus を使用して、航空機と各衛星間のアクセス状態を時間の経過に沿って計算します。出力配列の各行は、コンスタレーション内の衛星に対応します。各列はシナリオ内の時間ステップに対応します。値 True は、衛星がその特定の時間サンプルで航空機にアクセスできることを示します。accessStatus の 2 番目の出力には、シナリオのタイムステップが含まれます。

[accessAnalysis.Status, mission.TimeSteps] = accessStatus(accessAnalysis.obj);

any を使用して、各衛星の航空機へのアクセスに対応するすべての行に対して論理 OR を実行します。この結果、論理の単一行ベクトルが生成されます。このベクトルでは、シナリオ サンプル時間 (60 秒) の期間、対応する時間ステップで少なくとも 1 つの衛星が航空機にアクセスできる場合に、特定の要素が true になります。stairs を使用して、時間に対するシステム全体のアクセス ステータスをプロットします。

accessAnalysis.SystemWideAccessStatus = any(accessAnalysis.Status, 1);
stairs(mission.TimeSteps, accessAnalysis.SystemWideAccessStatus);
ylim([-.2, 1.2]);
xlabel("Time");
ylabel("System-Wide Access Status");
yticks([0,1]);

Figure contains an axes object. The axes object with xlabel Time, ylabel System-Wide Access Status contains an object of type stair.

ベクトル内で値が True である要素の数を数えます。この量に 60 秒のサンプル時間を掛けて、少なくとも 1 つの衛星が航空機にアクセスできる合計時間 (秒) を決定します。

accessAnalysis.SystemWideAccessDuration = sum(accessAnalysis.SystemWideAccessStatus) * mission.scenario.SampleTime; % seconds

システム全体のアクセス率を計算します。

accessAnalysis.SystemWideAccessPercentage = (accessAnalysis.SystemWideAccessDuration/seconds(mission.Duration))*100;
disp("System Wide Access = " + accessAnalysis.SystemWideAccessPercentage + " %")
System Wide Access = 67.3333 %

衛星シナリオをアニメーション化する

衛星シナリオ ビューアーを構成して、軌道とラベルを非表示にします。

hide(constellation.obj.Orbit);
constellation.obj.ShowLabel = false;
aircraft.obj.ShowLabel = false;

シナリオを再生します。

mission.viewer.PlaybackSpeedMultiplier = 200;
play(mission.scenario);

参考

オブジェクト

関数

トピック