• STK12与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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后下面的代码是调用启动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))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    接下来创建场景

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

    然后STK这边就自动创建场景了
    在这里插入图片描述

    设置场景时间

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

    另一种日期格式
    这样可以设定自己想要的日期区间

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


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

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

    print(scenario.StartTime)
    print(scenario.StopTime)
    
    • 1
    • 2

    创建一些小组件

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

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

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

    地图上对应上海的点
    在这里插入图片描述
    然后… 找了半天没找到怎么删除一个目标,先接着往后写吧…

    可以添加一颗卫星,并指定卫星的参数
    这里是经典的二体运动模型(第一参数)
    卫星运行时间与场景起始时间一致(第二第三参数)
    使用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');
    # 依次是 轨道高度 偏心率 倾角  近地点幅角度 升交点赤经 平近点角
    
    • 1
    • 2
    • 3
    • 4
    • 5

    计算访问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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    然后,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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    satelliteDP2.ExecElements 这个函数的第一个参数是你要采集的哪一段访问时间的开始,第二参数是访问时间的结束,然后第三个参数“30“ 表示间隔多久采集一次,30表示每30秒采集一次,最后的rptElements表示要获取的参数
    那么satelliteDPTimeVar.DataSets.GetDataSetByName这个里面的就表示你要采集的数据
    下面展示以30s为间隔的采集效果

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

  • 相关阅读:
    OpenAiSubscriber
    vue 导入、导出模块的几种方式
    Day 00 python基础认识与软件安装
    Java多线程-CountDownLatch、Semaphone、CyclicBarrier入门
    JS Mock开发
    南方电网的能源棋局上,蔚来换电扮演什么角色?
    有限元求解:结构应力法如何实现的网格不敏感呢?
    【JDK】如何实现jdk1.8与jdk11环境的相互切换
    如何设计元宇宙展厅,元宇宙展厅的展示和交互形式有哪些?
    CVE-2023-32315:Openfire管理控制台身份验证绕过到RCE的复现
  • 原文地址:https://blog.csdn.net/qq_42635142/article/details/126690380