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获取可见性、距离数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_41880928/article/details/125086188
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/184052

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景