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

这篇具有很好参考价值的文章主要介绍了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返回可见次数、开始时间集、结束时间集、每次持续时间。
stk输出可见性,matlab,开发语言,矩阵
stk输出可见性,matlab,开发语言,矩阵

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:60
    for i = 4:35
        disp(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:Duration
                if d == dt
                    result(i-3,j-3) = 1;
                    result(j-3,i-3) = 1;
                end
            end
        end
    end
    csvwrite(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;
    
    %waitbar
    hWait = waitbar(0,'Please Wait~');
    
    %scenario start time
    startTime = scenario.StartTime;
    formatIn = 'dd mmm yyyy HH:MM:SS';
    startTimeNum = datenum(startTime,formatIn);
    
    
    % allChildren includes satellites and facilities
    allChildren = 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''));'])
    end
    
    facNum = allFacilities.Count;
    for i=0:1:facNum-1
        eval(['fac',num2str(i),'=allFacilities.Item(cast(i,''int32''));'])
    end
    
    % all access in Time(day month year...)
    allAccessIntervals=[];
    % all access in Seconds
    allAccessIntervalsSec=[];
    
    % only ISL
    if(var1==1)
        
        for from=0:1:satNum-1
            waitbar(from/satNum,hWait);
            for to=from+1:1:satNum-1
                eval(['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.Count
                        temp{i,1}=from+1;
                        temp{i,2}=to+1;
                    end
                    allAccessIntervals = [allAccessIntervals;temp,computedIntervals];
                    
                end
                
            end
        end
    end
 
    % transfer Time(day month year time) to Seconds
    [rows,cols] = size( allAccessIntervals);
    for row=1:1:rows
        intervalStart =  allAccessIntervals{row,3};
        intervalEnd =  allAccessIntervals{row,4};
        
        %in day
        intervalStartNum = datenum(intervalStart,formatIn);
        intervalEndNum = datenum(intervalEnd,formatIn);
        
        %in sceconds
        intervalSatrtSec = (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:satnum
        disp(strcat(num2str(i)))
        result{i,i} = 1; % 自己对自己设置为可见 1
        for 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;
        end
    end
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:satnum
            visibility(i,i) = 1;%自己和自己都是可见的
            for j = (i+1):satnum
                if 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:accessLength1
                            if k >= startTime(z) && k <=stopTime(z) % 存在可见性
                                visibility(i,j) = 1;
                                visibility(j,i) = 1;
                                break;
                            end
                        end
                    end
                end
            end
        end
        csvwrite(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:satnum
        disp(strcat(num2str(i)))
        result{i,i} = 0; % 自己与自己的距离为 0
        for 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;
        end
    end
end

analysisRange.m文章来源地址https://www.toymoban.com/news/detail-590425.html

% 解析数据
function [] = analysisRange(result,startTime,endTime,satnum,dt)
    for k = startTime:dt:endTime
        visibility = load(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\visibility_',num2str(k),'.csv'));
        disp(strcat(num2str(k)))
        range = zeros(satnum);
        for i = 1:satnum
            range(i,i) = 0;% 对自身距离为 0
            for j = (i+1):satnum
                if 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:rangeLength
                            if z <= rangeLength - 1
                                if k >= time(z) && k <time(z+1)
                                    range(i,j) = rangeTmp(z);
                                    range(j,i) = rangeTmp(z);
                                    break;
                                end
                            else
                                range(i,j) = rangeTmp(z);
                                range(j,i) = rangeTmp(z);
                            end
                        end
                    else% 不存在距离  
                        range(i,j) = 999;
                        range(j,i) = 999;
                    end
                end
            end
        end
        csvwrite(strcat('C:\\Users\\Administrator\\Desktop\\stk\\stk_files\\range_',num2str(k),'.csv'),range)
    end
end

到了这里,关于Matlab连接STK获取可见性、距离数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序 获取当前屏幕的可见高宽度

    很多时候我们做一下逻辑 需要用整个窗口的高度或宽度参与计算 而且很多时候我们js中拿到的单位都是px像素点 没办法和rpx同流合污 官方提供了wx.getSystemInfoSync() 可以获取到部分窗口信息 其中就包括了整个窗口的宽度和高度 wx.getSystemInfoSync().windowHeight 返回值为像素点 px 整个

    2024年01月16日
    浏览(62)
  • Manifest queries标签 / targetAPI动态获取 / 手机 /包可见性

    如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台,在默认情况下,系统会自动让部分应用对您的应用可见,但会隐藏其他应用。通过让部分应用在默认情况下不可见,系统可以了解应向您的应用显示哪些其他应用,这样有助于鼓励最小权限原则,还可帮助 Googl

    2024年02月11日
    浏览(35)
  • UG\NX二次开发 获取2D制图视图中可见的对象,并获取类型

    文章作者:里海 来源网站: https://blog.csdn.net/WangPaiFeiXingYuan 使用UF_VIEW_ask_visible_objects获取2D制图视图中可见的对象,并获取类型。 下面是将一个六面体以不同的视图投影,获取视图对象和类型的效果。 1个部件事例,1个体,4条边   1个部件事例,1个体,12条边

    2024年02月15日
    浏览(50)
  • python连接mysql查询数据输出excel

    要将Python连接MySQL查询的数据输出到Excel文件,你可以使用 pandas 库和 openpyxl 库。首先,你需要安装这些库,可以使用以下命令: 接下来,你可以使用以下代码将MySQL查询的数据导出到Excel文件: 在这个示例中,我们首先使用pymysql库连接到MySQL数据库,然后执行查询语句并将查

    2024年01月24日
    浏览(38)
  • MATLAB输出串口发送所需十六进制数据

      可以用一个文件来测试其是否符合我们的要求,将一个二进制向量转化为十六进制向量,每个十六进制数表示1byte(不足1byte前面补0),并且写入txt文件中,每byte之间用空格隔开。   打开存储路径下的txt文件,可见符合预期需求。   使用串口助手载入txt文件,可见

    2024年02月16日
    浏览(49)
  • python连接sql server查询数据输出excel

    要将Python连接SQL Server查询的数据输出到Excel文件,你可以使用 pyodbc 库和 pandas 库。首先,你需要安装这些库,可以使用以下命令: 接下来,你可以使用以下代码将SQL Server查询的数据导出到Excel文件: 在这个示例中,你需要将 your_server_name 、 your_database_name 、 your_username 和

    2024年01月24日
    浏览(45)
  • matlab做经济地理、地理距离、经济距离空间权重矩阵

    首先讲下地理加权空间权重矩阵: 该矩阵的经济含义是通过不同点的坐标系之间的距离远近来衡量两地之间的关系重要程度,当两点之间距离较远,所占的权重越低,而距离越近,权重越高。故操作如下: 首先需要导入坐标数据: A=csvread(\\\'JWD.csv\\\',1,0); % JWD.csv是文件名,csvrea

    2023年04月12日
    浏览(39)
  • js获取元素到可视区的距离/浏览器窗口滚动距离/元素距离浏览器顶部距离

    1. js获取元素距离可视区的各种距离 2. js获取浏览器窗口滚动距离 3. js获取元素实际距离页面距离(包括滚动距离) (1).如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离。 (2).如果父辈元素中没有定位元素,那么就返回相对于body边缘距

    2024年02月12日
    浏览(51)
  • 【图像融合】小波变换可见光与红外光图像融合(带面板)【含GUI Matlab源码 701期】

    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭:行百里者,半于九十。 更多Matlab仿真内容点击👇 Matlab图像处理(进阶版) 路径规划

    2024年02月19日
    浏览(72)
  • 数据预处理matlab matlab数据的获取、预处理、统计、可视化、降维

    1.1 从Excel中获取 使用readtable() 例1: 使用 spreadsheetImportOptions(Name,Value) 初步确定导入信息, 再用 opts.Name=Value 的格式添加。 例2: 先初始化 spreadsheetImportOptions 对象, 再用 opts.Name=Value 的格式逐个添加。 例3: 将导入信息存到变量里, 再使用 spreadsheetImportOptions(Name,Value)

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包