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

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa