Python 调用STK 获取所有可见性

记得先跑通:Python如何调用STK接口编程-CSDN博客

STK场景调用模块:

import win32com

from win32com.client import GetActiveObject
import comtypes
from comtypes.client import CreateObject
from comtypes.gen import STKUtil
from comtypes.gen import STKObjects
from comtypes.gen import AgSTKGraphicsLib
from comtypes.gen import AgSTKVgtLib
from comtypes.gen import AgUiApplicationLib
from comtypes.gen import AgUiCoreLib
from comtypes.gen import stdole
from comtypes.gen import STKObjects

import time

SatelliteNumber = 18

class STKWindow:
    def __init__(self,flag=False):
        if flag==True:
            self.uiApplication = win32com.client.Dispatch('STK11.Application')
            self.uiApplication.Visible = True
            self.uiApplication = CreateObject('STK11.Application')
            self.uiApplication.Visible = True

            # Get our IAgStkObjectRoot interface
            self.root = self.uiApplication.Personality2
        elif flag==False:
            try:
                self.uiApplication=GetActiveObject('STK11.Application')
                self.root = self.uiApplication.Personality2
                self.sc=self.root.CurrentScenario
                self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
            except:
                print("no active STK or Scenario") 
        else:
            self.uiApplication = win32com.client.Dispatch('STK11.Application')
            self.uiApplication.Visible = True
            self.uiApplication = CreateObject('STK11.Application')
            self.uiApplication.Visible = True
            self.root = self.uiApplication.Personality2
            self.root.Load(flag)
            self.sc=self.root.CurrentScenario
            self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
            
    
    def newScenario(self,name,startTime,endTime):
        self.root.NewScenario(name)
        self.sc=self.root.CurrentScenario
        self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
        scIAg.SetTimePeriod(startTime,endTime)
        self.root.Rewind()

STK 场景中各种对象的编号:

# <!-- Member	Value	Description -->
number_eAdvCat = 0 #	AdvCAT.
number_eAircraft = 1 #	Aircraft.
number_eAreaTarget = 2 #	Area Target.
number_eAttitudeCoverage = 3 #	Attitude Coverage.
number_eChain = 4 #	Chain.
number_eCommSystem = 5 #	CommSystem.
number_eConstellation = 6 #	Constellation.
number_eCoverageDefinition = 7 #	Coverage Definition.
number_eFacility = 8 #	Facility.
number_eGroundVehicle = 9 #	Ground Vehicle.
number_eLaunchVehicle = 10 #	Launch Vehicle.
number_eLineTarget = 11 #	Line Target.
number_eMTO = 12 #	MTO (Multi-Track Object).
number_eMissile = 13 #	Missile.
number_eMissileSystem = 14 #	Missile System.
number_ePlanet = 15 #	Planet.
number_eRadar = 16 #	Radar.
number_eReceiver = 17 #	Receiver.
number_eSatellite = 18 #	Satellite.
number_eScenario = 19 #	Scenario.
number_eSensor = 20 #	Sensor.
number_eShip = 21 #	Ship.
number_eStar = 22 #	Star.
number_eTarget = 23 #	Target.
number_eTransmitter = 24 #	Transmitter.
number_eFigureOfMerit = 25 #	Figure of Merit.
number_eRoot = 26 #	Root.
number_eAccess = 27 #	Access.
number_eObjectCoverage = 28 #	Coverage.
number_eAttitudeFigureOfMerit = 29 #	Attitude Figure of Merit.
number_eAntenna = 31 #	Antenna.
number_ePlace = 32 #	Place.
number_eVolumetric = 33 #	Volumetric

获取场景:

STKW = STKWindow('G:\AGI\STK Files\test.sc')

可见性函数和相关辅助模块:

def get_default_time_ticks():
    time_str = STKW.scIAg.StartTime
    ticks = time.mktime(time.strptime(time_str[:-4],"%d %b %Y %H:%M:%S"))
    return int(ticks)
default_time_ticks = get_default_time_ticks()


