[ STK ] 使用 Matlab,获取卫星间可见性数据,分析得出可见性矩阵

前言

  • 在之前的博客(STK 卫星间可见性分析)中,我们使用STK软件,分析了可见性。
  • 由于实验需要,我们需要得出一个视场可见性矩阵,1为可见,0为不可见。
  • 在之前的博客中(STK 与 Matlab 互联(亲测成功)),我们建立了STKMatlab的互联通信。
  • 本篇博客中我们通过编程,获取卫星间可见性数据,从而分析得出可见性矩阵。

编码详解

  • 建立STKMatlab的连接
% 初始化连接
stkInit;
% 默认端口 5001
remMachine = stkDefaultHost;
% conid只能获取两次,使用完需要关闭连接
conid = stkOpen(remMachine);
  • 获取星座中所有卫星的名称
% 总共 24 颗卫星,第一颗卫星下标为 4
objNames = stkObjNames;

在这里插入图片描述

  • STK中获取可见性

该方法只能获取任意两颗卫星之间的可见性,我们需要通过双重循环来获取24颗卫星,两两之间的可见性,得到一个 24 x 24的矩阵

返回值有:可见时间段的段数,可见时间段开始时间和结束时间,可见时间段时长
在这里插入图片描述
在这里插入图片描述

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

完整代码

  • 这里是获取0-60秒内,卫星的可见性矩阵
stkInit;
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);

objNames = stkObjNames;
dt = 60;
style = 'Access';
startTime = 0;
endTime = 60;
result = zeros(24);
for i = 4:27
    disp(i)
    for j = 4:27
        if i ~= j
            %disp(j)
            [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;
                end
            end
        else
            result(i-3,j-3) = 1;
        end
    end
end


stkClose(conid);
stkClose;

  • 如果需要每秒钟获取一次可见性,代码需要做如下改动,每秒生成一个矩阵,保存到.csv文件中
    在这里插入图片描述
stkInit;
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);

objNames = stkObjNames;
dt = 1;
style = 'Access';
startTime = 0;
endTime = 1;
result = zeros(24);

for k = 1:60
    for i = 4:27
        disp(strcat(num2str(k),' ---------- ',num2str(i-3)))
        for j = 4:27
            if i ~= j
                %disp(j)
                [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;
                    end
                end
            else
                result(i-3,j-3) = 1;
            end
        end
    end
    csvwrite(strcat('./data/result',num2str(k),'.csv'),result)
    startTime = startTime + 1;
    endTime = endTime+1;
end
stkClose(conid);
stkClose;


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43901693/article/details/107657843