メインコンテンツ

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

大規模衛星コンスタレーションを介したマルチホップ パス選択

この例では、2 つの地上局間のアクセスを得るために、1,000 個の低軌道 ( LEO)衛星で構成される大規模なコンスタレーションを通過する経路を決定する方法を示します。続いて、このパスを使用できる次の 3 時間の間隔を計算する方法を示します。

衛星シナリオの作成

2 つの地上局間のアクセスを確立するための大規模なコンスタレーションを通る経路は、2021 年 12 月 10 日午後 6 時 27 分 57PM(UTC) の時点で決定する必要があるものとします。次に、このパスを使用できる次の 3 時間の時間を決定する必要があります。したがって、適切な StartTimeStopTime を使用して衛星シナリオを作成します。SampleTime を 60 秒に設定します。パスは最初のタイム ステップでのみ決定する必要があるため、シナリオの AutoSimulate を false に設定して、StopTime までタイム ステップが自動的に進まないようにします。AutoSimulate が false の場合、SimulationStatus が使用可能になります。

startTime = datetime(2021,12,10,18,27,57); % 10 December 2021, 6:27:57 PM UTC
stopTime = startTime + hours(3);           % 10 December 2021, 9:27:57 PM UTC
sampleTime = 60;                           % Seconds
sc = satelliteScenario(startTime,stopTime,sampleTime,"AutoSimulate",false)
sc = 
  satelliteScenario with properties:

             StartTime: 10-Dec-2021 18:27:57
              StopTime: 10-Dec-2021 21:27:57
            SampleTime: 60
        SimulationTime: 10-Dec-2021 18:27:57
      SimulationStatus: NotStarted
          AutoSimulate: 0
    CentralBodyOptions: [1×1 Aero.satellitescenario.CentralBodyOptions]
            Satellites: [1×0 matlabshared.satellitescenario.Satellite]
        GroundStations: [1×0 matlabshared.satellitescenario.GroundStation]
             Platforms: [1×0 matlabshared.satellitescenario.Platform]
               Viewers: [0×0 matlabshared.satellitescenario.Viewer]
              AutoShow: 1

大規模な衛星コンスタレーションを追加する

2 ライン エレメント ( TLE ) ファイル largeConstellation.tle から大規模な衛星コンスタレーションを追加します。このコンスタレーションは 1,000 基のLEO衛星で構成されています。

sat = satellite(sc,"largeConstellation.tle");
numSatellites = numel(sat)
numSatellites = 
1000

地上局を追加する

地上局を追加します。地上局間のアクセスには、衛星コンスタレーションを介したマルチホップ パスを確立する必要があります。

gsSource = groundStation(sc,42.3001,-71.3504, ... % Latitude and longitude in degrees
    "Name","Source Ground Station");
gsTarget = groundStation(sc,17.4351,78.3824, ...  % Latitude and longitude in degrees
    "Name","Target Ground Station");

地上局に対する衛星の仰角を決定する

StartTime に対応するソース地上局とターゲット地上局に対する各衛星の仰角を決定します。したがって、最初のタイムステップのシナリオ、つまり StartTime をシミュレートするには、advance を使用します。続いて、aer を使用して、地上局に対する各衛星の仰角を取得します。初期ルーティングでは、「ソース地上局」に対するパスの最初の衛星の仰角と、「ターゲット地上局」に対するパスの最後の衛星が少なくとも 30 度である必要があると仮定します。したがって、この値以上の仰角を決定します。

% Calculate the scenario state corresponding to StartTime.
advance(sc);

% Retrieve the elevation angle of each satellite with respect to the ground
% stations.
[~,elSourceToSat] = aer(gsSource,sat);
[~,elTargetToSat] = aer(gsTarget,sat);

% Determine the elevation angles that are greater than or equal to 30
% degrees.
elSourceToSatGreaterThanOrEqual30 = (elSourceToSat >= 30)';
elTargetToSatGreaterThanOrEqual30 = (elTargetToSat >= 30)';

コンスタレーションへの初期アクセスに最適な衛星を決定する

大規模コンスタレーションへの初期アクセスに使用される最適な衛星は、以下の条件を同時に満たす衛星であると想定されます。

  • 「ターゲット地上局」までの範囲が最も近い。

  • 「送信元地上局」に対して仰角が30度以上であること。

% Find the indices of the elements of elSourceToSatGreaterThanOrEqual30
% whose value is true.
trueID = find(elSourceToSatGreaterThanOrEqual30 == true);

