В этом примере показано, как распространять орбиты группировки спутников и вычислять и визуализировать интервалы доступа между отдельными спутниками и несколькими наземными станциями. В нем используются:
Аэрокосмический блоксет Orbit Propagator блок
Панель инструментов для аэрокосмической промышленности satelliteScenario объект

Панель аэрокосмических инструментов satelliteScenario объект позволяет загружать ранее сгенерированные данные ephemeris с временной меткой в сценарий из объекта timeseries или schedule. Данные интерполируются в объекте сценария для выравнивания с шагами времени сценария, что позволяет включать данные, созданные в модели Simulink, в новую или существующую satelliteScenario объект. В этом примере показано, как распространять группу спутников в Simulink с помощью аэрокосмического блока Orbit Propagator блокировать и загружать зарегистрированные данные ephemeris в satelliteScenario объект для анализа доступа.
Укажите дату начала и продолжительность миссии. В этом примере для организации данных миссии используются структуры MATLAB. Эти структуры делают доступ к данным позже в примере более интуитивным. Они также помогают декларировать глобальное базовое рабочее пространство.
mission.StartDate = datetime(2020, 11, 30, 22, 23, 24); mission.Duration = hours(24);
Созвездие в этом примере представляет собой созвездие Уокера-Дельты, смоделированное аналогично созвездию ЕКА Galileo GNSS (Глобальная навигационная спутниковая система). Группировка состоит из 24 спутников на средней околоземной орбите (МЭО).
В созвездиях Уокера - Дельты используется обозначение:
T/P/F
где
= наклон
= общее количество спутников
= количество геометрических плоскостей одинакового пространства
= расстояние между спутниками в смежных плоскостях
Группировки Уокер-Дельта являются общим решением для максимального геометрического охвата Земли при минимизации количества спутников, необходимых для выполнения миссии. Навигационная система Галилео - Delta ходока созвездий (24 спутника в 3 самолетах, наклоненных в 56 градусах) в 23 222-километровой орбите.
Укажите орбитальные элементы Keplerian для созвездия в 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, задается как TP. При 24 спутниках это приводит к 3 плоскостям из 8 спутников с интервалами 120 градусов вокруг экватора. Спутники в каждой орбитальной плоскости распределены с интервалами 360∘S, или 45 градусов.
mission.Satellites.RAAN = sort(repmat([0 120 240], 1,8))'; % deg mission.Satellites.TrueAnomaly = repmat(0:45:315, 1,3)'; % deg
Наконец, учтите относительный угловой сдвиг между соседними орбитальными плоскостями. Разность фаз в данном случае задается как Δstart= F * 360T, или 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 блок, соединенный с выходными портами. Orbit Propagator блок поддерживает векторизацию. Это позволяет моделировать несколько спутников в одном блоке путем задания массивов начальных условий в Block Parameters окно или использование set_param. Модель также включает раздел «Анализ и визуализация миссий», содержащий инструментальную панель Callback button. Когда по ней щелкают, эта кнопка управляет моделью, создает новый объект satelliteScenario в глобальном основном рабочем пространстве, содержащем спутник или созвездие, определенное в Orbit Propagator и открывает окно «Просмотр спутниковых сценариев» для нового сценария. Чтобы просмотреть исходный код для этого действия, дважды нажмите кнопку обратного вызова. Раздел «Mission Analysis and Visualization» - автономный технологический процесс, чтобы создать новый объект satelliteScenario и не используется в качестве части этого письменного примера.
mission.mdl = "OrbitPropagatorBlockExampleModel";
open_system(mission.mdl);
snapshotModel(mission.mdl);
Определите путь к Orbit Propagator блок в модели.
mission.Satellites.blk = mission.mdl + "/Orbit Propagator";Задайте исходные условия спутника. Чтобы назначить набор орбитальных элементов Keplerian, определенный в предыдущем разделе, используйте 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;
Объекты временных рядов содержат данные о положении и скорости для всех 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 ObjectСоздайте объект сценария спутника для анализа.
scenario = satelliteScenario(mission.StartDate, mission.StartDate + hours(24), 60);
Добавьте все 24 спутника в сценарий спутника из объектов позиции и временных интервалов скорости ECEF с помощью 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 в Исманинге (близ Мюнхена), Германия (48.23206 °, 11.68445 °)
MathWorks Бангалор в Бангалоре, Индия (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);

Рассчитайте состояние доступа между каждым спутником и наземной станцией с помощью метода («По статусу»). Постройте график совокупного доступа для каждой наземной станции в течение 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 спутника, как это требуется для трилатерации ГНСС.
[1] Верц, Джеймс Р., Дэвид Ф. Эверетт и Джеффери Дж. Пушелл. Проектирование космических полетов: Новый Smad. Хоторн, Калифорния: Microcosm Press, 2011. Печать.
[2] Бук, Тереза У., Сефания Корнана, Мигель Б. Мора. Исследование алгоритмов проектирования трех спутниковых группировок. 14-й Международный симпозиум по динамике космических полетов, Фос-ду-Игуасу, Бразилия, 1999 год.
[3] Европейское космическое агентство: Галилео Факты и цифры. https://www.esa.int/Applications/Navigation/Galileo/Facts_and_figures