一文教你做MATLAB与STK编程(MATLAB与STK混合编程实例,含代码)

简介:通过STK的连接模块(connectors),实现STK与应用程序Matlab交互。单独一方干不成或难度大,通过互联可充分发挥STK与第三方应用程序各自的优势。STKMatlab互联是两个强大成熟商业软件的强强联合。STK提供超过200个Matlab格式化过封装好的命令。这些接口函数能够大大提升编程效率。

STK强项:轨道计算功能丰富、 可靠。
STK弱项:STK自身无法通过编程实现对某些复杂航天任务的仿真分析。例如:循环计算、 复杂的嵌套迭代、 复杂的收敛判据。

Matlab强项:使用便捷、 能编程实现复杂逻辑。

Matlab弱项:没有天生的轨道计算能力。

一、本博客的MATLABSTK互联实例任务:

背景:给定一个四颗卫星组成的星座,计算分析两天时间内该星座对全球每一点的最大重访时间。

任务:计算星座对地面点的最大重访时间。

二、直接上结果图:

1.  该动图为MATLAB与STK互联的直观显示,MATLAB运行程序后,与STK建立connectors,自动打开STK工程,并自动建立对应场景,通过遍历地球表面地面站,计算重访时间,循环得到两天时间内该星座对全球每一点的最大重访时间。

2.  下图为MATLAB显示的waitbar,可以自动显示循环进度以及预计剩余时间。

3. 下图为四星星座对全球每一点的最大重访时间二维图以及三维图。纬度变化范围为:-90°~90°;经度的变化范围为:0°~360°。

步进角度为5度的结果:

步进角度为2度的结果:  

三、MATLABSTK互联步骤

MATLAB与STK互联主要可以通过电脑串口COM或者STK的connectors链接器进行互联。本文主要介绍connection链接器方法。该部分已经有很多博主进行分享,本博客进行简要介绍。建议先安装MATLAB2018b,再安装STK11.6。这两个版本的软件能够自动建立connectors,完成软件的互联。

1. 软件版本截图:

2. 链接connection步骤:(注意:前提是已经安装好MATLAB2018b) 

① 以管理员身份打开STK11.6的install.exe。界面如下:

红色框内选项全部勾选,由于我电脑已经安装好了STK11.6,因此我的红色框内选项是灰色的,没有安装STK11.6的电脑是可以勾选的。

② 安装好STK11.6后,打开STK,查看STK和Matlab互联连接器connectors的状态。点击STK菜单栏的edit选项卡,继续点击Preferences,可以看到与STK连接的MATLAB版本,下图代表STK与MATLAB互联完成。

③ 然后再打开MATLAB,输入stkInit(区分大小写),对STK的连接进行初始化,可以看到如下提示,这就表示MATLAB已经与STK进行连接,此后就可以利用MATLAB对STK进行编程。

 3. 航天应用常用接口函数的使用。

初始化需要的接口函数

stkInit—— 完成STKMatlab的互联

conid=stkOpen(stkDefaultHost); —— 返回互联成功的主机端口的连接句柄

初始窗口管理

if  stkValidScen == 1

stkUnload('/*')

end —— 如果已经有打开的场景,则关闭场景。

建立场景

stkNewObj('/','Scenario','场景名称'); —— 建立给定名称的场景。

stkSetTimePeriod('10 Apr 2024 00:00:00.0','12 Apr 2024 00:00:00.0','GREGUTC');

—— 设置场景的起止时间和采用的时间系统。

stkSetEpoch('10 Apr 2024 00:00:00.0','GREGUTC'); —— 设置场景的历元。

stkSyncEpoch; —— 同步aeroToolboxSTK场景历元。

