STK自动化是指使用其他软件或者程序语言,直接操作STK对象和UI界面。之所以需要STK自动化,是因为直接使用STK UI界面进行仿真存在以下困境:
(1)通常情况下,STK航空仿真需要大量的数据,例如一系列的飞机轨迹点等等,手动在STK界面中输入这些轨迹点比较耗时耗力。
(2)STK航空仿真大多是实时仿真,数据不是预先给定的,是由一定的算法或者其他软件(如MATLAB)在仿真时生成的。
(3)项目交付时,需要接收方熟练使用STK,然而对甲方爸爸提这种要求百分之百会被喷。
(4)对于大型项目,使用UI界面设置仿真参数很容易出错,也难以保证操作的规范性,如果使用自动化脚本完成仿真配置,可以保证每次配置都是一致的,减少出错的概率。
鉴于这些情况,通常需要定制一些接口,让其他软件或者程序语言能直接与STK进行交互,这样可以专心于仿真的算法设计而无需事先掌握STK的使用。
打开STK帮助文档可以查阅STK自动化的帮助文档:
其中Automate Tasks一节就是STK自动化的帮助文档。
在帮助文档中可以看到,STK自动化有以下几种方法:
(1)OLE 自动化
OLE(Object Linking and Embedding,对象连接与嵌入),是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。OLE从多媒体借鉴而来,是Windows的一组服务功能,提供了一种以源于不同应用软件的信息建立复合文档的强有力方法。在对象连接和嵌入系统中,对象可以是几乎所有的数据类型,例如文字、点阵图像和矢量图形,甚至于声音、注解和录像剪辑等均可。对象被赋予了智能属性,即参与连接和嵌人的对象本身带有计算机指令。最典型的OLE应用就是PowerPoint,PPT就是一种广泛使用OLE技术的多媒体文档,所以我们可以在PPT中直接播放音视频。
STK的OLE自动化支持Java,C++,Python,Matlab和Javascript等,其他软件也可以使用OLE调用STK。
通过OLE自动化,可以使用STK Model Object(AgSTKObjects, AgSTKGraphics, AgVGT and AgSTKUtil 和AGI.STKObjects, AGI.STKGraphics,AGI.STKVgt
and AGI.STKUtil等
)操作STK中的模型和工具组件,也可以使用AgUiCore库操作STK的窗口,工具栏等。
优点:不依赖于特定的STK版本和编程语言,可以使用多种语言编程实现。
缺点:需要配置相应的OLE支持库,每种语言的OLE支持库有差异,需要分别配置。
(2)TCP/IP socket通信
STK在运行时会启动一个TCP服务器,默认监听5001端口,启动多个STK窗口,监听的端口以5001,5002的形式递增。想这个端口以文本的形式发送STK命令,STK会解释这些命令并反馈结果。
优点:可以在本地或者通过网络与STK交互,不依赖于特定的STK版本,任何可以发起TCP请求的编程语言或者软件都可以与STK交互,依赖的库很少,通用性强。
缺点:命令和数据以文本的形式传递,延迟大,数据也要进行转义和编码处理。
(3)自定义STK UI
STK支持使用HTML 网页来自定义和拓展UI界面,同时也支持使用UI插件来自定义工具栏和窗口。优点:定制好的自动化界面是图形界面,使用简单,操作方便。
缺点:由于图形界面表示的状态有限,只能实现有限的自动化功能,并且需要手动触发,对于不能用图形界面表示的或者触发时机不确定的自动化操作无能为力,编制图形化界面所需的代码量比较大。
(4)使用官方提供的MATLAB 连接组件
AGI公司提供了一个插件MATLAB Connector来支持MATLAB和STK的交互,但是这个插件只支持特定MATLAB和STK版本之间的连接。
优点:可以直接在MATLAB中操作STK,方便连接仿真算法进行实时仿真。
缺点:MATLAB Connector只适合特定版本的MATLAB和STK,适配性差。
就我个人理解,自动化应该遵循以下的原则:
(1)版本独立原则:自动化程序应该不依赖于目标软件版本,否则换个版本就需要更新自动化程序,成本很高,特别是对于大型仿真任务。
(2)简洁配置原则:自动化程序的配置应当十分简单,确保用户只需少量操作就可以执行使用自动化程序执行任务,如果配置太繁琐,就背离了自动化的目的,自动化效果也不明显。
(3)少量开发原则:自动化程序承担的是功能调度和数据输入的责任,要尽可能利用目标软件的接口完成任务,自身的逻辑不能太复杂,否则会增加自动化时出错的概率。
结合上述原则,考虑到航空仿真时数据输入量比较大的特点,这里采用OLE技术开发自动化程序。
使用STK的OLE接口,开发一个STK自动化simulink模块,适配大多数的MATLAB版本,实现用Simulink操控STK,输入仿真数据,设置和获取STK模型数据等。
MATLAB2021a,STK10
open_STK.m
uiapp = actxserver('STK10.application');
root = uiapp.Personality2;
uiapp.visible = 1;
运行会启动一个空白的STK窗口,注意第一行中的uiapp = actxserver('STK10.application')要随STK版本而更改,我用的是STK10,如果是STK12,改为 uiapp = actxserver('STK12.application');其他版本类似。
可以看到窗口中什么也没有。
%打开一个STK窗口
uiapp = actxserver('STK10.application');
root = uiapp.Personality2;
uiapp.visible = 1;
% 创建一个新场景并设定时区
root.NewScenario('open_STK');
root.UnitPreferences.Item('DateFormat').SetCurrentUnit('UTCG');
root.CurrentScenario.SetTimePeriod('1 Jul 2013 12:00:00.000', '2 Jul 2013 12:00:00.000');
root.CurrentScenario.AnalysisEpoch.SetExplicitTime('1 Jul 2013 12:00:00.000');
现在就打开了一个带有2D和3D视图的默认STK窗口:
限于篇幅,这里先介绍如何使用MATLAB启动STK窗口,下一节将详细讲述使用MATLAB自动化配置STK仿真场景以及将自动化脚本使用MATLAB S 函数封装成simulink模块。
随软件安装的STK帮助文档中关于STK MATLAB OLE自动化的代码示例在:
就我的理解,自动化不是说完全解放双手,实现不用点一次鼠标就操控软件,而是应该针对以下几种情形进行自动化:
(1)重复性操作:比如STK进行航空仿真时飞机轨迹点的输入就是重复操作。
(2)触发时机不确定的操作:有些操作的触发时机是不确定,比如当雷达扫描到目标后报告目标方位,但是人不可能一直盯着仿真界面;有些操作需要满足一定条件才能触发,比如飞机发射导弹,这时候不可能通过图形界面来触发导弹发射。
(3)实时性操作:很多时候仿真是实时进行的,仿真数据不是预先给定的,这时候不可能通过图形化界面设置达到目的。
(4)操作由外部信号触发:仿真时操作的触发由外部给定信号,这时候就必须使用自动化程序才能达到目的。
简而言之,自动化的目的应该是:使用程序操作软件完成使用图形界面不能完成或者完成起来很繁琐的工作。对于一些一次性的,或者变化很频繁的操作,使用自动化反而会弄巧成拙,增加工作量。