STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数
文章目录
- 构建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.”的话,后面就不会再提示参数了,因此,我又想到了一个办法,先令“sat1=sat.Propagator;”然后,在命令行中输入“ sat1.”,这次,我们就看到了这样的几个可选参数:
然后,选择PRN这一项,令
sat1.PRN=3
这样就实现了修改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.PRN=PRN;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.PRN=PRN;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.SSCNumber=num2str(Num);sat.Propagator.AutoUpdateEnabled=1;sat.Propagator.Propagate;
这句话必须有,否则报错
sat.Propagator.AutoUpdateEnabled=1;
下面写出代码(接着上面GPS的完整代码)
i=3;
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)]);i=i+1;sat.SetPropagatorType('ePropagatorSGP4');sat.Propagator.Segments.SSCNumber=num2str(Num);sat.Propagator.AutoUpdateEnabled=1;sat.Propagator.Propagate;
end
搭建低轨铱星星座
关于手动搭建的方法,可以参考CSDN博客(十一)STK 中搭建铱星星座_清潇和梨花的博客,这里不做赘述,使用MATLAB控制STK建立的方法与北斗星座的建立相同,程序代码如下,结果图如下:
| IRIDIUM 卫星编号 | IRIDIUM 卫星SSC Number | IRIDIUM 卫星编号 | IRIDIUM 卫星SSC Number |
|---|---|---|---|
| 145 | 43253 | 119 | 42959 |
| 143 | 43258 | 122 | 42957 |
| 140 | 43252 | 128 | 42811 |
| 148 | 43255 | 107 | 42960 |
| 150 | 43257 | 132 | 42961 |
| 153 | 43078 | 129 | 42958 |
| 144 | 43249 | 127 | 42956 |
| 149 | 43250 | 133 | 42955 |
| 146 | 43254 | 125 | 42964 |
| 142 | 43256 | 136 | 42962 |
| 157 | 43251 | 139 | 42963 |
| 134 | 43075 | 158 | 43571 |
| 141 | 43077 | 160 | 43569 |
| 137 | 43076 | 159 | 43578 |
| 116 | 43072 | 163 | 43575 |
| 135 | 43070 | 165 | 43572 |
| 151 | 43074 | 166 | 43570 |
| 120 | 42805 | 154 | 43574 |
| 113 | 42803 | 105/164 | 43577 |
| 138 | 43071 | 108 | 41924 |
| 130 | 43073 | 155 | 43573 |
| 131 | 43079 | 156 | 43576 |
| 117 | 42808 | 102 | 41920 |
| 168 | 43924 | 112 | 41925 |
| 180 | 43922 | 104 | 41922 |
| 123 | 42804 | 114 | 41923 |
| 126 | 42809 | 103 | 41918 |
| 167 | 43931 | 109 | 41919 |
| 171 | 43929 | 106 | 41917 |
| 121 | 42812 | 152 | 43479 |
| 118 | 42807 | 147 | 43480 |
| 172 | 43927 | 110 | 43481 |
| 173 | 43925 | 111 | 41926 |
运行视频如下,可以很直观的进行可见性分析。
<video id=“video” controls=""src=“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];
arg=85:98;
s=1;
for nn=1:length(height)for nnn=1: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; %GHzs=s+1;end
end
<video id=“video” controls=""src=“https://pdswsj.oss-cn-beijing.aliyuncs.com/img/20220704_202415.mp4” preload=“none”>
建立地面站,可见性分析
确定地面站坐标
过程待分析
%% 确定地面站坐标
x0=120; % 圆心在东经120°
y0=40; % 北纬40°
R=5; % 半径5°
alpha=0:pi/20:2*pi;
x=R*cos(alpha)+x0;
y=R*sin(alpha)+y0;%% 建立地面站
for ii=1:length(alpha)
% for lon=0: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?Highlight=sensor.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?Highlight=eCstrLunarElevationAngle%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 nn=1:length(sat)sat2fac=sat(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;%可见次数如下count=acc_interval.Count;%可见的弧段起始时间列表%acc_interval.ToArray(0,-1)%str、sto分别是第一个弧段的起始时间,是字符串类型。acc(nn).AER(ii).result(1,:)={'Time' 'azimuth' 'range'};sum=0;for i=0: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;len=length(range);for j=1:lenacc(nn).AER(ii).result(j+1+sum,:)={time(j) azimuth(j) range(j)};endsum=sum+len;endend
% end
% end
end

多颗卫星可见性数据分析
最终效果图
<video id=“video” controls=""src=“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 nn=1:length(PRN)
% sat(nn) = sc.Children.New(18,['mysat',num2str(PRN(nn))]);
% sat(nn).SetPropagatorType('ePropagatorGPS')
% %sat(nn).SetPropagatorType('ePropagatorGPS');
% sat(nn).Propagator.PRN=PRN(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% %% 构建北斗星座
% i=3;
% 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 nn=1:length(Num)
% sat(nn) = sc.Children.New(18,['mysatBD',num2str(i)]);
% i=i+1;
% sat(nn).SetPropagatorType('ePropagatorSGP4');
% sat(nn).Propagator.Segments.SSCNumber=num2str(Num(nn));
% sat(nn).Propagator.AutoUpdateEnabled=1;
% 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% %% 构建铱星星座
% i=1;
% 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 nn=1:66
% sat(nn) = sc.Children.New(18,['mysatIRIDIUM_num',num2str(IRIDIUM_num(i))]);
% i=i+1;
% sat(nn).SetPropagatorType('ePropagatorSGP4');
% sat(nn).Propagator.Segments.SSCNumber=num2str(Num(nn));
% sat(nn).Propagator.AutoUpdateEnabled=1;
% 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];
arg=85:98;
s=1;
for nn=1:length(height)for nnn=1: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; %GHzs=s+1;end
end
%% 确定地面站坐标
x0=120; % 圆心在东经120°
y0=40; % 北纬40°
R=5; % 半径5°
alpha=0:pi/20:2*pi;
x=R*cos(alpha)+x0;
y=R*sin(alpha)+y0;%% 建立地面站
for ii=1:length(alpha)
% for lon=0: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?Highlight=sensor.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?Highlight=eCstrLunarElevationAngle%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 nn=1:length(sat)sat2fac=sat(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;%可见次数如下count=acc_interval.Count;%可见的弧段起始时间列表%acc_interval.ToArray(0,-1)%str、sto分别是第一个弧段的起始时间,是字符串类型。acc(nn).AER(ii).result(1,:)={'Time' 'azimuth' 'range'};sum=0;for i=0: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;len=length(range);for j=1:lenacc(nn).AER(ii).result(j+1+sum,:)={time(j) azimuth(j) range(j)};endsum=sum+len;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]; % 轨道高度
arg=85:98; % 初始轨道相位85°~98°之间
s=1;
for nn=1:length(height)for nnn=1:length(arg)......end
end
点击acc结构体,acc(1).AER包含了PRN1卫星到每个观测站的可见性计算数据,一共有41个字段(因为有41个观测站)。

点击其中一个,可以看到acc(1).AER(1).result的数据,包含了时刻信息,仰角和距离。

注:这里不涉及到多普勒频率的计算问题,因此本文中的transmitter和receiver可以不加,单纯添加卫星和观测站即可。
(完)
相关文章:
STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数
文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座,并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站,可见性分析确定地面站坐标分析单颗…...
js面试问题笔记(一)
一.热门js面试 1.简述同步和异步的区别? 同步: 浏览器访问服务器请求,用户看到页面刷新 ,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作 异步: 浏览器访问服务器请求,用户正常操作,浏览器后端进行请求,等请求完,页面不刷新,新内容也会出现,用户看到…...
pip 和 pipx 的主要区别?
特性pippipx用途用于安装Python库或命令行应用程序,可以安装带entry points的库专门用于安装和管理Python命令行工具,每个工具都在隔离的虚拟环境中运行虚拟环境不自动创建虚拟环境,需要手动使用 venv 或 virtualenv 创建自动为每个安装的工具…...
4457M数字示波器
_XLT新利通_ 4457M数字示波器 带宽500MHz到3GHz 4457M系列数字示波器产品,包含4457DM/EM/FM/GM四个产品型号,模拟通道数4、8个,带宽500MHz到3GHz,最高采样率10GSa/s,垂直分辨率8bit,最大存储深度2Gpts。…...
【永中软件-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
Tomcat作为web的优缺点
文章目录 优点缺点 优点 开源:Tomcat是Apache软件基金会的一个项目,这意味着它是免费且开放源代码的。这为开发者提供了高度的自由度来修改和扩展其功能。 轻量级:与一些全功能的Java EE应用服务器(如IBM WebSphere, Oracle WebL…...
conda虚拟环境中安装cuda方法、遇到的问题
conda虚拟环境中安装cuda方法、遇到的问题 文章目录 conda虚拟环境中安装cuda方法、遇到的问题conda虚拟环境中安装cudacuda.h和cuda_runtime.hpytorch运行时的CUDA版本其他问题检查包冲突nvcc -V和nvidia-smi显示的版本不一致cuda路径 conda虚拟环境中安装cuda 参考文章&…...
【CPN TOOLS建模学习】设置变迁的属性
使用Tab键在属性之间进行切换 与一个变迁相关联的四个铭文,均为可选项: 变迁名称守卫(Guard)时间代码段 变迁延迟必须是一个正整数表达式。该表达式前面加上,这意味着时间铭文的形式为 delayexpr。在添加时间铭文之前,铭文的默…...
一个简单的例子,说明Matrix类的妙用
在Android、前端或者别的平台的软件开发中,有时会遇到类似如下需求: 将某个图片显示到指定的区域;要求不改变图片本身的宽高比,进行缩放;要求最大限度的居中填充到显示区域。 以下示意图可以简单描绘该需求 以Androi…...
【C++】类和对象(四):析构函数
大家好,我是苏貝,本篇博客带大家了解C的析构函数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 概念2. 特性 1. 概念 通过前面构造函数的学习,我们知道一个对象是怎么来的…...
linux中各目录作用及介绍
目录 1 /usr 1 /usr /usr 是 Unix-like 操作系统中的一个重要目录之一,代表可共享的用户资源(User System Resources)或 Unix Software Resource(UNIX 软件资源)。 /usr 目录通常包含了系统的许多可共享资源…...
v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复
在app/api/controller/v1/order/StoreOrderController.php文件中,将红框内的代码注释,加上绿框的代码即可修复 if ($this->services->setOrderTypePayOffline($order[order_id])) {event(NoticeListener, [$order, admin_pay_success_code]);retur…...
vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?
在 Vue 中,Mitt 和 Pinia 是两个不同的工具,它们的主要用途和功能有所不同,但在某些方面也存在重合的部分。 区别 Mitt: Mitt 是一个简单而强大的事件总线库,用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…...
飞书文档解除复制限制
解除飞书文档没有编辑器权限限制复制功能方法 方法一:使用插件 方法二: 通过调试工具删除所有的copy事件 使用插件 缺点: 只有markdown格式,如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…...
vue3中ref和reactive的用法,区别和优缺点,以及使用场景
写在前头: reactive定义的数据只能修改里面的属性,不能将整个数据替换,实在要替换请使用 Object.assign(obj1, obj2);举个例子 这种写法无法直接改变obj1 let obj1 reactive({name: 猫,age: 2, });obj1 {name: 猪,age: 2, } 正确的写法…...
电脑技巧:Rufus——最佳USB启动盘制作工具指南
目录 一、功能强大,兼容性广泛 二、界面友好,操作简便 三、快速高效,高度可定制 四、安全可靠,社区活跃 在日常的电脑使用中,无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务,拥…...
vue的基本使用
简介 vue组件 三个部分组成:结构、样式、逻辑文本插值 类似于java的spel表达式属性绑定 綁定是单向绑定的,修改输入框无法改变原本的,只能读,不能写 <input :value="name" placeholder="Type your name"><script> export default {name: H…...
C#高级:利用 CancellationToken 实现方法超时控制,提升应用响应性
完整版: using System; using System.Threading; using System.Threading.Tasks;public class Program {public static async Task Main(){var cts new CancellationTokenSource();// 设置超时时间为10秒cts.CancelAfter(TimeSpan.FromSeconds(3));try{var resul…...
Java Lock LockSupport 总结
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & LockSupport & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & LockSupport & 总结》(学习总结/最新…...
线性表之链式存储基本操作(c语言实现,附解析)
今天,我来讲一下数据结构链表的基本操作,首先我们要知道链表的基本操作有创建,查找,插入,删除。接下来我们逐一实现操作。 结构体定义 typedef struct Node* List; struct Node{ ElementType Data; List next; };文章…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...
