[ STK ](十)與 Matlab 互聯通訊,獲取衛星間可見性資料【演算法優化】

清瀟和梨花發表於2020-11-16

上文:[ STK ](四) 使用 Matlab,獲取衛星間可見性資料,分析得出可見性矩陣

前言

  • 在之前的文章中,我們建立了 STKMatlab 互聯通訊。
  • 通過 Matlab 編碼,獲取分析得到衛星間可見性矩陣
  • 效果雖然實現了,但是程式碼的效率極低,影響實驗。
  • 本文中,對之前的程式碼進行了重寫,提高了程式碼的執行效率。

實現思路

  • 之前的實現思路:每秒鐘獲取一次可見性資料,分析匯出可見性矩陣
  • 本文的實現思路:一次性請求到所有的可見性資料,解析,每秒鐘匯出一個可見性矩陣

實現程式碼

  • 程式碼目錄
    在這裡插入圖片描述
analysis.m :解析可見性資料
close.m :關閉連線
getVisibility.m :獲取所有可見性資料
initConn.m :初始化連線
  • demo.m
% 註釋 Ctrl + R/T

[conid,objNames] = initConn();

objNames(1) = '';
objNames(1) = '';
objNames(1) = '';

startTime = 0;
endTime = 600;
count = 24;
result = getVisibility(objNames,startTime,endTime,count);
% load('result.mat')
analysis(result,startTime,endTime,count);
close(conid);

  • initConn.m
% 初始化連線
function [conid,objNames] = initConn()
stkInit;
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);
objNames = stkObjNames;
end
  • getVisibility.m
% 獲取可見性
function [result] = getVisibility(objNames,startTime,endTime,count)
    style = 'Access';
    dt = 1;
    result = {};
    for i = 1:count
        disp(strcat(num2str(i)))
        for j = 1:count
            if i ~= j

                [secData, ~] =stkAccReport(char(objNames(int32(i))),char(objNames(int32(j))), style,startTime,endTime,dt);
                result{i,j} = secData;
            else
                % 自己與自己的距離為 0
                result{i,j} = 1;
            end
        end
    end
end
  • analysis.m
% 解析可見性資料
function [] = analysis(result,startTime,endTime,count)
    for k = startTime:endTime
        disp(strcat(num2str(k)))
        visibility = zeros(count);
        for i = 1:count
            for j = 1:count
                if iscell(result{i,j})
                    % 其他衛星
                    [~,tmp2] = size(result{i,j}{1,1});
                    if tmp2 == 4
                        % 存在可見性
                        [access,startTime,stopTime,~] = result{i,j}{1,1}.data;
                        [accessLength1,~] = size(access);
                        if accessLength1 == 1
                            % 全程可見
                            visibility(i,j) = 1;
                        else
                            % 檢查是否在可見時間段內
                            for z = 1:accessLength1
                                if k >= startTime(z) && k <=stopTime(z)
                                    % 存在可見性
                                    visibility(i,j) = 1;
                                    break;
                                end
                            end
                        end
                    else
                        % 不存在可見性
                        visibility(i,j) = 0;
                    end
                else
                    % 對自身可見,存在可見性
                    visibility(i,j) = 1;
                end
            end
        end
        csvwrite(strcat('./data/visibility',num2str(k),'.csv'),visibility)
    end
end
  • close.m
% 關閉連線
function []= close(conid)
    stkClose(conid);
    stkClose;
end

在這裡插入圖片描述

相關文章