rtn = stkConnect(conid,'Animate','Scenario/场景名称','SetValues "10 Apr 2024

00:00:00.0" 60 0.1'); —— 设置STK场景动画历元。

rtn = stkConnect(conid,‘Animate’,‘Scenario/场景名称’,‘Reset’); —— 设置动画时

间复位。

建立航天器

stkNewObj('*/','Satellite','航天器名称'); —— 建立卫星。

stkSetPropClassical('objPath', 'propagator', 'coordSystem', tStart, tStop, dt,

orbitEpoch, semimajorAxis, eccentricity,inclination, argOfPerigee, RAAN,

meanAnomaly, coordEpoch)

关闭连接

stkClose(conid);

4. 所有STK与MATLAB互联语法如下PDF显示:

四、MATLAB与STK互联主要代码如下,如有代码问题,请加V(Lucky_YQW)交流。


clc
clear all
close all
stkClose('ALL')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算星座对地面点的最大重访时间
%详细背景:给定一个星座,计算分析两天时间内该星座对全球每一点的最大重访时间。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 互联
stkInit; % 建立连接
conid=stkOpen; % 得到连接句柄(用于发送指令)
delete(get(0,'children')); % 关闭其他绘图窗口
scen_open = stkValidScen; % 如果有已打开的场景,则自动关闭
if scen_open == 1
    stkUnload('/*');
end

%% 建立场景
% 新建场景
stkNewObj('/','Scenario','Test');
% 设定时间
stkSetTimePeriod('26 Apr 2024 00:00:00.00','28 Apr 2024 00:00:00.00','GREGUTC');
% 使aeroToolbox中函数的历元时间与场景一致
stkSetEpoch('26 Apr 2024 00:00:00.00','GREGUTC');
stkSyncEpoch;

%% 新建四颗卫星
stkNewObj('*/','Satellite','sat1');
stkNewObj('*/','Satellite','sat2');
stkNewObj('*/','Satellite','sat3');
stkNewObj('*/','Satellite','sat4');
% 设置起止时间、历元时刻、积分步长
t_start=0;
t_stop=1*(24*3600);   % 两天的时间
dt=60;
orbitEpoch=t_start;
% 基准星轨道根数
a_MB=7000*1000;
e_MB=0;
i_MB=60*pi/180;
w_MB=0*pi/180;
Raan_MB=0*pi/180;
M_MB=0*pi/180;

% 输入并积分星座轨道
stkSetPropClassical('*/Satellite/sat1','J2Perturbation','J2000',t_start,t_stop,dt,orbitEpoch,a_MB,e_MB,i_MB,w_MB,Raan_MB,M_MB);
stkPropagate('*/Satellite/sat1', t_start, t_stop)
stkSetPropClassical('*/Satellite/sat2','J2Perturbation','J2000',t_start,t_stop,dt,orbitEpoch,a_MB,e_MB,i_MB,w_MB,Raan_MB+pi/4,M_MB+pi);
stkPropagate('*/Satellite/sat2', t_start, t_stop)
stkSetPropClassical('*/Satellite/sat3','J2Perturbation','J2000',t_start,t_stop,dt,orbitEpoch,a_MB,e_MB,i_MB,w_MB,Raan_MB+pi/2,M_MB+2*pi);
stkPropagate('*/Satellite/sat3', t_start, t_stop)
stkSetPropClassical('*/Satellite/sat4','J2Perturbation','J2000',t_start,t_stop,dt,orbitEpoch,a_MB,e_MB,i_MB,w_MB,Raan_MB+3*pi/4,M_MB+pi/2);
stkPropagate('*/Satellite/sat4', t_start, t_stop);


%% 建立地面站,循环计算不同位置的最大重访时间
% 新建地面站
stkNewObj('*/','Facility','Point');    % Phi; Lamda 分别是纬度,经度,纬度变化范围是-90到90度,经度0-360度
% 地面站参数
% 经度参数
Lamda_min = 0;
delta_Lamda = 5;
n_Lamda = 360/delta_Lamda;
% 纬度参数
Phi_min = -90;
delta_Phi = 5;
n_Phi = 180/delta_Phi;
% 循环计算
h=waitbar(0,'开始地面站扫描');
for i=1:n_Lamda
    for j=1:n_Phi
        tic
        % 设置地面站经纬度坐标
        namda = (Lamda_min+(i-1)*delta_Lamda)/180*pi;
        X(i,j)=namda/pi*180;
        phi = (Phi_min+(j-1)*delta_Phi)/180*pi;
        Y(i,j)=phi/pi*180;
        stkSetFacPosLLA('Scenario/Test/Facility/Point',[phi; namda; 0]);
        % 根据对地观测需求设置地面点最低跟踪仰角
        stkConnect(conid,'SetConstraint','Scenario/Test/Facility/Point','ElevationAngle Min 50');
        %计算各星访问时间

        %%%%%%%%%%%%%此处省略%%%%%%%%%%%
        
        % 计算最大重访时间,直至循环结束
        temp=0;
        if size(interval1)==[0 0] & size(interval2)==[0 0] & size(interval3)==[0 0] & size(interval4)==[0 0]
            Z(i,j)=0;
        else
            if size(interval1)~=[0 0]
                temp=[temp,interval1.start,interval1.stop];
            end
            if size(interval2)~=[0 0]
                temp=[temp,interval2.start,interval2.stop];
            end
            if size(interval3)~=[0 0]
                temp=[temp,interval3.start,interval3.stop];
            end
            if size(interval4)~=[0 0]
                temp=[temp,interval4.start,interval4.stop];
            end

        %%%%%%%%%%%%%此处省略%%%%%%%%%%%

        end
        toc
        flag_num = (i-1) * n_Phi + j;
        if i == 1 && j == 1
        per_time = toc;
        end
        time_remain = per_time * (n_Lamda*n_Phi - flag_num);
        str=['扫描进度:',num2str(100*flag_num/n_Lamda/n_Phi),'%','    预估剩余时间:',num2str(time_remain),'秒'];       
        waitbar(flag_num/n_Lamda/n_Phi,h,str);
    end
end
delete(h);  %close(h)
save('res_inteval_5.mat','X','Y','Z');

figure
surf(X,Y,Z);
xlabel('经度(度)');
ylabel('纬度(度)');
zlabel('最大重访时间间隔(小时)');
colorbar
xlim([0 355]);
ylim([-90 85]);

%% 关闭连接
stkClose(conid);

  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿呆汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值