% These indices are essentially the indices of satellites in sat whose
% elevation angle with respect to "Source Ground Station" is at least 30
% degrees. Determine the range of these satellites to "Target Ground
% Station".
[~,~,r] = aer(sat(trueID), gsTarget);

% Determine the index of the element in r bearing the minimum value.
[~,minRangeID] = min(r);

% Determine the element in trueID at the index minRangeID.
id = trueID(minRangeID);

% This is the index of the best satellite for initial access to the
% constellation. This will be the first hop in the path. Initialize a
% variable 'node' that stores the first two nodes of the routing - namely,
% "Source Ground Station" and the best satellite for initial constellation
% access.
nodes = {gsSource sat(id)};

目標地上局までの経路上の残りのノードを決定する

パス内の残りのノードは、最初の衛星を決定するために使用されたものと同様のロジックを使用して決定されます。現在のノードにおける衛星の仰角が「ターゲット地上局」に対してすでに 30 度以上である場合、次のノードは「ターゲット地上局」となり、経路が完了します。それ以外の場合は、パスの最初の衛星を決定するために使用されたものと同様のロジックを使用して、コンスタレーション内の次のノードが選択されます。次のノードは、次の条件を同時に満たすノードです。

  • 「ターゲット地上局」までの範囲が最も近い。

  • 現在のノードにおける衛星に対する仰角は-15 度以上です。

コンスタレーション内の各衛星に対する地平線が約 -21.9813 度であるため、仰角の値として -15 度が選択されました。この値は、地球が球形であるという仮定と、これらの衛星が高度およそ 500 キロメートルのほぼ円形の軌道上にあるという事実から導き出されます。地球が球体であるという仮定は、下の地平線の仰角を計算するためにのみ使用されることに注意してください。衛星シナリオシミュレーション自体は、地球の WGS84 楕円体モデルを想定しています。

earthRadius = 6378137;                                                   % meters
altitude = 500000;                                                       % meters
horizonElevationAngle = asind(earthRadius/(earthRadius + altitude)) - 90 % degrees
horizonElevationAngle = 
-21.9813

他の衛星に対する仰角が -21.9813 度より大きい衛星は、後者から見えることが保証されます。ただし、-15 度を選択すると十分なマージンが生まれます。

後続のノードは、「ターゲット地上局」に対する仰角が少なくとも 30 度である衛星に到達するまで、継続的にパスに追加されます。この後、最終ノードは「ターゲット地上局」そのものとなり、ルーティングは完了します。

% Minimum elevation angle of satellite nodes with respect to the prior
% node.
minSatElevation = -15; % degrees

% Flag to specify if the complete multi-hop path has been found.
pathFound = false;

% Determine nodes of the path in a loop. Exit the loop once the complete
% multi-hop path has been found.
while ~pathFound
    % Index of the satellite in sat corresponding to current node is
    % updated to the value calculated as index for the next node in the
    % prior loop iteration. Essentially, the satellite in the next node in
    % prior iteration becomes the satellite in the current node in this
    % iteration.
    idCurrent = id;

    % This is the index of the element in elTargetToSatGreaterThanOrEqual30
    % tells if the elevation angle of this satellite is at least 30 degrees
    % with respect to "Target Ground Station". If this element is true, the
    % routing is complete, and the next node is the target ground station.
    if elTargetToSatGreaterThanOrEqual30(idCurrent)
        nodes = {nodes{:} gsTarget}; %#ok<CCAT> 
        pathFound = true;
        continue
    end

    % If the element is false, the path is not complete yet. The next node
    % in the path must be determined from the constellation. Determine
    % which satellites have elevation angle that is greater than or equal
    % to -15 degrees with respect to the current node. To do this, first
    % determine the elevation angle of each satellite with respect to the
    % current node.
    [~,els] = aer(sat(idCurrent),sat); 

    % Overwrite the elevation angle of the satellite with respect to itself
    % to be -90 degrees to ensure it does not get re-selected as the next
    % node.
    els(idCurrent) = -90; 

    % Determine the elevation angles that are greater than or equal to -15
    % degrees.
    s = els >= minSatElevation;

    % Find the indices of the elements in s whose value is true.
    trueID = find(s == true);

    % These indices are essentially the indices of satellites in sat whose
    % elevation angle with respect to the current node is greater than or
    % equal to -15 degrees. Determine the range of these satellites to
    % "Target Ground Station".
    [~,~,r] = aer(sat(trueID), gsTarget);

    % Determine the index of the element in r bearing the minimum value.
    [~,minRangeID] = min(r);

    % Determine the element in trueID at the index minRangeID.
    id = trueID(minRangeID);

    % This is the index of the best satellite among those in sat to be used
    % for the next node in the path. Append this satellite to the 'nodes'
    % variable.
    nodes = {nodes{:} sat(id)}; %#ok<CCAT>
