用MATLAB进行STK11编程

文章目录

  • 前言
  • 一、MATALB的初始运行
  • 二、STK的编程文档
    • 1.使用的总体感受
    • 2.获取可见性的开始结束时间
    • 3.获取卫星的姿态四元素
    • 4.获取目标点的笛卡尔坐标
    • 5.获取卫星的笛卡尔位置和速度
    • 6.使用PreData提取数据
    • 7.获取单个时间点的数据
    • 8.获取特定点和元素的数据
    • 9.获取分为多个部分的时间相关数据
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

按照CSDN上的帖子成功安装了STK11,并成功与MATLAB的版本号相对应。我用的是STK11与MATLAB2018b。
安装的过程很简单,按照下面的链接就可以了,使用stkInit命令进行测试的时候,出现错误的原因是STK没有打开。打开STK就不会报Error了。
接下来,就总结一下,最近这几天的STK帮助文档的使用,主要是方便自己以后查找。
这里贴上各位博主大佬的链接
STK 与Matlab 的连接
STK 11.6 安装、与MATLAB的互联及其混合编程
[ STK ](二)STK 与 Matlab 互联(亲测成功
【STK】STK11.6下载安装+MATLAB互连+各插件模块(不用再找了,这里能解决)


一、MATALB的初始运行

刚开始的时候,找个安装目录下的一个.m实例,简单地运行了一下,链接这里,有时间再补吧。


二、STK的编程文档

1.使用的总体感受

1.其实,感觉还是STK10的帮助文档更方便直观,STK11的网页文档看着有点绕,还得一个一个得找。STK的帮助文档就在开始菜单STK11文件夹内,里面的Programming Interface Hel。
用MATLAB进行STK11编程_第1张图片
2.其次,就是感觉还是利用C#进行STK编程更好一点,因为matlab的变量类型是真的不清楚。所以说,用MATLAB进行STK编程得清楚变量的类型,进而去找里面的属性和方法。

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.获取可见性的开始结束时间

代码如下(示例):

%将时间单位设置为历元秒,这样我们的时间步长输入以及开始和停止时间都以秒为单位。
root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec');
scenario = root.CurrentScenario;
access = satellite.GetAccessToObject(facility); 
access.ComputeAccess; 
%获取Access(访问)数据
accessDP = access.DataProviders.Item('Access Data').Exec(scenario.StartTime, scenario.StopTime); 
%DP中获取Cell数据,转为mat
accessStartTimes = cell2mat(accessDP.DataSets.GetDataSetByName('Start Time').GetValues); 
accessStopTimes = cell2mat(accessDP.DataSets.GetDataSetByName('Stop Time').GetValues); 

STK应用的报告:
用MATLAB进行STK11编程_第2张图片


3.获取卫星的姿态四元素

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
elems = {'Time';'q1';'q2';'q3';'q4'}; 
satDP = satellite.DataProviders.Item('Attitude Quaternions').ExecElements(scenario.StartTime, scenario.StopTime, 60, elems); 
% 无论何时将索引传递给数组,都需要将其转换为(int32)
satTime = cell2mat(satDP.DataSets.Item(cast(0,'int32')).GetValues); 
satq1 = cell2mat(satDP.DataSets.Item(cast(1,'int32')).GetValues); 
satq2 = cell2mat(satDP.DataSets.Item(cast(2,'int32')).GetValues); 
satq3 = cell2mat(satDP.DataSets.Item(cast(3,'int32')).GetValues); 
satq4 = cell2mat(satDP.DataSets.Item(cast(4,'int32')).GetValues);

4.获取目标点的笛卡尔坐标

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
facDP = facility.DataProviders.Item('Cartesian Position').Exec; 
facx = cell2mat(facDP.DataSets.GetDataSetByName('x').GetValues); 
facy = cell2mat(facDP.DataSets.GetDataSetByName('y').GetValues); 
facz = cell2mat(facDP.DataSets.GetDataSetByName('z').GetValues); 

5.获取卫星的笛卡尔位置和速度

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
satPosDP = satellite.DataProviders.Item('Cartesian Position').Group.Item('ICRF').Exec(scenario.StartTime,scenario.StopTime,60); 
satx = cell2mat(satPosDP.DataSets.GetDataSetByName('x').GetValues); 
saty = cell2mat(satPosDP.DataSets.GetDataSetByName('y').GetValues); 
satz = cell2mat(satPosDP.DataSets.GetDataSetByName('z').GetValues);
satVelDP = satellite.DataProviders.GetDataPrvTimeVarFromPath('Cartesian Velocity/ICRF').Exec(scenario.StartTime,scenario.StopTime,60);
satvx = cell2mat(satVelDP.DataSets.GetDataSetByName('x').GetValues); 
satvy = cell2mat(satVelDP.DataSets.GetDataSetByName('y').GetValues); 
satvz = cell2mat(satVelDP.DataSets.GetDataSetByName('z').GetValues);

6.使用PreData提取数据

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
facChooseDP = facility.DataProviders.Item('Points Choose System'); 
dataProvCenter = facChooseDP.Group.Item('Center');
dataProvCenter.PreData = 'CentralBody/Earth TOD'; 
rptElems = {'Time';'x';'y';'z'}; 
results = dataProvCenter.ExecElements(scenario.StartTime, scenario.StopTime, 60, rptElems); 
datasets = results.DataSets; 
Time = cell2mat(datasets.GetDataSetByName('Time').GetValues); 
facTODx = cell2mat(datasets.GetDataSetByName('x').GetValues); 
facTODy = cell2mat(datasets.GetDataSetByName('y').GetValues); 
facTODz = cell2mat(datasets.GetDataSetByName('z').GetValues); 

7.获取单个时间点的数据

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
satPassDP = satellite.DataProviders.Item('Precision Passes').ExecSingle(2600); 
pass = cell2mat(satPassDP.DataSets.GetDataSetByName('Precision Pass Number').GetValues);  

8.获取特定点和元素的数据

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
times = {0;15000;20000;55000}; 
elems = {'Time';'Precision Pass Number'}; 
satPassesDP = satellite.DataProviders.Item('Precision Passes').ExecSingleElementsArray(times,elems); 
passes = cell2mat(satPassesDP.GetArray(cast(1,'int32'))); 

9.获取分为多个部分的时间相关数据

root.UnitPreferences.Item('DateFormat').SetCurrentUnit('EpSec'); 
accessAER = access.DataProviders.Item('AER Data').Group.Item('BodyFixed').Exec(scenario.StartTime, scenario.StopTime,60); 
AERTimes = cell2mat(accessAER.Interval.Item(cast(0,'int32')).DataSets.GetDataSetByName('Time').GetValues); 
Az = cell2mat(accessAER.Interval.Item(cast(0,'int32')).DataSets.GetDataSetByName('Azimuth').GetValues); 
El = cell2mat(accessAER.Interval.Item(cast(0,'int32')).DataSets.GetDataSetByName('Elevation').GetValues); 
for i = 1:1:accessAER.Interval.Count-1 
    AERTimes = [AERTimes; cell2mat(accessAER.Interval.Item(cast(i,'int32')).DataSets.GetDataSetByName('Time').GetValues)]; 
    Az = [Az; cell2mat(accessAER.Interval.Item(cast(i,'int32')).DataSets.GetDataSetByName('Azimuth').GetValues)]; 
    El = [El; cell2mat(accessAER.Interval.Item(cast(i,'int32')).DataSets.GetDataSetByName('Elevation').GetValues)]; 
end 

总结

其实,我也不是很懂上面的程序,只是简单地从STK帮助文档中copy出来,希望以后再回头看的时候,能更加深入理解吧。

你可能感兴趣的:(MATLAB进行STK编程,matlab,开发语言)