为什么要做响应式网站,WordPress首页打开慢,深圳定制巴士线路查询,做的比较炫的网站文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座#xff0c;并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站#xff0c;可见性分析确定地面站坐标分析单颗… 文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站可见性分析确定地面站坐标分析单颗卫星的可见性数据多颗卫星可见性数据分析 结果分析最终版完整程序程序运行的注意事项数据的存储格式 本次仿真主要包括以下几个方面 使用MATLAB控制STK构建GPS星座使用MATLAB控制STK构建北斗星座使用MATLAB控制STK分别构建一颗轨道高度为800km/1000km/1200km的低轨卫星并将卫星的初始相位分别设为0、60、120、180度使用MATLAB控制STK构建铱星星座使用MATLAB构建半径约550km的圆形区域区域边界等距离地分布41个观测站创建卫星与观测站之间的连接计算导航卫星与地面用户之间的实时距离和仰角并保存到MATLAB结构体中 构建GPS星座
写程序之初确实无法下手因为在STK软件上简单点四下的东西备注分别点Insert-“New”-“Satellite”-“Load GPS Constellation即可创建完整的GPS星座放到MATLAB上就麻烦了许多。由于在matlab里暂时不知道如何Load GPS Constellation”因此选择了较笨的方法一个PRN一个PRN地创建GPS卫星。
创建单个PRN的GPS卫星
要想构建一个星座需要先分析单个PRN的GPS卫星如何创建。
首先创建一个卫星例如PRN3这是创建卫星的通用的代码
sat sc.Children.New(18,mysatPRN3);然后我们可以在命令行窗口输入sat.再按一下Tab键可以神奇的发现居然会有很多参数你可以看得到像这样这里请输入sat. 不要像我一样输入sat(3).因为我后面把sat赋予了32个不同的PRN因此加了括号 接着我们选择我们需要的参数按回车键这里因为需要设置卫星的类型所以找到“SetPropagatorType”按回车键。然后在AGI官方的使用说明中搜索“SetPropagatorType”找到设置为GPS类型的参数然后写如下代码 sat.SetPropagatorType(ePropagatorGPS);莫小看这一行代码这一行就花了我2个小时时间才整明白咋回事。
然后我们先写上这行代码
sat.Propagator.Propagate;这样一个GPS卫星就定义好了我们可以查看一下具体参数 但问题来了无论你生成多少颗GPS卫星它的PRN都是01那怎么办呢
于是在命令行输入“sat.”按Tab键这次我们选择 sat.Propagator设置卫星的参数然而发现如果输入“ sat.Propagator.”的话后面就不会再提示参数了因此我又想到了一个办法先令“sat1sat.Propagator”然后在命令行中输入“ sat1.”这次我们就看到了这样的几个可选参数 然后选择PRN这一项令
sat1.PRN3这样就实现了修改PRN的目标。
创建GPS星座并为其添加发射机
添加循环以创建GPS星座代码如下
%% 构建GPS星座
for PRN[1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 ...18 19 20 21 22 23 24 25 26 27 28 29 30 31 32]sat sc.Children.New(18,[mysat,num2str(PRN)]);%sat.SetPropagatorType(ePropagatorGPS)sat.SetPropagatorType(ePropagatorGPS);sat.Propagator.PRNPRN;sat.Propagator.Propagate;
end点索引后面的参数按Tab键是可以通过点索引找到对应的内容 为每一个GPS卫星添加一个发射机代码如下
Transmitter sat(PRN).Children.New(eTransmitter, Mytransmitter);
Transmitter.SetModel(GPS Satellite Transmitter Model);还是之前的方法输入“Transmitter.”按Tab键找到SetModel这个元素按回车键然后在AGI官方教程中找到合适的参数“GPS Satellite Transmitter Model”即可修改发射机的类型。最终的程序代码如下
clear all
clc
app actxserver(STK11.application);
root app.Personality2;
scenario root.Children.New(eScenario,MATLAB_PredatorMission);
root.SaveScenarioAs(E:\Program Files\STK\Documents\STK 11 (x64)\Scenario1_jz2);
scenario.SetTimePeriod(2 Jun 2022 16:00:00.000,3 Jun 2022 16:00:00.000);
scenario.StartTime 2 Jun 2022 16:00:00.000;
scenario.StopTime 3 Jun 2022 16:00:00.000;
root.ExecuteCommand(Animate * Reset);
sc root.CurrentScenario;%% 构建GPS星座
for PRN[1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 ...18 19 20 21 22 23 24 25 26 27 28 29 30 31 32]sat(PRN) sc.Children.New(18,[mysat,num2str(PRN)]);sat(PRN).SetPropagatorType(ePropagatorGPS)sat(PRN).Propagator.PRNPRN;sat(PRN).Propagator.Propagate;%sensor sat.Children.New(eSensor,MySensor_sat);Transmitter sat(PRN).Children.New(eTransmitter, Mytransmitter);Transmitter.SetModel(GPS Satellite Transmitter Model);
end北斗星座构建
在STK中无法像GPS那样直接给卫星更改模型所以使用了ssc number卫星标识号在STK卫星库中找到北斗卫星并建立模型。 注ssc number美国国家航空和宇宙航行局网站给全球卫星进行的编号 从beidou3开始的卫星编号分别为
Num[36287 36590 36828 37210 37256 37384 37763 37948 38091 38250 38251 38774 38775 38953 41434 43001 43002 43107 43108 43207 43208 43245 43246 43539 43581 43582 43602 43603 43622 43623 43647 43648 43683 43706 73707]由于北斗1和北斗2被弃用因此星座从北斗第三颗卫星开始我们给出的编号也从第三颗卫星开始
sat sc.Children.New(18,[mysatBD,num2str(i)]);与前文使用相同的方法我们可以设置卫星的类型和SSCNumber并且将“AutoUpdateEnabled”置为1. sat.SetPropagatorType(ePropagatorSGP4);sat.Propagator.Segments.SSCNumbernum2str(Num);sat.Propagator.AutoUpdateEnabled1;sat.Propagator.Propagate;这句话必须有否则报错
sat.Propagator.AutoUpdateEnabled1;下面写出代码接着上面GPS的完整代码
i3;
for Num[36287 36590 36828 37210 37256 37384 37763 37948 38091 38250 38251 38774 38775 38953 41434 43001 43002 43107 43108 43207 43208 43245 43246 43539 43581 43582 43602 43603 43622 43623 43647 43648 43683 43706 73707]sat sc.Children.New(18,[mysatBD,num2str(i)]);ii1;sat.SetPropagatorType(ePropagatorSGP4);sat.Propagator.Segments.SSCNumbernum2str(Num);sat.Propagator.AutoUpdateEnabled1;sat.Propagator.Propagate;
end搭建低轨铱星星座
关于手动搭建的方法可以参考CSDN博客十一STK 中搭建铱星星座_清潇和梨花的博客这里不做赘述使用MATLAB控制STK建立的方法与北斗星座的建立相同程序代码如下结果图如下
IRIDIUM 卫星编号IRIDIUM 卫星SSC NumberIRIDIUM 卫星编号IRIDIUM 卫星SSC Number14543253119429591434325812242957140432521284281114843255107429601504325713242961153430781294295814443249127429561494325013342955146432541254296414243256136429621574325113942963134430751584357114143077160435691374307615943578116430721634357513543070165435721514307416643570120428051544357411342803105/1644357713843071108419241304307315543573131430791564357611742808102419201684392411241925180439221044192212342804114419231264280910341918167439311094191917143929106419171214281215243479118428071474348017243927110434811734392511141926 运行视频如下可以很直观的进行可见性分析。
video id“video” controlssrc“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220704_174700.mp4” preload“none”
构建一颗轨道高度为800km/1000km/1200km的低轨卫星
构建一颗轨道高度为800km/1000km/1200km的低轨卫星
使用MATLAB控制STK分别构建一颗轨道高度为800km/1000km/1200km的低轨卫星并将卫星的初始相位分别设为0、60、120、180度
不同高度不同星下点距圆心的距离生成的低轨卫星如下图 代码如下
%% 构建一颗轨道高度为800km/1000km/1200km的低轨卫星
height[800 1000 1200];
arg85:98;
s1;
for nn1:length(height)for nnn1:length(arg)sat(s) scenario.Children.New(18,[mysat,num2str(s)]);kep sat(s).Propagator.InitialState.Representation.ConvertTo(eOrbitStateClassical);kep.SizeShapeType eSizeShapeAltitude;kep.LocationType eLocationTrueAnomaly;kep.Orientation.AscNodeType eAscNodeLAN;kep.SizeShape.PerigeeAltitude height(nn); % 距地面最小距离kmkep.SizeShape.ApogeeAltitude height(nn); % 距地面最大距离kmkep.Orientation.Inclination 60;kep.Orientation.ArgOfPerigee 0;kep.Orientation.AscNode.Value arg(nnn);kep.Location.Value 0;sat(s).Propagator.InitialState.Representation.Assign(kep);sat(s).Propagator.Propagate;transmitter sat(s).Children.New(eTransmitter, Mytransmitter);transmitter.SetModel(Complex Transmitter Model);txModel transmitter.Model;txModel.Frequency 14; %GHzss1;end
endvideo id“video” controlssrc“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220704_202415.mp4” preload“none”
建立地面站可见性分析
确定地面站坐标
过程待分析
%% 确定地面站坐标
x0120; % 圆心在东经120°
y040; % 北纬40°
R5; % 半径5°
alpha0:pi/20:2*pi;
xR*cos(alpha)x0;
yR*sin(alpha)y0;%% 建立地面站
for ii1:length(alpha)
% for lon0:9
% if lon~0 | Lat~0facility root.CurrentScenario.Children.New(eFacility, [MyFacility,num2str(ii)]);facility.Position.AssignGeodetic(y(ii),x(ii),0) % Latitude, Longitude, Altitude% Set altitude to height of terrainfacility.UseTerrain true;% Set altitude to a distance above the groundfacility.HeightAboveGround .05; % kmsensor facility.Children.New(eSensor,[MySensor,num2str(ii)]);分析单颗卫星的可见性数据
接上面的程序过程时间原因待分析。 senConstraints sensor.AccessConstraints;altitude senConstraints.AddConstraint(eCstrRange);%file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgSensor.html?Highlightsensor.AccessConstraintsaltitude.EnableMax true;altitude.Max 0;% 可算出来了设置了sensor的Constraints中的Range参数让他为0这样sensor就不会是个圆锥型了% IAgAccessConstraintCollection Collection% 对于sensor常规参数的修改参考网址是file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgAccessConstraintCollection.html?HighlighteCstrLunarElevationAngle%20eCstrLighting%STK开发如果没有头绪一个是查帮助另一个就是用get、invoke查看相%关信息。所以上get% pattern1.ConeAngle 85;receiver sensor.Children.New(eReceiver, [MyReceiver,num2str(ii)]);%设置地面站约束facConstraints receiver.AccessConstraints;%设置最大距离约束rangeCstr facConstraints.AddConstraint(eCstrRange);rangeCstr.EnableMax 1;rangeCstr.Max 2000;%设置仰角约束elevationCstr facConstraints.AddConstraint(eCstrElevationAngle);elevationCstr.EnableMin 1;elevationCstr.Min 5;for nn1:length(sat)sat2facsat(nn).GetAccessToObject(facility);sat2fac.ComputeAccess;% aerDP sat2fac.DataProviders.Item(AER Data).Group.Item(VVLH CBF).Exec(scenario.StartTime,scenario.StopTime,60);% azimuth cell2mat(aerDP.DataSets.GetDataSetByName(Range).GetValues);acc_interval sat2fac.ComputedAccessIntervalTimes;%可见次数如下countacc_interval.Count;%可见的弧段起始时间列表%acc_interval.ToArray(0,-1)%str、sto分别是第一个弧段的起始时间是字符串类型。acc(nn).AER(ii).result(1,:){Time azimuth range};sum0;for i0:count-1[str,sto] acc_interval.GetInterval(i);%结合上篇博文获取第一个可见弧段内的方位角aerDP sat2fac.DataProviders.Item(AER Data).Group.Item(VVLH CBF).Exec(str,sto,10);azimuth cell2mat(aerDP.DataSets.GetDataSetByName(Azimuth).GetValues);range cell2mat(aerDP.DataSets.GetDataSetByName(Range).GetValues);time aerDP.DataSets.GetDataSetByName(Time).GetValues;lenlength(range);for j1:lenacc(nn).AER(ii).result(j1sum,:){time(j) azimuth(j) range(j)};endsumsumlen;endend
% end
% end
end多颗卫星可见性数据分析
最终效果图
video id“video” controlssrc“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220703_181255.mp4” preload“none”
结果分析
我们将access计算的结果存入了MATLAB的结构体中方便之后随时调用这里说明一下程序运行的注意事项和数据的存储格式。
最终版完整程序
clear all
clc
%% 建立场景定义基本信息
app actxserver(STK11.application);
root app.Personality2;
scenario root.Children.New(eScenario,MATLAB_PredatorMission);
root.SaveScenarioAs(E:\Program Files\STK\Documents\STK 11 (x64)\Scenario1_jz2);
scenario.SetTimePeriod(2 Jun 2022 16:00:00.000,3 Jun 2022 16:00:00.000);
scenario.StartTime 2 Jun 2022 16:00:00.000;
scenario.StopTime 3 Jun 2022 16:00:00.000;
root.ExecuteCommand(Animate * Reset);
sc root.CurrentScenario;% %% 构建GPS星座
% PRN[1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
% 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32];
% for nn1:length(PRN)
% sat(nn) sc.Children.New(18,[mysat,num2str(PRN(nn))]);
% sat(nn).SetPropagatorType(ePropagatorGPS)
% %sat(nn).SetPropagatorType(ePropagatorGPS);
% sat(nn).Propagator.PRNPRN(nn);
% %root.ExecuteCommand([SetState */Satellite/gpsSat2 GPS 7 UpdateMode FromFiles SourceFile C:\STKUser\Databases\GPSAlmanacs\GPSAlmanac.al3 TimePeriod 1 Jul 2006 12:00:00.00 1 Jul 2006 16:00:00.00 StepSize 30.0]);
% sat(nn).Propagator.Propagate;
% %sensor sat.Children.New(eSensor,MySensor_sat);
% Transmitter sat(nn).Children.New(eTransmitter, Mytransmitter);
% Transmitter.SetModel(GPS Satellite Transmitter Model);
% end% %% 构建北斗星座
% i3;
% Num[36287 36590 36828 37210 37256 37384 37763 37948 38091 38250 38251
% 38774 38775 38953 41434 43001 43002 43107 43108 43207 43208 43245 43246 43539 43581 43582 43602 43603 43622 43623 43647 43648 43683 43706 73707];
% for nn1:length(Num)
% sat(nn) sc.Children.New(18,[mysatBD,num2str(i)]);
% ii1;
% sat(nn).SetPropagatorType(ePropagatorSGP4);
% sat(nn).Propagator.Segments.SSCNumbernum2str(Num(nn));
% sat(nn).Propagator.AutoUpdateEnabled1;
% sat(nn).Propagator.Propagate;
% transmitter sat(nn).Children.New(eTransmitter, Mytransmitter);
% transmitter.SetModel(Complex Transmitter Model);
% txModel transmitter.Model;
% txModel.Frequency 1.26852; %GHz
% end% %% 构建铱星星座
% i1;
% IRIDIUM_num[145 143 140 148 150 153 144 149 146 142 157 134 141 137 116 135 151 120 113 138 130 131 117 168 180 123 126 167 171 121 118 172 173 119 122 128 107 132 129 127 133 125 136 139 158 160 159 163 165 166 154 164 108 155 156 102 112 104 114 103 109 106 152 147 110 111];
% Num[43253 43258 43252 43255 43257 43078 43249 43250 43254 43256 43251 43075 43077 43076 43072 43070 43074 42805 42803 43071 43073 43079 42808 43924 43922 42804 42809 43931 43929 42812 42807 43927 43925 42959 42957 42811 42960 42961 42958 42956 42955 42964 42962 42963 43571 43569 43578 43575 43572 43570 43574 43577 41924 43573 43576 41920 41925 41922 41923 41918 41919 41917 43479 43480 43481 41926 ];
% for nn1:66
% sat(nn) sc.Children.New(18,[mysatIRIDIUM_num,num2str(IRIDIUM_num(i))]);
% ii1;
% sat(nn).SetPropagatorType(ePropagatorSGP4);
% sat(nn).Propagator.Segments.SSCNumbernum2str(Num(nn));
% sat(nn).Propagator.AutoUpdateEnabled1;
% sat(nn).Propagator.Propagate;
% transmitter sat(nn).Children.New(eTransmitter, Mytransmitter);
% transmitter.SetModel(Complex Transmitter Model);
% txModel transmitter.Model;
% txModel.Frequency 14; %GHz
% end%% 构建一颗轨道高度为800km/1000km/1200km的低轨卫星
height[800 1000 1200];
arg85:98;
s1;
for nn1:length(height)for nnn1:length(arg)sat(s) scenario.Children.New(18,[mysat,num2str(s)]);kep sat(s).Propagator.InitialState.Representation.ConvertTo(eOrbitStateClassical);kep.SizeShapeType eSizeShapeAltitude;kep.LocationType eLocationTrueAnomaly;kep.Orientation.AscNodeType eAscNodeLAN;kep.SizeShape.PerigeeAltitude height(nn); % 距地面最小距离kmkep.SizeShape.ApogeeAltitude height(nn); % 距地面最大距离kmkep.Orientation.Inclination 60;kep.Orientation.ArgOfPerigee 0;kep.Orientation.AscNode.Value arg(nnn);kep.Location.Value 0;sat(s).Propagator.InitialState.Representation.Assign(kep);sat(s).Propagator.Propagate;transmitter sat(s).Children.New(eTransmitter, Mytransmitter);transmitter.SetModel(Complex Transmitter Model);txModel transmitter.Model;txModel.Frequency 14; %GHzss1;end
end
%% 确定地面站坐标
x0120; % 圆心在东经120°
y040; % 北纬40°
R5; % 半径5°
alpha0:pi/20:2*pi;
xR*cos(alpha)x0;
yR*sin(alpha)y0;%% 建立地面站
for ii1:length(alpha)
% for lon0:9
% if lon~0 | Lat~0facility root.CurrentScenario.Children.New(eFacility, [MyFacility,num2str(ii)]);facility.Position.AssignGeodetic(y(ii),x(ii),0) % Latitude, Longitude, Altitude% Set altitude to height of terrainfacility.UseTerrain true;% Set altitude to a distance above the groundfacility.HeightAboveGround .05; % kmsensor facility.Children.New(eSensor,[MySensor,num2str(ii)]);% pattern1 sensor.Pattern;% sensor.FieldOfView%% 可见性分析senConstraints sensor.AccessConstraints;altitude senConstraints.AddConstraint(eCstrRange);%file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgSensor.html?Highlightsensor.AccessConstraintsaltitude.EnableMax true;altitude.Max 0;% 可算出来了设置了sensor的Constraints中的Range参数让他为0这样sensor就不会是个圆锥型了% IAgAccessConstraintCollection Collection% 对于sensor常规参数的修改参考网址是file:///E:/Program%20Files/AGI/STK%2011/Help/Programming/index.htm#DocX/STKObjects~IAgAccessConstraintCollection.html?HighlighteCstrLunarElevationAngle%20eCstrLighting%STK开发如果没有头绪一个是查帮助另一个就是用get、invoke查看相%关信息。所以上get% pattern1.ConeAngle 85;receiver sensor.Children.New(eReceiver, [MyReceiver,num2str(ii)]);%设置地面站约束facConstraints receiver.AccessConstraints;%设置最大距离约束rangeCstr facConstraints.AddConstraint(eCstrRange);rangeCstr.EnableMax 1;rangeCstr.Max 2000;%设置仰角约束elevationCstr facConstraints.AddConstraint(eCstrElevationAngle);elevationCstr.EnableMin 1;elevationCstr.Min 5;for nn1:length(sat)sat2facsat(nn).GetAccessToObject(facility);sat2fac.ComputeAccess;% aerDP sat2fac.DataProviders.Item(AER Data).Group.Item(VVLH CBF).Exec(scenario.StartTime,scenario.StopTime,60);% azimuth cell2mat(aerDP.DataSets.GetDataSetByName(Range).GetValues);acc_interval sat2fac.ComputedAccessIntervalTimes;%可见次数如下countacc_interval.Count;%可见的弧段起始时间列表%acc_interval.ToArray(0,-1)%str、sto分别是第一个弧段的起始时间是字符串类型。acc(nn).AER(ii).result(1,:){Time azimuth range};sum0;for i0:count-1[str,sto] acc_interval.GetInterval(i);%结合上篇博文获取第一个可见弧段内的方位角aerDP sat2fac.DataProviders.Item(AER Data).Group.Item(VVLH CBF).Exec(str,sto,10);azimuth cell2mat(aerDP.DataSets.GetDataSetByName(Azimuth).GetValues);range cell2mat(aerDP.DataSets.GetDataSetByName(Range).GetValues);time aerDP.DataSets.GetDataSetByName(Time).GetValues;lenlength(range);for j1:lenacc(nn).AER(ii).result(j1sum,:){time(j) azimuth(j) range(j)};endsumsumlen;endend
% end
% end
end程序运行的注意事项
程序分为8大部分分别是 建立场景定义基本信息构建GPS星座构建北斗星座构建铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星确定地面站坐标建立地面站可见性分析 需要注意的是每次只能从2、3、4、5这四种场景中选择一种场景其他三个场景都要注释掉其他地方无需修改。
数据的存储格式
可见性分析的数据都存在了acc这个结构体字段中每个字段包含了一颗卫星对所有观测站的数据结果即这颗卫星与这41个地面测站之间的距离和仰角信息。 卫星字段的存储顺序如下 GPS星座的存储顺序是按照PRN的顺序即PRN[1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32]注意没有PRN4 北斗星座的存储顺序是按照PRN的顺序即3~37 铱星星座的存储顺序是IRIDIUM_num[145 143 140 148 150 153 144 149 146 142 157 134 141 137 116 135 151 120 113 138 130 131 117 168 180 123 126 167 171 121 118 172 173 119 122 128 107 132 129 127 133 125 136 139 158 160 159 163 165 166 154 164 108 155 156 102 112 104 114 103 109 106 152 147 110 111]; 自定义轨道高度为800km/1000km/1200km的低轨卫星的顺序可以读程序知 height[800 1000 1200]; % 轨道高度
arg85:98; % 初始轨道相位85°~98°之间
s1;
for nn1:length(height)for nnn1:length(arg)......end
end点击acc结构体acc(1).AER包含了PRN1卫星到每个观测站的可见性计算数据一共有41个字段因为有41个观测站。 点击其中一个可以看到acc(1).AER(1).result的数据包含了时刻信息仰角和距离。 注这里不涉及到多普勒频率的计算问题因此本文中的transmitter和receiver可以不加单纯添加卫星和观测站即可。 完