Matlab连接STK获取可见性、距离数据

2023-10-10 23:59

本文主要是介绍Matlab连接STK获取可见性、距离数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 常用命令
    用Matlab创建STK对象
    创建场景:
uiap = actxserver(‘STK11.application’);
root = uiap.Personality2;
root.NewScenario(‘myscenario1’);
sc = root.CurrentScenario;

创建卫星:

sat = sc.Children.New(‘eSatellite’,‘mysat’);
sat.Propagator.Propagate;#显示卫星轨迹

STK创建好对象后,用Matlab获取
获取stk中所有对象的名称(包括卫星、地面站、星座等对象):

stkInit; 
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);
objNames = stkObjNames;

获取可见性数据:

% 参数依次是:参考卫星,目标卫星,报告样式,开始时间,结束时间,时间间隔
[secData, secNames] =stkAccReport(char(objNames(int32(i))),char(objNames(int32(j))), style,startTime,endTime,dt);

secData是元胞数据(相当于python中的字典dict),secData{1}获取第一个单元的数据,secData{1}.data返回可见次数、开始时间集、结束时间集、每次持续时间。
在这里插入图片描述
在这里插入图片描述

Matlab得到可见性数据及可见性矩阵(01矩阵)

#每隔10sec获取一次星间可见性
stkInit;
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);objNames = stkObjNames;
dt = 10;
style = 'Access';
startTime = 0;
endTime = 10;
result = zeros(24);for k = 1:60for i = 4:35disp(strcat(num2str(k),' ---------- ',num2str(i-3)))result(i-3,i-3) = 1;for j = (i+1):35[secData, secNames] =stkAccReport(char(objNames(int32(i))),char(objNames(int32(j))), style,startTime,endTime,dt);[temp1,temp2] = size(secData{1});if temp2 == 4[a,b,c,d] = secData{1}.data;% a: Access b:Start Time c:End Time d:Durationif d == dtresult(i-3,j-3) = 1;result(j-3,i-3) = 1;endendendendcsvwrite(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\result_',num2str(k),'.csv'),result);startTime = startTime + 10;endTime = endTime+10;
end
stkClose(conid);
stkClose;

(可跳过此代码!)
使用for+eval方便计算多卫星或多地面站之间的可见性:

'''
使用此方法连接stk需用matlab代码创建完整场景,包括卫星等,然后操纵stk对象
使用上面conid的方法连接stk,可以在stk创建好场景,然后matlab获得对象名称
'''uiApplication = actxGetRunningServer('STK11.application');root = uiApplication.Personality2;scenario = root.CurrentScenario;%waitbarhWait = waitbar(0,'Please Wait~');%scenario start timestartTime = scenario.StartTime;formatIn = 'dd mmm yyyy HH:MM:SS';startTimeNum = datenum(startTime,formatIn);% allChildren includes satellites and facilitiesallChildren = scenario.Children;allSatellites = allChildren.GetElements('eSatellite');allFacilities = allChildren.GetElements('eFacility');satNum = allSatellites.Count;for i=0:1:satNum-1% eg: sat0=allSatellites.Item(cast(0,'int32'));eval(['sat',num2str(i),'=allSatellites.Item(cast(i,''int32''));'])endfacNum = allFacilities.Count;for i=0:1:facNum-1eval(['fac',num2str(i),'=allFacilities.Item(cast(i,''int32''));'])end% all access in Time(day month year...)allAccessIntervals=[];% all access in SecondsallAccessIntervalsSec=[];% only ISLif(var1==1)for from=0:1:satNum-1waitbar(from/satNum,hWait);for to=from+1:1:satNum-1eval(['fromSat=sat',num2str(from),';']);eval(['toSat=sat',num2str(to),';']);access = fromSat.GetAccessToObject(toSat);access.ComputeAccess;accessIntervals = access.ComputedAccessIntervalTimes;if(accessIntervals.Count~=0)computedIntervals = accessIntervals.ToArray(0, -1);temp=cell(accessIntervals.Count,2);for i=1:1:accessIntervals.Counttemp{i,1}=from+1;temp{i,2}=to+1;endallAccessIntervals = [allAccessIntervals;temp,computedIntervals];endendendend% transfer Time(day month year time) to Seconds[rows,cols] = size( allAccessIntervals);for row=1:1:rowsintervalStart =  allAccessIntervals{row,3};intervalEnd =  allAccessIntervals{row,4};%in dayintervalStartNum = datenum(intervalStart,formatIn);intervalEndNum = datenum(intervalEnd,formatIn);%in scecondsintervalSatrtSec = (intervalStartNum-startTimeNum)*24*60*60;intervalEndSec = (intervalEndNum-startTimeNum)*24*60*60;allAccessIntervalsSec =    [allAccessIntervalsSec;allAccessIntervals{row,1},allAccessIntervals{row,2},intervalSatrtSec,intervalEndSec];end

Matlab连接STK后,获取星间可见性数据及距离数据完整代码:
dt为时间间隔,由于卫星的移动性特点,在此设dt为60sec获取每隔60sec的星间可见性矩阵及距离矩阵:
主文件:

[conid,objNames] = initConn();%运行一次即可,运行后跑其他代码,将这行注释!
bias = 3;%偏移量
satnum = 32;%卫星总数
startobj = 1 + bias;
endobj = satnum + bias;
startTime = 0;
endTime = 7200;
dt = 60;
result = getVisibility(objNames,startTime,endTime,satnum,bias);
analysis(result,startTime,endTime,satnum,dt);
result_range = getRange(objNames,satnum,bias);
analysisRange(result_range,startTime,endTime,satnum,dt);
closeConn(conid);

函数文件:
getVisibility.m

% 获取从startTime到endTime之间所有的可见性数据
function [result] = getVisibility(objNames,startTime,endTime,satnum,bias)style = 'Access';dt = 1;result = {};for i = 1:satnumdisp(strcat(num2str(i)))result{i,i} = 1; % 自己对自己设置为可见 1for j = (i+1):satnum[secData, ~] =stkAccReport(char(objNames(int32(i+bias))),char(objNames(int32(j+bias))),style,startTime,endTime,dt);result{i,j} = secData;result{j,i} = secData;endend
end

analysis.m

% 解析可见性数据
function [] = analysis(result,startTime,endTime,satnum,dt)for k = startTime:dt:endTime%每隔dt(sec)输出可见性矩阵disp(strcat(num2str(k)))visibility = zeros(satnum);%可见性矩阵01矩阵for i = 1:satnumvisibility(i,i) = 1;%自己和自己都是可见的for j = (i+1):satnumif iscell(result{i,j})  % 自己和其他卫星%判断是否为元胞数据结构[~,tmp2] = size(result{i,j}{1,1});if tmp2 == 4 % 可能存在可见性[access,startTime,stopTime,durationTime] = result{i,j}{1,1}.data;[accessLength1,~] = size(access);% 检查是否在可见时间段内for z = 1:accessLength1if k >= startTime(z) && k <=stopTime(z) % 存在可见性visibility(i,j) = 1;visibility(j,i) = 1;break;endendendendendendcsvwrite(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\visibility_',num2str(k),'.csv'),visibility)end
end

getRange.m

% 获取距离
function [result] = getRange(objNames,satnum,bias)style = 'AER';result = {};for i = 1:satnumdisp(strcat(num2str(i)))result{i,i} = 0; % 自己与自己的距离为 0for j = (i+1):satnum[rangeData, ~] =stkAccReport(char(objNames(int32(i+bias))),char(objNames(int32(j+bias))),style);result{i,j} = rangeData;result{j,i} = rangeData;endend
end

analysisRange.m

% 解析数据
function [] = analysisRange(result,startTime,endTime,satnum,dt)for k = startTime:dt:endTimevisibility = load(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\visibility_',num2str(k),'.csv'));disp(strcat(num2str(k)))range = zeros(satnum);for i = 1:satnumrange(i,i) = 0;% 对自身距离为 0for j = (i+1):satnumif iscell(result{i,j})% 其他卫星[~,tmp2] = size(result{i,j}{1,1});if visibility(i,j) == 1 % 存在距离[time,azimuth,elevation,rangeTmp] = result{i,j}{1,1}.data;[rangeLength,~] = size(rangeTmp);% 检查是否在可见时间段内for z = 1:rangeLengthif z <= rangeLength - 1if k >= time(z) && k <time(z+1)range(i,j) = rangeTmp(z);range(j,i) = rangeTmp(z);break;endelserange(i,j) = rangeTmp(z);range(j,i) = rangeTmp(z);endendelse% 不存在距离  range(i,j) = 999;range(j,i) = 999;endendendendcsvwrite(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\range_',num2str(k),'.csv'),range)end
end

这篇关于Matlab连接STK获取可见性、距离数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184052

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池