STK+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为间隔的采集效果
今天就写到这吧,别忘了保存工程呀