淘先锋技术网

首页 1 2 3 4 5 6 7

一、前言

最近在项目研究过程中,使用了MATLAB与STK进行航空的联合仿真,其中遇到了不少问题,查阅CSDN时发现现有的STK相关资料普遍针对较老的STK和MATLAB版本,稍显落后。因此,我将自己在项目过程中遇到的一些问题和解决方案分享出来,供大家学习参考使用。受限于本人水平,难免存在纰漏之处,鼓励大家共同讨论修改,在此感谢各位支持。

二、通过STK MATLAB Connector进行连接

2.1 STK MATLAB Connector的安装

STK与MATLAB的连接存在版本对应问题,具体版本可以参照下表,本人使用STK 12.2和MATLAB R2020b。
图1 AGI官网提供的MATLAB与STK对应版本需要的STK MATLAB Connector
在STK安装完成后,如果在安装选项界面选择了STK MATLAB Connector,那么就会自动安装上表中STK版本对应的STK MATLAB Connector。否则需要手动进行安装,步骤如下:

  • 下载对应版本的STK MATLAB Connector安装包,解压后找到文件夹中的setup.exe。
    Matlab_Connector安装包
  • 运行setup.exe,出现如下界面,一路确定即可。
    STK MATLAB Connector安装界面

2.2 验证连接是否正常

  • connector安装完成后,打开STK,找到Edit->Preferences。
    安装检查1
  • 找到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的变量。
    在这里插入图片描述

  • 如果STK尚未运行,在MATLAB中使用如下命令启动并连接STK,运行后除增加上述变量以外,还会打开一个STK窗口。

uiApplication = actxserver("STK.Application");
uiApplication.Visible = true;
  • 获取对象
  • 如果不需要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_HQ位置展示

四、总结

在与同学交流的过程中,发现AGI官方提供的STK MATLAB Connector常常出现玄学bug,而且由于该软件的禁售,导致更高版本的Connector难以获得,因此无论是AGI官方还是我本人,都比较推荐使用COM的方法来进行STK与MATLAB的连接。
AGI官方推荐使用COM而非Connector

五、参考资料

  1. AGI官方的COM连接方法:https://help.agi.com/stk/index.htm#MATLAB_COM.htm?TocPath=Integrating%2520with%2520STK%257CMATLAB%2520Interface%257C_____2
  2. AGI官方的Connector连接方法:https://help.agi.com/stk/index.htm#install/MATLABsetup.htm
  3. 微软官方的COM介绍:https://learn.microsoft.com/zh-cn/windows/win32/com/the-component-object-model
  4. MathWorks官方COM文档:https://ww2.mathworks.cn/help/matlab/ref/com.html?searchHighlight=COM&s_tid=srchtitle_COM_2