stk串口导入卫星文件并仿真
建立新场景
tic
con2 = actxserver('STK11.application');
root = con2.Personality2;
con2.Visible = 0;
root.NewScenario('some_stellite');
root.SaveAs('D:\STK_Job\Try4\some_stellite.sc');
ss = root.CurrentScenario;
toc
%%%%%%%%%%%%%%%%%%%%%%%%%场景设置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ss.SetTimePeriod('1 Mar 2021 04:00:00.000','21 Apr 2021 04:00:00.000');%时间
root.ExecuteCommand('Animate * Reset');
root.UnitPreferences.SetCurrentUnit('Distance','km');
root.UnitPreferences.SetCurrentUnit('Latitude','deg');
root.UnitPreferences.SetCurrentUnit('Longitude','deg');
读取刚刚创立的卫星文件,批量导入卫星如下(这里不用)
.oc文件才能导入
sat = ss.Children.New(18,'sat');
sat.SetPropagatorType('ePropagatorStkExternal');%轨道类型为导入参数
sat.Propagator.Filename = 'D:\STK_Job\TLEData.pg';
sat.Propagator.Propagate;%画出轨道
% sat.Propagator.get
root.Save();
创建33颗卫星
for i = 1:33%10个卫星
satname = ['sat_',num2str(i)];
sat = ss.Children.New(18,satname);
sat.SetPropagatorType('ePropagatorHPOP');
% sat.Graphics.IsObjectGraphicsVisible = 0;%2D不显示卫星
kepler = sat.Propagator.InitialState. Representation.ConvertTo('eOrbitStateClassic');%经典轨道根数句柄
kepler.SizeShapeType = 'eSizeShapeAltitude';
kepler.LocationType = 'eLocationTrueAnomaly';%真近点角
kepler.Orientation.AscNodeType = 'eAscNodeLAN';
kepler.SizeShape.PerigeeAltitude = 10000 + 10000*rand*(rand*3);%近地点高度
kepler.SizeShape.ApogeeAltitude = 10000 + 10000*rand*(rand*3);
kepler.Orientation.Inclination = 10 + 50 * rand;%轨道倾角
kepler.Orientation.ArgOfPerigee = 0;%近地点幅角
kepler.Orientation.AscNode.Value = 180 * rand + 180 * rand;%升交点赤经
kepler.Location.Value = 180 * rand + 180 * rand;
sat.Propagator.InitialState.Representation.Assign(kepler);
sat.Propagator.Propagate;
end
建立Sensor仿真
ck2021 = ss.Children.New('eFacility','ck2021');
ck2021.Position.AssignGeodetic(30,120,0);%经纬度高程
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%开始Sensor%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sensor = ck2021.Children.New('eSensor','sensor');
sensor.SetPatternType('eSnSimpleConic');
%sensor.CommonTasks.invoke;%查看参数操作命令
sensor.CommonTasks.SetPatternSimpleConic(60,1);%角度设置,半张角60°,角分辨率1°。
%%%%%%%%%%%%%%%%%%%%%%%%%%%卫星群句柄建立%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% con2 = actxserver('STK11.application');
% root = con2.Personality2;
% con2.Visible = 1;
% root.Load('D:\STK_Job\Try4\some_stellite.sc');
% ss = root.CurrentScenario;
eSatellite = 'eSatellite';
for j = 1:33
satnamegetmy = ['sat',num2str(j)];
satnameget = ['sat_',num2str(j)];
eval([satnamegetmy,' = ss.Children.GetElements(eSatellite).Item(satnameget)']);
end
%%验证后删除%%
% sat5.Children.New('eSensor','sensor');
% b = sat5.Children.GetElements('eSensor').Item('sensor')
% b.Unload
%% %%%%%%%%%%%%%%%%%%%%%%测控站可见性分析%%%%%%%%%%%%%%%%%%%%%%%%%%,try
disp('* 获取卫星与地面站之间的可见关系 *')
%COM连接采用DataProviders获取
%方法:进入对象的报告,然后再报告点右键进入属性,然后分别设置如下代码:
%sat.DataProviders.Item('报告第一层').Group.Item('第二层').Exec(起始时间,结束时间,步长);
%cell2mat(V1.DataSets.GetDataSetByName('报告中的元素').GetValues);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%星站Access连接%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对我没啥用,随便做一个卫星
%
accessaa = sat1.GetAccessToObject(ck2021);%从卫星看向地面站的连接关系
accessaa.ComputeAccess;%计算access
accessaa_info = accessaa.ComputedAccessIntervalTimes;%获取计算过的时间间隔
accessaa_count = accessaa_info.Count;%获取可见次数
accessaa_Interval = accessaa_info.ToArray(0,-1);%获取可见弧段的时间列表
%检索开始停止时间
StartTime = '1 Mar 2021 04:00:00.000';
StopTime = '21 Apr 2021 04:00:00.000';
accessDP = accessaa.DataProviders.Item('Access Data').Exec(ss.StartTime,ss.StopTime);
accessStartTimes = accessDP.DataSets.GetDataSetByName('Start Time').GetValues;%必须与场景时间相同
accessStopTimes = accessDP.DataSets.GetDataSetByName('Stop Time').GetValues;
%检索卫星高度变化数据
satelliteDP = sat1.DataProviders.Item('LLA State').Group.Item('Fixed').ExecElements(accessStartTimes{1},accessStopTimes{1},60,{'Time';'Alt'});
satellitealtitude = satelliteDP.DataSets.GetDataSetByName('Alt').GetValues;
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%星、传感器chain%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---------------------创建地面测控站观测卫星的链路Chian---------------
chainaa = ss.Children.New('eChain', 'SensorTOsat1');
chainaa.Objects.AddObject(sat1);
chainaa.Objects.AddObject(sensor);
chainaa.ComputeAccess();%链的访问权限,允许我们分析并查看何时以及如何访问
%--------------------在链路中获取测控站与卫星可见关系-------------------
See = chainaa.DataProviders.Item('Access Data').Exec(ss.StartTime,ss.StopTime); %获取关键时间点,这里不知道可能是几个,所以缺省时间步长。
starttime1 = cell2mat(See.DataSets.GetDataSetByName('Start Time').GetValues);%读取Start Time矢量
stoptime1 = cell2mat(See.DataSets.GetDataSetByName('Stop Time').GetValues);%读取Start Time矢量
sat2fac_count2=length(datenum(starttime1));%可见次数
See = chainaa.DataProviders.Item('Base Object Data').Exec(ss.StartTime,ss.StopTime,60); %获取关键时间点,这里不知道可能是几个,所以缺省时间步长。
Access2sat= cell2mat(See.DataSets.GetDataSetByName('Number Of Accesses').GetValues);
问题
- 如何快捷批量导入卫星