STK MATLAB联合仿真(一)STK与MATLAB的连接(COM与Connector)
一、前言
最近在项目研究过程中,使用了MATLAB与STK进行航空的联合仿真,其中遇到了不少问题,查阅CSDN时发现现有的STK相关资料普遍针对较老的STK和MATLAB版本,稍显落后。因此,我将自己在项目过程中遇到的一些问题和解决方案分享出来,供大家学习参考使用。受限于本人水平,难免存在纰漏之处,鼓励大家共同讨论修改,在此感谢各位支持。
二、通过STK MATLAB Connector进行连接
2.1 STK MATLAB Connector的安装
STK与MATLAB的连接存在版本对应问题,具体版本可以参照下表,本人使用STK 12.2和MATLAB R2020b。
在STK安装完成后,如果在安装选项界面选择了STK MATLAB Connector,那么就会自动安装上表中STK版本对应的STK MATLAB Connector。否则需要手动进行安装,步骤如下:
- 下载对应版本的STK MATLAB Connector安装包,解压后找到文件夹中的setup.exe。
- 运行setup.exe,出现如下界面,一路确定即可。
2.2 验证连接是否正常
- connector安装完成后,打开STK,找到Edit->Preferences。
- 找到MATLAB一栏,正常安装成功后,在Connectable Version和Versions with installed Connectors中应当会出现本地可连接的MATLAB版本,此方法在过去配置MATLAB R2018b和STK11.6的过程中很成功。
但不幸的是,在更换了更高版本的STK和MATLAB后,由于STK MATLAB Connector安装包的潜在问题,无法实现STK12.2与MATLAB R2020b的连接,感兴趣的同学可以尝试更换低版本的MATLAB进行配置。
三、通过COM进行连接
3.1 COM简介
COM(Component Object Model)是微软公司提出的一种组件技术,它定义了对象在单个应用程序内部或多个应用程序之间的行为方式。
COM客户端是任何代码或对象获取指向COM 服务器的指针,并通过调用其接口的方法来使用其服务。COM服务器是向客户端提供服务的任何对象;这些服务采用COM接口实现的形式,可由任何能够获取指向服务器对象上某个接口的指针的客户端调用。
有两种主要类型的服务器, 即进程内服务器和进程外服务器。 进程内服务器在动态链接库(DLL)中实现,进程外服务器在可执行文件(EXE)中实现。进程外服务器可以驻留在本地计算机或远程计算机上。此外,COM还提供一种机制,允许进程内服务器(DLL)在代理项 EXE 进程中运行,从而获得能够在远程计算机上运行进程的优势。
3.2 MATLAB中COM的介绍
MATLAB中的COM文档非常详细,主要包括函数的使用和对象的属性、成员函数两大部分。STK与MATLAB的连接主要使用两个函数,分别是actxserver和actxGetRunningServer。
函数
函数名 | 功能 |
---|---|
actxserver | 创建 COM 服务器 |
actxGetRunningServer | 自动化服务器的运行实例的句柄 |
methodsview | 查看类方法 |
eventlisteners | 列出与 COM 对象事件关联的事件处理程序函数 |
registerevent | 在运行时关联 COM 对象事件的事件处理程序 |
unregisterallevents | 注销与 COM 对象事件关联的所有事件处理程序 |
unregisterevent | 在运行时注销与 COM 对象事件关联的事件处理程序 |
iscom | 确定输入是否为 COM 对象 |
isevent | 确定输入是否为 COM 对象事件 |
isinterface | 确定输入是否为 COM 接口 |
对象
名称 | 功能 |
---|---|
COM | 从 MATLAB 访问 COM 组件 |
3.3 建立STK和MATLAB的连接
- 启动MATLAB
- 如果STK正在运行,在MATLAB中使用如下命令连接STK:
uiApplication = actxGetRunningServer('STK.Application');
-
运行后工作区会增加名为uiApplication的变量。
-
如果STK尚未运行,在MATLAB中使用如下命令启动并连接STK,运行后除增加上述变量以外,还会打开一个STK窗口。
uiApplication = actxserver("STK.Application");
uiApplication.Visible = true;
- 获取对象
root = uiApplication.personality2;
- 如果不需要STK界面或者为了节约计算资源,可以使用如下命令创建STK/Engine。
engine = actxserver('STKX12.application');
engine.NoGraphics = 1;
root = actxserver('AgStkObjects12.AgStkObjectRoot');
clear engine root
- 关闭STK
uiApplication.Quit;
clear uiApplication root
3.4 使用STK和MATLAB的连接
下列示例使用MATLAB调用STK命令来创建名为“MATLABTest”的场景,并添加名为“AGI_HQ”的设施,设置其位置为(40.0386, -75.5966, 0.0)。
root.ExecuteCommand('New / Scenario MATLABTest');
root.ExecuteCommand('New / */Facility AGI_HQ');
root.ExecuteCommand('SetPosition */Facility/AGI_HQ Geodetic 40.0386 -75.5966 0.0');
3.5 使用STK对象模型
下列示例使用MATLAB调用STK对象的方法来实现与3.5中相同的功能。
root.NewScenario('MATLABTest');
agi_HQ = root.CurrentScenario.Children.New('eFacility','AGI_HQ');
agi_HQ.Position.AssignGeodetic(40.0386, -75.5966, 0.0);
四、总结
在与同学交流的过程中,发现AGI官方提供的STK MATLAB Connector常常出现玄学bug,而且由于该软件的禁售,导致更高版本的Connector难以获得,因此无论是AGI官方还是我本人,都比较推荐使用COM的方法来进行STK与MATLAB的连接。
五、参考资料
- AGI官方的COM连接方法:https://help.agi.com/stk/index.htm#MATLAB_COM.htm?TocPath=Integrating%2520with%2520STK%257CMATLAB%2520Interface%257C_____2
- AGI官方的Connector连接方法:https://help.agi.com/stk/index.htm#install/MATLABsetup.htm
- 微软官方的COM介绍:https://learn.microsoft.com/zh-cn/windows/win32/com/the-component-object-model
- MathWorks官方COM文档:https://ww2.mathworks.cn/help/matlab/ref/com.html?searchHighlight=COM&s_tid=srchtitle_COM_2