1. 场景设置
1.1 显示STK窗口界面
%打开一个STK应用实例
uiapp = actxserver('STK10.application');
%获取STK用户界面
root = uiapp.Personality2;
%显示界面
uiapp.visible = 1;
需要注意是创建uiapp的STK版本号要和本机安装的版本号一致,我这里安装的是STK10。
注:下面代码中出现的root变量均为本段代码中的root。
注意
(1)如果需要打开多个STK窗口(每个窗口为一个STK实例),为了防止STK窗口之间相互影响,需要进行隔离,具体做法是:
root.Isolate();
这是因为MATLAB和STK交互是直接与STK引擎交互,而窗口中的数据又是从引擎中读取的。
(2)运行MATLAB自动化代码时STK窗口要保持打开。
1.2 加载场景
(1)创建一个新场景
创建一个名为STK Automation的场景:
% 创建一个新场景
root.NewScenario('STK Automation');
(2)加载一个已有场景
root.LoadScenario('D:\Users\Desktop\AirSimualtion.sc');
1.3 设置场景中物理量单位
场景包含的物理量的单位和可选值可以在对象浏览器中右键单击场景打开其属性窗口查看:
设置单位的自动化代码示例:
设置时间日期单位
root.UnitPreferences.Item('DateFormat').SetCurrentUnit('UTCG');
设置距离单位
root.UnitPreferences.Item('Distance').SetCurrentUnit('m');
其他单位照着场景属性窗口中的单位列表设置就行。
注意
在MATLAB命令行设置单位后,打开STK中的场景属性窗口,发现界面中的单位没有设定为我们选定的那个值,这是因为使用MATLAB命令行自动化时,是直接与STK引擎交互的,不是操作UI组件,打开属性窗口时,窗口在初始化时会采用默认值,因此我们并没有看到单位自动选中为我们设定的值。例如更改单位为m:
root.UnitPreferences.Item('Distance').SetCurrentUnit('m');
打开属性窗口查看单位发现依然是默认值km:
使用命令行获取单位:
distance = root.UnitPreferences.GetCurrentUnitAbbrv("DistanceUnit");
输出:
可以发现单位格式设置实际上已经生效。
1.4 设置场景的仿真时间区间
打开一个STK窗口,并创建一个时间日期格式为UTCG的场景:
%设置时间日期格式为UTCG
root.UnitPreferences.Item('DateFormat').SetCurrentUnit('UTCG');
%设置仿真时间区间
root.CurrentScenario.SetTimePeriod('1 Jul 2013 12:00:00.000', '2 Jul 2013 12:00:00.000');
打开场景属性窗口,会发现时间区间跟着改变。
注意
必须先设置时间日期格式然后再设置时间区间,如果时间日期格式与设定的时间区间初末时刻值格式不匹配则会报错。
1.5 仿真时间更新设置
(1)设置时间更新类型
STK中仿真时间更新方式有三种:Time Step、RealTime和X RealTime。Time step以固定的时间步长更新仿真时钟,RealTime以当前运行STK的电脑时钟速率更新仿真时钟,X RealTime以运行STK电脑时钟速率的X倍更新仿真时钟。在场景属性窗口中可以查看当前选定的时间更新模式:
使用MATLAB设置时间更新类型为固定步长:
root.CurrentScenario.Animation.set('AnimStepType','eScTimeStep');
AnimStepType可选值有:
(2)设置时间步长
仿真时间步长可以在视图的左下角看到
可以看见当前时间步长为100s,使用MATLAB设置时间步长:
root.CurrentScenario.Animation.AnimStepValue=50
现在步长变成50s:
2. 模型设置
2.1 飞机模型显示
(1)在场景中插入飞机
aircraft = root.CurrentScenario.Children.New('eAircraft', 'MyAircraft');
现在就往当前创建的场景中添加了一个飞机,默认飞机路径预报模型为GreatArc,还需要设置至少两个轨迹点才能在视图上显示飞机模型。
设置完后模型就显示出来了,现在显示的是默认飞机模型。
(2)控制飞机模型可见性
使用MATLAB控制飞机模型的可见性代码为:
% 设置为1可见,设置为0不可见
aircraft.Graphics.IsObjectGraphicsVisible=1;
2.2 查看飞机的属性
下面是一些仿真中常用属性的查看方法:
(1)查看路径点预报模型
aircraft.RouteType
输出:
(2)飞机的三维模型
aircraft.VO.Model.ModelData.get()
输出:
(3)路径点信息
路径点个数
aircraft.Route.Waypoints.Count()
导出所有路径点到MATLAB工作区:
aircraft.Route.Waypoints.ToArray()
2.3 设置飞机三维模型文件
设置飞机的三维文件有两种方法:
(1)通过设置文件名设定
三维模型的文件名不是任意字符串,而是在STK安装目录中的相对路径,一般STK将预置3D飞机模型保存在安装目录的STKData\VO\Models\Air目录中,因此使用文件名设置飞机三维模型的方法是:
aircraft.VO.Model.ModelData
.set('Filename','STKData\VO\Models\Air\b-52_stratofortress.mdl')
运行这个MATLAB命令可以发现模型从默认飞机设置为B52轰炸机:
(2)通过绝对路径设置
aircraft.VO.Model.ModelData
.set('FileName',
'C:\Program Files (x86)\AGI\STK 10\STKData\VO\Models\Air\f-22a_raptor.mdl')
现在飞机的三维模型变为F22a了:
3. 路径点设定
3.1 设置路径点预报模型
飞机的路径点预报模型有
常用的就是GreatArc和RealTime,使用MATLAB设置路径点预报模型:
%RealTime路径点预报模型
aircraft.SetRouteType('ePropagatorRealtime');
%GreatArc路径点预报模型
aircraft.SetRouteType('ePropagatorGreatArc');
注意
在MATLAB命令行中设置路径点预报模型为RealTime,打开飞机属性窗口发现其仍然为GreatArc,但是运行查看路径点预报模型命令:
aircraft.RouteType
会发现更改已经生效,这是因为MATLAB是直接和STK引擎交互, 不是和窗口交互,打开属性窗口时,会自动选中为默认值。要想更新路径,需要这样:
%设置飞机的路径预报模型为实时
aircraft.SetRouteType('ePropagatorRealtime');
aircraft.Route.Propagate;
3.2 路径预报模型为GreatArc时添加轨迹点
(1)添加单个轨迹点
% IAgAircraft aircraft: Aircraft object
% Set route to great arc, method and altitude reference
%路径点预测模型
aircraft.SetRouteType('ePropagatorGreatArc');
%获取飞机的路径对象
route = aircraft.Route;
%路径生成方法,这里设置的是根据速度确定中间点的加速度和时刻
route.Method = 'eDetermineTimeAccFromVel';
% 高度参考系
route.SetAltitudeRefType('eWayPtAltRefMSL');
% 添加第一个轨迹点
waypoint = route.Waypoints.Add();
waypoint.Latitude = 37.5378;
waypoint.Longitude = 14.2207;
waypoint.Altitude = 5; % km
waypoint.Speed = .1; % km/sec
% 添加第二个轨迹点
waypoint2 = route.Waypoints.Add();
waypoint2.Latitude = 47.2602;
waypoint2.Longitude = 30.5517;
waypoint2.Altitude = 5; % km
waypoint2.Speed = .1; % km/sec
%保存轨迹点
route.Propagate;
代码中aircraft就是上面插入的飞机模型。 运行代码可以看到轨迹设置已经生效:
(2) 添加多个路径点
% IAgAircraft aircraft: Aircraft object
route = aircraft.Route;
ptsArray = {37.5378,14.2207,5000,20,5;
47.2602,30.5517,5000,20,5;
47.2602,30.5517,5000,20,5;
37.5378,14.2207,5000,20,5;};
route.SetPointsSmoothRateAndPropagate(ptsArray);
%Propagate the route
route.Propagate;
(3) 注意事项
(1)设置多个路径点时,必须传入2个或以上的点,否则将会清空之前存在的所有路径点。这意味着ptsArray至少是2维数组。
(2)路径点设置时会自动去重,相同点只会设置一次。
(3)设置飞机路径点时,STK的单位设置要和输入的数据点单位一致,否则会自动进行单位转换。
4.使用MATLAB控制仿真
4.1 控制仿真运行
使用一个简单的for 循环就可以实现用MATLAB控制仿真进程:
for i=1:100000
root.StepForward;
end
在MATLAB中运行这个脚本,STK就会以设定好的时钟步长更新场景,暂停运行这个脚本,STK也会暂停仿真。
4.2 暂停仿真
root.Pause
4.3 重置视图
root.Rewind
4.4 回退一步
root.StepBackward
4.5 正、负时钟仿真
正时钟仿真按时间增加的方向更新场景:
root.PlayForward
负时钟仿真按时间减少的方向更新场景:
root.PlayBackward