Этот пример показывает, как распространить орбиты созвездия спутников и вычислить и визуализировать интервалы доступа между отдельными спутниками и несколькими наземными станциями. Он использует:
Aerospace Blockset Orbit Propagator
блок
Aerospace Toolbox satelliteScenario
объект
Aerospace Toolbox satelliteScenario
позволяет вам загрузить ранее сгенерированные эфемеридные данные с отметкой времени в сценарий из timeseries или объекта timetable. Данные интерполируются в объект сценария, чтобы соответствовать временным шагам сценария, что позволяет включать данные, сгенерированные в модели Simulink, в новый или существующий satelliteScenario
объект. В этом примере показано, как распространить созвездие спутников в Simulink с помощью Aerospace Blockset Orbit Propagator
блокируйте, и загружайте записанные эфемеридные данные в satelliteScenario
объект для анализа доступа.
Укажите дату и длительность начала миссии. Этот пример использует структуры MATLAB для организации данных миссии. Эти структуры делают доступ к данным позже в примере более интуитивно понятным. Они также помогают объявить глобальное базовое рабочее пространство.
mission.StartDate = datetime(2020, 11, 30, 22, 23, 24); mission.Duration = hours(24);
Созвездие в этом примере является созвездием Walker-Delta, смоделированным аналогично созвездию ESA Galileo GNSS (Глобальная навигационная спутниковая система). Созвездие состоит из 24 спутников на средней околоземной орбите (MEO).
Созвездия Уокера-Дельты используют обозначение:
где
склонность
общее количество спутников
количество одинаково пространственных геометрических плоскостей
интервалы между спутниками в смежных плоскостях
Созвездия Уокер-Дельта являются общим решением для максимального геометрического покрытия Земли при минимизации количества спутников, необходимых для выполнения миссии. Навигационная система Galileo является Walker-Delta созвездие (24 спутника в 3 плоскостях, наклоненных под углом 56 степени) на орбите 23 222 км.
Задайте орбитальные элементы Кеплера для созвездия в mission.StartDate
.
mission.Satellites.SemiMajorAxis = 23222e3 * ones(24,1); % meters mission.Satellites.Eccentricity = 0.0005 * ones(24,1); mission.Satellites.Inclination = 56 * ones(24,1); % deg mission.Satellites.ArgOfPeriapsis = 350 * ones(24,1); % deg
Восходящие узлы орбитальных плоскостей созвездия Уокера-Дельты равномерно распределены с интервалами вокруг экватора. Количество спутников на самолет, S, задается как . С 24 спутниками всего, это приводит к 3 плоскостям из 8 спутников с 120 градусными интервалами вокруг экватора. Спутники в каждой орбитальной плоскости распределены с интервалами или 45 степени.
mission.Satellites.RAAN = sort(repmat([0 120 240], 1,8))'; % deg mission.Satellites.TrueAnomaly = repmat(0:45:315, 1,3)'; % deg
Наконец, учитывайте относительный угловой сдвиг между смежными орбитальными плоскостями. Различие фаз задаётся как или 15 степени в этом случае.
mission.Satellites.TrueAnomaly(9:16) = mission.Satellites.TrueAnomaly(9:16) + 15; mission.Satellites.TrueAnomaly(17:24) = mission.Satellites.TrueAnomaly(17:24) + 30;
Показать узлы созвездия в таблице.
ConstellationDefinition = table(mission.Satellites.SemiMajorAxis, ... mission.Satellites.Eccentricity, ... mission.Satellites.Inclination, ... mission.Satellites.RAAN, ... mission.Satellites.ArgOfPeriapsis, ... mission.Satellites.TrueAnomaly, ... 'VariableNames', ["a (m)", "e", "i (deg)", "Ω (deg)", "ω (deg)", "ν (deg)"])
ConstellationDefinition=24×6 table
a (m) e i (deg) Ω (deg) ω (deg) ν (deg)
__________ ______ _______ _______ _______ _______
2.3222e+07 0.0005 56 0 350 0
2.3222e+07 0.0005 56 0 350 45
2.3222e+07 0.0005 56 0 350 90
2.3222e+07 0.0005 56 0 350 135
2.3222e+07 0.0005 56 0 350 180
2.3222e+07 0.0005 56 0 350 225
2.3222e+07 0.0005 56 0 350 270
2.3222e+07 0.0005 56 0 350 315
2.3222e+07 0.0005 56 120 350 15
2.3222e+07 0.0005 56 120 350 60
2.3222e+07 0.0005 56 120 350 105
2.3222e+07 0.0005 56 120 350 150
2.3222e+07 0.0005 56 120 350 195
2.3222e+07 0.0005 56 120 350 240
2.3222e+07 0.0005 56 120 350 285
2.3222e+07 0.0005 56 120 350 330
⋮
Откройте включенную модель Simulink. Эта модель содержит Orbit Propagator
блок, соединенный с выходными портами. The Orbit Propagator
блок поддерживает векторизацию. Это позволяет вам смоделировать несколько спутников в одном блоке путем определения массивов начальных условий в Block Parameters
окно или использование set_param
. Модель также включает раздел «Анализ и визуализация миссии», который содержит приборную панель Callback button
. При нажатии этой кнопки запускает модель, создает новый объект satelliteScenario в глобальном базовом рабочем пространстве, содержащем спутник или созвездие, заданную в Orbit Propagator
Блок и открывает окно Средства просмотра Satellite Scenario для нового сценария. Чтобы просмотреть исходный код для этого действия, дважды нажмите кнопку коллбэка. Раздел «Анализ и визуализация миссии» является автономным рабочим процессом для создания нового объекта satelliteScenario и не используется в качестве части этого письменного примера.
mission.mdl = "OrbitPropagatorBlockExampleModel";
open_system(mission.mdl);
snapshotModel(mission.mdl);
Определите путь к Orbit Propagator
блок в модели.
mission.Satellites.blk = mission.mdl + "/Orbit Propagator";
Установите начальные условия спутника. Чтобы назначить набор орбитальных элементов Кеплера, заданный в предыдущем разделе, используйте set_param
.
set_param(mission.Satellites.blk, ... "startDate", num2str(juliandate(mission.StartDate)), ... "stateFormatNum", "Orbital elements", ... "orbitType", "Keplerian", ... "semiMajorAxis", "mission.Satellites.SemiMajorAxis", ... "eccentricity", "mission.Satellites.Eccentricity", ... "inclination", "mission.Satellites.Inclination", ... "raan", "mission.Satellites.RAAN", ... "argPeriapsis", "mission.Satellites.ArgOfPeriapsis", ... "trueAnomaly", "mission.Satellites.TrueAnomaly");
Установите положение и скорость выходных портов блока, чтобы использовать земную фиксированную систему координат, которая является Международной наземной системой отсчета (ITRF).
set_param(mission.Satellites.blk, ... "centralBody", "Earth", ... "outportFrame", "Fixed-frame");
Сконфигурируйте распространитель. Этот пример использует Oblate ellipsoid (J2)
распространитель, включающий зональные гармонические возмущения второго порядка в вычислениях траектории спутника, с учетом облатности Земли.
set_param(mission.Satellites.blk, ... "propagator", "Numerical (high precision)", ... "gravityModel", "Oblate ellipsoid (J2)", ... "useEOPs", "off");
Применить настройку решателя уровня модели с помощью set_param
. Для лучшей эффективности и точности при использовании численного распространителя используйте решатель с переменным шагом.
set_param(mission.mdl, ... "SolverType", "Variable-step", ... "SolverName", "VariableStepAuto", ... "RelTol", "1e-6", ... "AbsTol", "1e-7", ... "StopTime", string(seconds(mission.Duration)));
Сохраните выходы порта модели как набор данных объектов временных рядов.
set_param(mission.mdl, ... "SaveOutput", "on", ... "OutputSaveName", "yout", ... "SaveFormat", "Dataset");
Симулируйте модель.
mission.SimOutput = sim(mission.mdl);
Извлеките данные о положении и скорости из структуры выходных данных модели.
mission.Satellites.TimeseriesPosECEF = mission.SimOutput.yout{1}.Values; mission.Satellites.TimeseriesVelECEF = mission.SimOutput.yout{2}.Values;
Установите начальные данные из миссии в объект timeseries.
mission.Satellites.TimeseriesPosECEF.TimeInfo.StartDate = mission.StartDate; mission.Satellites.TimeseriesVelECEF.TimeInfo.StartDate = mission.StartDate;
Объекты timeseries содержат данные о положении и скорости для всех 24 спутников.
mission.Satellites.TimeseriesPosECEF
timeseries Common Properties: Name: '' Time: [79x1 double] TimeInfo: [1x1 tsdata.timemetadata] Data: [24x3x79 double] DataInfo: [1x1 tsdata.datametadata] More properties, Methods
satelliteScenario O
bjectСоздайте объект спутникового сценария для анализа.
scenario = satelliteScenario(mission.StartDate, mission.StartDate + hours(24), 60);
Добавьте все 24 спутника к спутниковому сценарию из положения ECEF и объектов timeseries скорости, используя satellite
способ.
sat = satellite(scenario, mission.Satellites.TimeseriesPosECEF, mission.Satellites.TimeseriesVelECEF, ... "CoordinateFrame", "ecef", "Name", "GALILEO " + (1:24))
sat = 1×24 Satellite array with properties: Name ID ConicalSensors Gimbals Transmitters Receivers Accesses GroundTrack Orbit OrbitPropagator MarkerColor MarkerSize ShowLabel LabelFontSize LabelFontColor
disp(scenario)
satelliteScenario with properties: StartTime: 30-Nov-2020 22:23:24 StopTime: 01-Dec-2020 22:23:24 SampleTime: 60 Viewers: [0×0 matlabshared.satellitescenario.Viewer] Satellites: [1×24 matlabshared.satellitescenario.Satellite] GroundStations: [] AutoShow: 1
Средства просмотра со многими спутниками могут стать переполненными и трудными для чтения. Чтобы сохранить окно читаемым, мы вручную управляем графическими свойствами элементов сценария.
Скрыть метки спутника и наземные дорожки.
set(sat, "ShowLabel", false);
hide([sat(:).GroundTrack]);
Установите спутники в каждой орбитальной плоскости, чтобы иметь один и тот же цвет орбиты.
set(sat(1:8), "MarkerColor", "red"); set(sat(9:16), "MarkerColor", "blue"); set(sat(17:24), "MarkerColor", "green"); orbit = [sat(:).Orbit]; set(orbit(1:8), "LineColor", "red"); set(orbit(9:16), "LineColor", "blue"); set(orbit(17:24), "LineColor", "green");
Чтобы предоставить точные данные о местоположении, местоположение на Земле должно иметь доступ как минимум к 4 спутникам в созвездии в любой данный момент времени. В этом примере используйте три местоположения MathWorks, чтобы сравнить общий доступ к созвездиям за 1-дневное окно анализа с различными областями Земли:
Штаб-квартира MathWorks в Натике, Массачусетс, США (42.30048 °, -71.34908 °)
MathWorks München in Ismaning (около Мюнхена), Германия (48.23206 °, 11.68445 °)
MathWorks Bangalore в Бангалоре, Индия (12.94448 °, 77.69256 °)
gsUS = groundStation(scenario, 42.30048, -71.34908, ... "MinElevationAngle", 10, "Name", "MW Natick"); gsDE = groundStation(scenario, 48.23206, 11.68445, ... "MinElevationAngle", 10, "Name", "MW Munchen"); gsIN = groundStation(scenario, 12.94448, 77.69256, ... "MinElevationAngle", 10, "Name", "MW Bangalore"); figure geoscatter([gsUS.Latitude gsDE.Latitude gsIN.Latitude], ... [gsUS.Longitude gsDE.Longitude gsIN.Longitude], "red", "filled") geolimits([-75 75], [-180 180]) title("MathWorks Ground Stations")
Вычислите доступ к линии видимости между наземными станциями и каждым отдельным спутником с помощью access
способ.
for idx = 1:numel(sat) access(gsUS, sat(idx)); access(gsDE, sat(idx)); access(gsIN, sat(idx)); end accessUS = [gsUS(:).Accesses]; accessDE = [gsDE(:).Accesses]; accessIN = [gsIN(:).Accesses];
Установите цвета доступа, чтобы соответствовать цветам орбитальной плоскости, назначенным ранее в примере.
set(accessUS(1:8), "LineColor", "red"); set(accessUS(9:16), "LineColor", "blue"); set(accessUS(17:24), "LineColor", "green"); set(accessDE(1:8), "LineColor", "red"); set(accessDE(9:16), "LineColor", "blue"); set(accessDE(17:24), "LineColor", "green"); set(accessIN(1:8), "LineColor", "red"); set(accessIN(9:16), "LineColor", "blue"); set(accessIN(17:24), "LineColor", "green");
Просмотрите полную таблицу доступа между каждой наземной станцией и всеми спутниками в совокупности как таблицы. Отсортируйте интервалы доступа по времени начала интервала. Спутники, добавленные из эфемеридных данных, не отображают значения для StartOrbit и Stop orbit.
intervalsUS = accessIntervals(accessUS); intervalsUS = sortrows(intervalsUS, "StartTime", "ascend")
intervalsUS=52×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
___________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"MW Natick" "GALILEO 1" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:40:24 11820 NaN NaN
"MW Natick" "GALILEO 2" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:08:24 6300 NaN NaN
"MW Natick" "GALILEO 3" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:34:24 660 NaN NaN
"MW Natick" "GALILEO 12" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:35:24 4320 NaN NaN
"MW Natick" "GALILEO 13" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:47:24 1440 NaN NaN
"MW Natick" "GALILEO 18" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:51:24 12480 NaN NaN
"MW Natick" "GALILEO 19" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:13:24 6600 NaN NaN
"MW Natick" "GALILEO 20" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:27:24 240 NaN NaN
"MW Natick" "GALILEO 11" 1 30-Nov-2020 22:38:24 01-Dec-2020 00:00:24 4920 NaN NaN
"MW Natick" "GALILEO 17" 1 30-Nov-2020 22:47:24 01-Dec-2020 03:19:24 16320 NaN NaN
"MW Natick" "GALILEO 8" 1 30-Nov-2020 23:09:24 01-Dec-2020 03:15:24 14760 NaN NaN
"MW Natick" "GALILEO 7" 1 01-Dec-2020 00:28:24 01-Dec-2020 04:55:24 16020 NaN NaN
"MW Natick" "GALILEO 24" 1 01-Dec-2020 00:29:24 01-Dec-2020 04:40:24 15060 NaN NaN
"MW Natick" "GALILEO 6" 1 01-Dec-2020 01:54:24 01-Dec-2020 06:41:24 17220 NaN NaN
"MW Natick" "GALILEO 23" 1 01-Dec-2020 02:04:24 01-Dec-2020 05:52:24 13680 NaN NaN
"MW Natick" "GALILEO 5" 1 01-Dec-2020 03:30:24 01-Dec-2020 08:25:24 17700 NaN NaN
⋮
intervalsDE = accessIntervals(accessDE); intervalsDE = sortrows(intervalsDE, "StartTime", "ascend")
intervalsDE=51×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
____________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"MW Munchen" "GALILEO 2" 1 30-Nov-2020 22:23:24 01-Dec-2020 02:01:24 13080 NaN NaN
"MW Munchen" "GALILEO 3" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:20:24 7020 NaN NaN
"MW Munchen" "GALILEO 4" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:40:24 1020 NaN NaN
"MW Munchen" "GALILEO 19" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:42:24 8340 NaN NaN
"MW Munchen" "GALILEO 20" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:35:24 4320 NaN NaN
"MW Munchen" "GALILEO 10" 1 30-Nov-2020 22:38:24 30-Nov-2020 22:49:24 660 NaN NaN
"MW Munchen" "GALILEO 18" 1 30-Nov-2020 22:42:24 01-Dec-2020 01:37:24 10500 NaN NaN
"MW Munchen" "GALILEO 9" 1 30-Nov-2020 22:44:24 01-Dec-2020 00:43:24 7140 NaN NaN
"MW Munchen" "GALILEO 1" 1 30-Nov-2020 22:55:24 01-Dec-2020 03:37:24 16920 NaN NaN
"MW Munchen" "GALILEO 16" 1 30-Nov-2020 23:24:24 01-Dec-2020 02:15:24 10260 NaN NaN
"MW Munchen" "GALILEO 17" 1 01-Dec-2020 00:13:24 01-Dec-2020 02:19:24 7560 NaN NaN
"MW Munchen" "GALILEO 15" 1 01-Dec-2020 00:18:24 01-Dec-2020 03:45:24 12420 NaN NaN
"MW Munchen" "GALILEO 8" 1 01-Dec-2020 00:36:24 01-Dec-2020 05:07:24 16260 NaN NaN
"MW Munchen" "GALILEO 14" 1 01-Dec-2020 01:24:24 01-Dec-2020 05:17:24 13980 NaN NaN
"MW Munchen" "GALILEO 24" 1 01-Dec-2020 01:57:24 01-Dec-2020 02:36:24 2340 NaN NaN
"MW Munchen" "GALILEO 7" 1 01-Dec-2020 02:16:24 01-Dec-2020 06:29:24 15180 NaN NaN
⋮
intervalsIN = accessIntervals(accessIN); intervalsIN = sortrows(intervalsIN, "StartTime", "ascend")
intervalsIN=45×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
______________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"MW Bangalore" "GALILEO 3" 1 30-Nov-2020 22:23:24 01-Dec-2020 02:38:24 15300 NaN NaN
"MW Bangalore" "GALILEO 4" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:05:24 9720 NaN NaN
"MW Bangalore" "GALILEO 5" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:17:24 3240 NaN NaN
"MW Bangalore" "GALILEO 9" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:55:24 9120 NaN NaN
"MW Bangalore" "GALILEO 10" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:19:24 3360 NaN NaN
"MW Bangalore" "GALILEO 16" 1 30-Nov-2020 22:23:24 01-Dec-2020 02:42:24 15540 NaN NaN
"MW Bangalore" "GALILEO 21" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:02:24 2340 NaN NaN
"MW Bangalore" "GALILEO 22" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:29:24 360 NaN NaN
"MW Bangalore" "GALILEO 15" 1 30-Nov-2020 23:36:24 01-Dec-2020 05:12:24 20160 NaN NaN
"MW Bangalore" "GALILEO 2" 1 30-Nov-2020 23:44:24 01-Dec-2020 04:05:24 15660 NaN NaN
"MW Bangalore" "GALILEO 21" 2 01-Dec-2020 01:15:24 01-Dec-2020 04:12:24 10620 NaN NaN
"MW Bangalore" "GALILEO 1" 1 01-Dec-2020 01:20:24 01-Dec-2020 05:26:24 14760 NaN NaN
"MW Bangalore" "GALILEO 14" 1 01-Dec-2020 01:29:24 01-Dec-2020 07:33:24 21840 NaN NaN
"MW Bangalore" "GALILEO 20" 1 01-Dec-2020 02:04:24 01-Dec-2020 05:56:24 13920 NaN NaN
"MW Bangalore" "GALILEO 8" 1 01-Dec-2020 02:56:24 01-Dec-2020 06:37:24 13260 NaN NaN
"MW Bangalore" "GALILEO 19" 1 01-Dec-2020 03:20:24 01-Dec-2020 07:32:24 15120 NaN NaN
⋮
Откройте 2-D и 3-D окно средства просмотра сценария. Окно средства просмотра содержит все 24 спутника в каждом из трех орбитальных плоскостей, а также три наземные станции, определенные ранее в этом примере. Линия рисуется между каждой наземной станцией и спутником во время их соответствующих интервалов доступа.
viewer3D = satelliteScenarioViewer(scenario);
Вычислите состояние доступа между каждым спутником и наземной станцией с помощью метода accessStatus. Постройте график кумулятивного доступа для каждой наземной станции в окне анализа за 1 день.
% Initialize array with size equal to number of timesteps in scenario timeSteps = mission.StartDate:seconds(60):mission.StartDate+days(1); statusUS = zeros(1, numel(timeSteps)); statusDE = statusUS; statusIN = statusUS; % Sum cumulative access at each timestep for idx = 1:24 statusUS = statusUS + accessStatus(accessUS(idx)); statusDE = statusDE + accessStatus(accessDE(idx)); statusIN = statusIN + accessStatus(accessIN(idx)); end clear idx; subplot(3,1,1); plot(timeSteps, statusUS); title("MW Natick to GALILEO") ylabel("# of satellites") subplot(3,1,2); plot(timeSteps, statusDE); title("MW München to GALILEO") ylabel("# of satellites") subplot(3,1,3); plot(timeSteps, statusIN); title("MW Bangalore to GALILEO") ylabel("# of satellites")
Собирайте метрики интервала доступа для каждой наземной станции в таблице для сравнения.
statusTable = [table(height(intervalsUS), height(intervalsDE), height(intervalsIN)); ... table(sum(intervalsUS.Duration)/3600, sum(intervalsDE.Duration)/3600, sum(intervalsIN.Duration)/3600); ... table(mean(intervalsUS.Duration/60), mean(intervalsDE.Duration/60), mean(intervalsIN.Duration/60)); ... table(mean(statusUS, 2), mean(statusDE, 2), mean(statusIN, 2)); ... table(min(statusUS), min(statusDE), min(statusIN)); ... table(max(statusUS), max(statusDE), max(statusIN))]; statusTable.Properties.VariableNames = ["MW Natick", "MW München", "MW Bangalore"]; statusTable.Properties.RowNames = ["Total # of intervals", "Total interval time (hrs)",... "Mean interval length (min)", "Mean # of satellites in view", ... "Min # of satellites in view", "Max # of satellites in view"]; statusTable
statusTable=6×3 table
MW Natick MW München MW Bangalore
_________ __________ ____________
Total # of intervals 52 51 45
Total interval time (hrs) 153.92 153.55 162.73
Mean interval length (min) 177.6 180.65 216.98
Mean # of satellites in view 6.4448 6.4289 6.8071
Min # of satellites in view 4 4 4
Max # of satellites in view 8 9 9
Созвездия Волкера-Дельты равномерно распределены по долготам. Натик и Мюнхен расположены в сходных широтах, и поэтому имеют очень сходные характеристики доступа относительно созвездия. Бангалор находится на широте ближе к экватору, и, несмотря на меньшее количество отдельных интервалов доступа, он имеет самое большое среднее количество спутников на виду, самое большое общее время интервала и самую длинную среднюю длительность интервала (на 40 минут). Все местоположения всегда имеют минимум 4 спутника, как требуется для трилатерации GNSS.
[1] Wertz, James R, David F. Everett, and Jeffery J. Puschell. Space Mission Engineering: The New Smad. Хоторн, Калифорния: Microcosm Press, 2011. Печать.
[2] Бич, Тереза У., Сефания Корнана, Мигель Б. Мора. Исследование алгоритмов проекта трех спутниковых созвездий. 14-й Международный симпозиум по динамике космических рейсов, Фос-ду-Игуасу, Бразилия, 1999 год.
[3] Европейское космическое агентство: Галилео Факты и фигур. https://www.esa.int/Applications/Navigation/Galileo/Facts_and_figures