STK12与Python联合仿真(二):简单的例程

  • Post author:
  • Post category:python




创建场景

本文参考官网教程

help


上回书说到两种创建场景的方式,其实都比较繁琐,Python可以直接启动并且调用程序,首先打开Jupyter notebook

还是常规的import

from agi.stk12.stkdesktop import STKDesktop
from agi.stk12.stkobjects import *
from agi.stk12.stkutil import *
from agi.stk12.vgt import *
import os

然后下面的代码是调用启动STK的,运行后就可以看到STK启动了,但这个时候没有创建场景,所以是空的

# STK_PID = 40556 
# stk = STKDesktop.AttachToApplication(pid=int(STK_PID))
stk = STKDesktop.StartApplication(visible=True) #using optional visible argument
root = stk.Root
print(type(root))

在这里插入图片描述

接下来创建场景

scenario  = root.NewScenario('MyNewSc')  # 新建场景

然后STK这边就自动创建场景了

在这里插入图片描述



设置场景时间

scenario.SetTimePeriod('Today','+24hr') # 开始日期是今天,结束日期是24小时后
# scenario.SetTimePeriod('Today','+160min') # 结束日期是160分钟后
# scenario.SetTimePeriod('Today','+1600sec') # 结束日期是1600秒后
root.Rewind() # 执行后STK会重置时间轴

另一种日期格式

这样可以设定自己想要的日期区间

scenario.SetTimePeriod("1 Nov 2000 01:02:00.00","1 Nov 2000 03:04:00.00")



“日” “月” “年” 时:分:秒

可以显示当前场景的起止日期

print(scenario.StartTime)
print(scenario.StopTime)



创建一些小组件

target = AgTarget(scenario.Children.New(AgESTKObjectType.eTarget,"GroundTarget")) # 地面站
target.Position.AssignGeodetic(50,-100,0) # 地面站位置

这个target.Position.AssignGeodetic方法,第一个参数是lat纬度,范围是[-90,90],第二个是lon经度,范围是[-180,180]第三个是高度(海拔),可以为浮点数

比如上海的经纬度是(12148,31.25)

代码就是

target.Position.AssignGeodetic(31.25,121.48,0)

地图上对应上海的点

在这里插入图片描述

然后… 找了半天没找到怎么删除一个目标,先接着往后写吧…

可以添加一颗卫星,并指定卫星的参数

这里是经典的二体运动模型(第一参数)

卫星运行时间与场景起始时间一致(第二第三参数)

使用60 ICRF 坐标系(第四参数)

卫星的六根数(第五参数)

satellite = AgSatellite(root.CurrentScenario.Children.New(AgESTKObjectType.eSatellite,"LeoSat"))
root.ExecuteCommand('SetState */Satellite/LeoSat Classical TwoBody "' + 
                    str(scenario.StartTime) + '" "' + str(scenario.StopTime) + 
                    '" 60 ICRF "' + str(scenario.StartTime) + '" 7200000.0 0.0 90 0.0 0.0 0.0');
# 依次是 轨道高度 偏心率 倾角  近地点幅角度 升交点赤经 平近点角



计算访问access

access = satellite.GetAccessToObject(target) # 表示创建的satellite访问target 
access.ComputeAccess(); # 计算访问
accessDP = access.DataProviders.Item('Access Data')
results = accessDP.Exec(scenario.StartTime, scenario.StopTime)
accessStartTimes = results.DataSets.GetDataSetByName('Start Time').GetValues()
accessStopTimes = results.DataSets.GetDataSetByName('Stop Time').GetValues()
print(accessStartTimes,accessStopTimes)

或者以更直观的形式,会计算出在仿真时间内,卫星访问地面的次数,起止时间

access = satellite.GetAccessToObject(target)
accessIntervals = access.ComputedAccessIntervalTimes
dataProviderElements = ['Start Time', 'Stop Time']
for i in range(0,accessIntervals.Count):
    times = accessIntervals.GetInterval(i)
    print(times)

在这里插入图片描述

然后,STK就会仿真访问的的有效路径

在这里插入图片描述



卫星的LLA(地理坐标状态)

satelliteDP = satellite.DataProviders.Item('LLA State')
satelliteDP2 = satelliteDP.Group.Item('Fixed')
rptElements = ['Time', 'Lat', 'Lon', 'Alt']
satelliteDPTimeVar = satelliteDP2.ExecElements(accessStartTimes[0],accessStopTimes[0], 30, rptElements) # 30 表示每间隔
satelliteAltitude = satelliteDPTimeVar.DataSets.GetDataSetByName('Alt').GetValues()
print(satelliteAltitude)

satelliteDP2.ExecElements 这个函数的第一个参数是你要采集的哪一段访问时间的开始,第二参数是访问时间的结束,然后第三个参数“30“ 表示间隔多久采集一次,30表示每30秒采集一次,最后的rptElements表示要获取的参数

那么satelliteDPTimeVar.DataSets.GetDataSetByName这个里面的就表示你要采集的数据

下面展示以30s为间隔的采集效果

今天就写到这吧,别忘了保存工程呀



版权声明:本文为qq_42635142原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。