end

計算されたパスを使用できる間隔を決定する

次に、計算されたパスを使用できる次の 3 時間の間隔を決定する必要があります。これを実現するために、シナリオの各タイムステップを手動で実行する必要はありません。代わりに、シナリオを StartTime から StopTime まで自動シミュレートすることができます。したがって、シナリオの AutoSimulatetrue に設定します。

sc.AutoSimulate = true;

パス内の計算されたノードを使用してアクセス解析を追加します。アクセス可視化の LineColor を赤に設定します。

ac = access(nodes{:});
ac.LineColor = "red";

accessIntervals 関数を使用してアクセス間隔を決定します。AutoSimulatetrue に設定されているため、シナリオはアクセス間隔を計算する前に、指定された SampleTimeStartTime から StopTime までを自動的にシミュレートします。これらの間隔は、計算されたマルチホップ パスを使用できる時間です。

intvls = accessIntervals(ac)
intvls=2×8 table
            Source                     Target             IntervalNumber         StartTime                EndTime           Duration    StartOrbit    EndOrbit
    _______________________    _______________________    ______________    ____________________    ____________________    ________    __________    ________

    "Source Ground Station"    "Target Ground Station"          1           10-Dec-2021 18:27:57    10-Dec-2021 18:29:57      120          NaN          NaN   
    "Source Ground Station"    "Target Ground Station"          2           10-Dec-2021 20:01:57    10-Dec-2021 20:04:57      180          NaN          NaN   

パスを可視化する

ShowDetailsfalse に設定して衛星シナリオ ビューアーを起動します。ShowDetails プロパティが false に設定されている場合、衛星と地上局のみが表示されます。ラベルと軌道は非表示になります。衛星や地上局にマウスを合わせるとラベルが表示されます。緑の線はマルチホップ パスを表します。また、可視化をさらに整理するために、衛星の MarkerSize を 6 に設定します。マルチホップ パスが表示されるように、カメラの位置を緯度 60 度、経度 5 度に設定します。

v = satelliteScenarioViewer(sc,"ShowDetails",false);
sat.MarkerSize = 6; % Pixels
campos(v,60,5);     % Latitude and longitude in degrees

地上局をクリックすると、マウスオーバーしなくてもラベルが表示されます。マルチホップ パスの一部である衛星をクリックすると、マウスを移動しなくてもその軌道とラベルが表示されます。

シナリオを再生します。

play(sc);

次のステップ

この例では、2 つの地上局間のアクセスを実現するために、大規模な衛星コンスタレーションを介したマルチホップ パスを決定する方法を示しました。経路上の後続の各ノードは、前のノードに対する仰角が少なくとも -15 度である衛星の中で、「ターゲット地上局」までの距離が最小となるように選択されました。ただし、これによって必ずしもマルチホップ パスに沿った全体的な距離が最短になるわけではないことに注意してください。最短経路を見つける 1 つの方法は、グラフ探索アルゴリズムを使用してすべての可能な経路を見つけ、その中から最短経路を選択することです。異なる衛星と地上局間の距離を調べるには、aer 関数の 3 番目の出力を使用します。

さらに、この例では、シナリオ StartTime のパスが 1 回だけ計算され、その後、シナリオの期間中使用されました。その結果、地上局はシナリオ期間の 3 時間のうち 5 分間しかアクセスできませんでした。地上局間のアクセス期間を延長するには、上記のコードを変更して、AutoSimulatefalse に設定した後、advance を使用して各シナリオの時間ステップでパスを再計算することができます。advance を呼び出すと、SimulationTimeSampleTime 1 つ進みます。すべてのパスを計算したら、AutoSimulate を true に戻し、それぞれの一意のパスに対応するアクセス オブジェクトを作成し、すべてのアクセス オブジェクトで accessIntervals を呼び出してアクセス間隔を再計算します。

参考

オブジェクト

関数

トピック