В этом примере показано, как распространить орбиты созвездия спутников и вычислить и визуализировать интервалы доступа между отдельными спутниками и несколькими наземными станциями. Это использует:
Aerospace Blockset Orbit Propagator
блок
Aerospace Toolbox satelliteScenario
объект
Aerospace Toolbox satelliteScenario
объект позволяет вам загрузить ранее сгенерированные, эфемеридные данные, к которым добавляют метку времени, в сценарий от объект расписания или timeseries. Данные интерполированы в объекте сценария выровняться с временными шагами сценария, позволив вам включить данные, сгенерированные в модель Simulink или в новый или в существующий satelliteScenario
объект. В этом примере показано, как распространить созвездие спутников в Simulink с Aerospace Blockset Orbit Propagator
блокируйтесь и загрузите регистрируемые эфемеридные данные в satelliteScenario
объект для анализа доступа.
Задайте дату начала и длительность для миссии. Этот пример использует структуры MATLAB, чтобы организовать данные о миссии. Эти структуры делают данные о доступе позже в примере более интуитивными. Они также помогают устранить помехи глобальное базовое рабочее пространство.
mission.StartDate = datetime(2020, 11, 30, 22, 23, 24); mission.Duration = hours(24);
Созвездие в этом примере является созвездием Уокера-Delta, смоделированным похожий на Галилео, европейский GNSS (Глобальная навигационная спутниковая система) созвездие. Созвездие состоит из 24 спутников в средней земной орбите (MEO).
Созвездия Уокера-Delta используют обозначение:
где
наклон
общее количество спутников
количество одинаково пробела геометрические плоскости
разрядка между спутниками в смежных плоскостях
Созвездия Уокера-Delta являются общим решением для максимизации геометрического покрытия по Земле при минимизации количества спутников, требуемых выполнять миссию. Система навигации Галилео является Уокером-Delta созвездие (24 спутника в 3 плоскостях, наклоненных в 56 градусах) в 29 599,8-километровой орбите.
Укажите Кеплеровские орбитальные элементы для созвездия в mission.StartDate
.
mission.Satellites.SemiMajorAxis = 29599.8e3 * 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
Возрастающие узлы орбитальных плоскостей созвездия Уокера-Delta равномерно распределены с промежутками в вокруг экватора. Количество спутников на плоскость, 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.96e+07 0.0005 56 0 350 0
2.96e+07 0.0005 56 0 350 45
2.96e+07 0.0005 56 0 350 90
2.96e+07 0.0005 56 0 350 135
2.96e+07 0.0005 56 0 350 180
2.96e+07 0.0005 56 0 350 225
2.96e+07 0.0005 56 0 350 270
2.96e+07 0.0005 56 0 350 315
2.96e+07 0.0005 56 120 350 15
2.96e+07 0.0005 56 120 350 60
2.96e+07 0.0005 56 120 350 105
2.96e+07 0.0005 56 120 350 150
2.96e+07 0.0005 56 120 350 195
2.96e+07 0.0005 56 120 350 240
2.96e+07 0.0005 56 120 350 285
2.96e+07 0.0005 56 120 350 330
⋮
Откройте включенную модель Simulink. Эта модель содержит Orbit Propagator
блок соединяется с выходными портами. The Orbit Propagator
блокируйте векторизацию поддержек. Это позволяет вам моделировать несколько спутников в одном блоке путем определения массивов начальных условий в Block Parameters
окно или использование set_param
. Модель также включает раздел "Mission Analysis and Visualization", который содержит инструментальную панель Callback button
. Когда кликнувшийся, эта кнопка запускает модель, создает новый объект satelliteScenario в глобальном базовом рабочем пространстве, содержащем спутник или созвездие, заданное в Orbit Propagator
блокируйтесь, и открывает окно Satellite Scenario Viewer для нового сценария. Чтобы просмотреть исходный код для этого действия, дважды щелкают по кнопке коллбэка. Раздел "Mission Analysis and Visualization" является автономным рабочим процессом, чтобы создать новый объект satelliteScenario и не используется в качестве части этого записанного примера.
mission.mdl = "OrbitPropagatorBlockExampleModel";
open_system(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: [57x1 double] TimeInfo: [1x1 tsdata.timemetadata] Data: [24x3x57 double] DataInfo: [1x1 tsdata.datametadata] More properties, Methods
satelliteScenario O
bjectСоздайте спутниковый объект сценария для анализа.
scenario = satelliteScenario(mission.StartDate, mission.StartDate + hours(24), 60);
Добавьте все 24 спутника в спутниковый сценарий от объектов timeseries положения и скорости ECEF с помощью satellite
метод.
sat = satellite(scenario, mission.Satellites.TimeseriesPosECEF, mission.Satellites.TimeseriesVelECEF, ... "CoordinateFrame", "ecef", "Name", "GALILEO " + (1:24))
sat = 1x24 Satellite array with properties: Name ID ConicalSensors Gimbals Transmitters Receivers Accesses GroundTrack Orbit OrbitPropagator MarkerColor MarkerSize ShowLabel LabelFontColor LabelFontSize
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: [1×0 matlabshared.satellitescenario.GroundStation] 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 дня в различные области Земли:
Натик, Массачусетс, США (42,30048 °,-71.34908 °)
Мюнхен, Германия (48,23206 °, 11,68445 °)
Бангалор, Индия (12,94448 °, 77,69256 °)
gsUS = groundStation(scenario, 42.30048, -71.34908, ... "MinElevationAngle", 10, "Name", "Natick"); gsDE = groundStation(scenario, 48.23206, 11.68445, ... "MinElevationAngle", 10, "Name", "Munchen"); gsIN = groundStation(scenario, 12.94448, 77.69256, ... "MinElevationAngle", 10, "Name", "Bangalore"); figure geoscatter([gsUS.Latitude gsDE.Latitude gsIN.Latitude], ... [gsUS.Longitude gsDE.Longitude gsIN.Longitude], "red", "filled") geolimits([-75 75], [-180 180]) title("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 и Остановки.
intervalsUS = accessIntervals(accessUS); intervalsUS = sortrows(intervalsUS, "StartTime", "ascend")
intervalsUS=40×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"Natick" "GALILEO 1" 1 30-Nov-2020 22:23:24 01-Dec-2020 04:04:24 20460 NaN NaN
"Natick" "GALILEO 2" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:24:24 10860 NaN NaN
"Natick" "GALILEO 3" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:57:24 2040 NaN NaN
"Natick" "GALILEO 12" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:00:24 5820 NaN NaN
"Natick" "GALILEO 13" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:05:24 2520 NaN NaN
"Natick" "GALILEO 18" 1 30-Nov-2020 22:23:24 01-Dec-2020 04:00:24 20220 NaN NaN
"Natick" "GALILEO 19" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:42:24 11940 NaN NaN
"Natick" "GALILEO 20" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:46:24 1380 NaN NaN
"Natick" "GALILEO 11" 1 30-Nov-2020 22:25:24 01-Dec-2020 00:18:24 6780 NaN NaN
"Natick" "GALILEO 17" 1 30-Nov-2020 22:50:24 01-Dec-2020 05:50:24 25200 NaN NaN
"Natick" "GALILEO 8" 1 30-Nov-2020 23:20:24 01-Dec-2020 07:09:24 28140 NaN NaN
"Natick" "GALILEO 7" 1 01-Dec-2020 01:26:24 01-Dec-2020 10:00:24 30840 NaN NaN
"Natick" "GALILEO 24" 1 01-Dec-2020 01:40:24 01-Dec-2020 07:12:24 19920 NaN NaN
"Natick" "GALILEO 14" 1 01-Dec-2020 03:56:24 01-Dec-2020 07:15:24 11940 NaN NaN
"Natick" "GALILEO 6" 1 01-Dec-2020 04:05:24 01-Dec-2020 12:14:24 29340 NaN NaN
"Natick" "GALILEO 23" 1 01-Dec-2020 04:10:24 01-Dec-2020 08:03:24 13980 NaN NaN
⋮
intervalsDE = accessIntervals(accessDE); intervalsDE = sortrows(intervalsDE, "StartTime", "ascend")
intervalsDE=40×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
_________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"Munchen" "GALILEO 2" 1 30-Nov-2020 22:23:24 01-Dec-2020 04:34:24 22260 NaN NaN
"Munchen" "GALILEO 3" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:58:24 12900 NaN NaN
"Munchen" "GALILEO 4" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:05:24 2520 NaN NaN
"Munchen" "GALILEO 10" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:58:24 5700 NaN NaN
"Munchen" "GALILEO 19" 1 30-Nov-2020 22:23:24 01-Dec-2020 01:36:24 11580 NaN NaN
"Munchen" "GALILEO 20" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:15:24 6720 NaN NaN
"Munchen" "GALILEO 21" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:28:24 300 NaN NaN
"Munchen" "GALILEO 9" 1 30-Nov-2020 22:34:24 01-Dec-2020 02:22:24 13680 NaN NaN
"Munchen" "GALILEO 18" 1 30-Nov-2020 22:41:24 01-Dec-2020 02:31:24 13800 NaN NaN
"Munchen" "GALILEO 1" 1 30-Nov-2020 23:05:24 01-Dec-2020 06:42:24 27420 NaN NaN
"Munchen" "GALILEO 16" 1 30-Nov-2020 23:29:24 01-Dec-2020 04:47:24 19080 NaN NaN
"Munchen" "GALILEO 15" 1 01-Dec-2020 00:50:24 01-Dec-2020 07:27:24 23820 NaN NaN
"Munchen" "GALILEO 17" 1 01-Dec-2020 01:05:24 01-Dec-2020 03:00:24 6900 NaN NaN
"Munchen" "GALILEO 8" 1 01-Dec-2020 01:57:24 01-Dec-2020 08:25:24 23280 NaN NaN
"Munchen" "GALILEO 14" 1 01-Dec-2020 02:36:24 01-Dec-2020 10:19:24 27780 NaN NaN
"Munchen" "GALILEO 7" 1 01-Dec-2020 04:35:24 01-Dec-2020 09:43:24 18480 NaN NaN
⋮
intervalsIN = accessIntervals(accessIN); intervalsIN = sortrows(intervalsIN, "StartTime", "ascend")
intervalsIN=31×8 table
Source Target IntervalNumber StartTime EndTime Duration StartOrbit EndOrbit
___________ ____________ ______________ ____________________ ____________________ ________ __________ ________
"Bangalore" "GALILEO 3" 1 30-Nov-2020 22:23:24 01-Dec-2020 05:12:24 24540 NaN NaN
"Bangalore" "GALILEO 4" 1 30-Nov-2020 22:23:24 01-Dec-2020 02:59:24 16560 NaN NaN
"Bangalore" "GALILEO 5" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:22:24 7140 NaN NaN
"Bangalore" "GALILEO 9" 1 30-Nov-2020 22:23:24 01-Dec-2020 03:37:24 18840 NaN NaN
"Bangalore" "GALILEO 10" 1 30-Nov-2020 22:23:24 01-Dec-2020 00:09:24 6360 NaN NaN
"Bangalore" "GALILEO 16" 1 30-Nov-2020 22:23:24 01-Dec-2020 08:44:24 37260 NaN NaN
"Bangalore" "GALILEO 21" 1 30-Nov-2020 22:23:24 30-Nov-2020 23:25:24 3720 NaN NaN
"Bangalore" "GALILEO 22" 1 30-Nov-2020 22:23:24 30-Nov-2020 22:58:24 2100 NaN NaN
"Bangalore" "GALILEO 15" 1 01-Dec-2020 00:17:24 01-Dec-2020 11:16:24 39540 NaN NaN
"Bangalore" "GALILEO 2" 1 01-Dec-2020 00:25:24 01-Dec-2020 07:10:24 24300 NaN NaN
"Bangalore" "GALILEO 22" 2 01-Dec-2020 00:48:24 01-Dec-2020 05:50:24 18120 NaN NaN
"Bangalore" "GALILEO 21" 2 01-Dec-2020 01:32:24 01-Dec-2020 08:29:24 25020 NaN NaN
"Bangalore" "GALILEO 1" 1 01-Dec-2020 03:06:24 01-Dec-2020 07:17:24 15060 NaN NaN
"Bangalore" "GALILEO 20" 1 01-Dec-2020 03:36:24 01-Dec-2020 12:38:24 32520 NaN NaN
"Bangalore" "GALILEO 14" 1 01-Dec-2020 05:48:24 01-Dec-2020 13:29:24 27660 NaN NaN
"Bangalore" "GALILEO 19" 1 01-Dec-2020 05:53:24 01-Dec-2020 17:06:24 40380 NaN NaN
⋮
Откройте 2D и 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("Natick to GALILEO") ylabel("# of satellites") subplot(3,1,2); plot(timeSteps, statusDE); title("München to GALILEO") ylabel("# of satellites") subplot(3,1,3); plot(timeSteps, statusIN); title("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 = ["Natick", "München", "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
Natick München Bangalore
______ _______ _________
Total # of intervals 40 40 31
Total interval time (hrs) 167.88 169.95 180.42
Mean interval length (min) 251.82 254.93 349.19
Mean # of satellites in view 7.018 7.1041 7.5337
Min # of satellites in view 5 5 5
Max # of satellites in view 9 10 9
Созвездия Уокера-Delta равномерно распределяются через долготы. Натик и Мюнхен расположены в подобных широтах, и поэтому имеют очень похожие характеристики доступа относительно созвездия. Бангалор в широте ближе к экватору, и несмотря на наличие более низкого количества отдельных интервалов доступа, это имеет самое высокое среднее количество спутников в поле зрения, самое высокое полное время интервала и самая долгая средняя длительность интервала (приблизительно на 95 минут). Все местоположения всегда имеют по крайней мере 4 спутника в поле зрения, как требуется для трилатерации GNSS.
[1] Wertz, Джеймс Р, Дэвид Ф. Эверетт и Джеффри Дж. Пушелл. Разработка космической миссии: новый Smad. Хоуторн, CA: нажатие микромира, 2011. Печать.
[2] Бук, Тереза В., Sefania Cornana, Мигель Б. Мора. Исследование Трех Алгоритмов Проекта Спутниковой группировки. 14-й Международный Симпозиум по Динамике Космического полета, Foz делают Iguaçu, Бразилия 1999.
[3] Европейское космическое агентство: Факты и цифры Галилео. https://www.esa.int/Applications/Navigation/Galileo/Facts_and_figures