def addAccess(Monitor,Monitored):
    Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)
    Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)
    access = Monitor.GetAccessToObject(Monitored)
    access.SpecifyAccessTimePeriod(STKW.scIAg.StartTime, add_on_date(STKW.scIAg.StartTime, 7))
    access.ComputeAccess()
    results = access.ComputedAccessIntervalTimes
    if results.Count > 0:
        results = results.ToArray(0,results.Count)
    else:
        results = []
    return results


def time_convert(time_str):
    ticks = time.mktime(time.strptime(time_str[:-4],"%d %b %Y %H:%M:%S"))
#     print (from_time[:], time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks)), end = ' ~ ')
    return int(ticks - default_time_ticks)


def time_convert_reverse(ticks):
    time_str = time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks))
#     print (from_time[:], time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks)), end = ' ~ ')
    return time_str


def add_on_date(time_str, days = 7):
    ticks = time_convert(time_str) + default_time_ticks
    ticks += days*24*3600
    return time_convert_reverse(ticks)

获取所有对象:

number_all_elements = 0
elementName_to_idx = {}
f_log = open("log.txt", mode="w", encoding="utf-8")
f_contact = open("contact_graph.csv", mode="w", encoding="utf-8")
print('src,des,period_start,period_end,rate,owlt', file = f_contact)

sats = STKW.sc.Children.GetElements(number_eSatellite)
places = STKW.sc.Children.GetElements(number_ePlace)
targets = STKW.sc.Children.GetElements(number_eTarget)
facilities = STKW.sc.Children.GetElements(number_eFacility)

sats_P = sats
sats = []
Exclude_sats = ['Not_need_to_add_access']
for sat in sats_P:
    if sat.InstanceName not in Exclude_sats:
        sats.append(sat)

for target in targets:
    if target.InstanceName not in elementName_to_idx:
        number_all_elements += 1
        elementName_to_idx[target.InstanceName] = number_all_elements
for place in places:
    if place.InstanceName not in elementName_to_idx:
        number_all_elements += 1
        elementName_to_idx[place.InstanceName] = number_all_elements
for facility in facilities:
    if facility.InstanceName not in elementName_to_idx:
        number_all_elements += 1
        elementName_to_idx[facility.InstanceName] = number_all_elements
for sat in sats:
    if sat.InstanceName not in elementName_to_idx:
        number_all_elements += 1
        elementName_to_idx[sat.InstanceName] = number_all_elements

获取所有可见性:

used_sats = set()
for sat1 in sats:
    used_sats.add(sat1.InstanceName)
    for sat2 in sats:
#         number_sat1 = int(sat1.InstanceName[-2:])
#         number_sat2 = int(sat2.InstanceName[-2:])
#         if number_sat1 < number_sat2:
        if sat2.InstanceName not in used_sats:
            accessTimes = addAccess(sat1, sat2)
            for accessTime in accessTimes:
                time_tick_0 = time_convert(accessTime[0])
                time_tick_1 = time_convert(accessTime[1])
                if time_tick_0 + 30 >= time_tick_1:
                    continue
                print(sat1.InstanceName, sat2.InstanceName, elementName_to_idx[sat1.InstanceName],\
                  elementName_to_idx[sat2.InstanceName], ':', end = ' ', file = f_log)
                print(time_tick_0, time_tick_1, file = f_log)
                out_data = str(elementName_to_idx[sat1.InstanceName]) + ',' +\
                            str(elementName_to_idx[sat2.InstanceName]) + ',' +\
                            str(time_tick_0) + ','+ str(time_tick_1) +\
                            ',1,1'
                print(accessTime[0], accessTime[1])
                print(out_data, file = f_contact)

for place in places:
    for sat in sats:
        accessTimes = addAccess(place, sat)
        for accessTime in accessTimes:
            time_tick_0 = time_convert(accessTime[0])
            time_tick_1 = time_convert(accessTime[1])
            if time_tick_0 + 30 >= time_tick_1:
                continue
            print(place.InstanceName, sat.InstanceName, elementName_to_idx[place.InstanceName],\
                  elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
            print(time_tick_0, time_tick_1, file = f_log)
            out_data = str(elementName_to_idx[place.InstanceName]) + ',' +\
                        str(elementName_to_idx[sat.InstanceName]) + ',' +\
                        str(time_tick_0) + ',' + str(time_tick_1) +\
                        ',1,1'
            print(out_data, file = f_contact)
            

for facility in facilities:
    for sat in sats:
        acces_from = facility
        accessTimes = addAccess(acces_from, sat)
        for accessTime in accessTimes:
            time_tick_0 = time_convert(accessTime[0])
            time_tick_1 = time_convert(accessTime[1])
            if time_tick_0 + 30 >= time_tick_1:
                continue
            print(acces_from.InstanceName, sat.InstanceName, \
                  elementName_to_idx[acces_from.InstanceName],\
                  elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
            print(time_tick_0, time_tick_1, file = f_log)
            out_data = str(elementName_to_idx[acces_from.InstanceName]) + ',' +\
                        str(elementName_to_idx[sat.InstanceName]) + ',' +\
                        str(time_tick_0) + ',' + str(time_tick_1) +\
                        ',1,1'
            print(out_data, file = f_contact)
            
for target in targets:
    for sat in sats:
        accessTimes = addAccess(target, sat)
        for accessTime in accessTimes:
            time_tick_0 = time_convert(accessTime[0])
            time_tick_1 = time_convert(accessTime[1])
            if time_tick_0 + 30 >= time_tick_1:
                continue
            print(target.InstanceName, sat.InstanceName, elementName_to_idx[target.InstanceName],\
                  elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
            print(time_tick_0, time_tick_1, file = f_log)
            out_data = str(elementName_to_idx[target.InstanceName]) + ',' +\
                        str(elementName_to_idx[sat.InstanceName]) + ',' +\
                        str(time_tick_0) + ',' + str(time_tick_1) +\
                        ',1,1'
            print(out_data, file = f_contact)

f_log.close()
f_contact.close()

查询编号和名称的对应关系:


idx_to_elementName = {}
for key in elementName_to_idx:
    idx_to_elementName[elementName_to_idx[key]] = key
for key in idx_to_elementName:
    print(key, idx_to_elementName[key])

结果:

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 MATLAB 程序,用于调用 STK 的 API 计算卫星之间的可见矩阵。在此之前,确保已经安装了 STK 并且具有有效的许可证。 ```matlab % 导入 STK 的 API import java.net.*; import java.io.*; import java.lang.*; import com.agi.stk.*; % 创建 STK 应用程序对象 stkObjectRoot = javaObject('AgStkObjectRoot'); % 打开 STK 场景文件 scenarioPath = 'C:\STK_Scenario_File.sc'; stkObjectRoot.loadScenario(scenarioPath); % 获取卫星对象 satellite1 = stkObjectRoot.GetObjectFromPath('Satellite/Satellite1'); satellite2 = stkObjectRoot.GetObjectFromPath('Satellite/Satellite2'); % 获取场景起止时间 startTime = stkObjectRoot.StartTime; stopTime = stkObjectRoot.StopTime; % 定义时间间隔 interval = 60; % 单位:秒 % 计算时间步数 numSteps = floor((stopTime - startTime) / interval); % 创建可见计算对象 access = satellite1.GetAccessToObject(satellite2); % 计算可见矩阵 startTimes = zeros(numSteps, 1); stopTimes = zeros(numSteps, 1); accessResults = zeros(numSteps, 1); for i = 1:numSteps % 计算时间范围 startTimes(i) = startTime + (i - 1) * interval; stopTimes(i) = startTime + i * interval; % 计算可见 access.ComputeAccess(startTimes(i), stopTimes(i)); accessResults(i) = access.IsConnected; end % 输出可见矩阵 visibilityMatrix = reshape(accessResults, [], numSteps)'; disp(visibilityMatrix); % 关闭 STK 应用程序对象 stkObjectRoot.closeScenario(); stkObjectRoot.release(); ``` 此代码将打开 STK 场景文件并获取两个卫星对象。然后,它将计算场景起止时间内每个时间步长中的可见,并将结果存储在一个矩阵中。最后,它将关闭 STK 应用程序对象。 请注意,此代码仅用于演示目的,并且可能需要根据您的具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值