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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav