Python 调用STK接口的常用操作

Python如何调用STK接口编程-CSDN博客这里说的一样,STK Help文档里面其实有讲,但也有不少坑。所以这边整理了一些对Satellite, Target, Aircraft等对象的基本操作:

生成STK场景:

python 复制代码
import pymysql
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

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()
        return self.sc

def connect(sql):
    conn = pymysql.connect(host="127.0.0.1",user ="root", passwd ="123456", db = "task scheduling", port=3306,charset = 'utf8')
    cur =conn.cursor() 
    cur.execute(sql)
    if sql.strip()[:6].upper()=='SELECT':
        res=cur.fetchall()
    else:
        coon.commit()
        res='ok'
    cur.close()
    conn.close()
    return res

Spacecraft:

python 复制代码
class Spacecraft:
    def __init__(self,name,Type='',Time='1 Jan 2020 00:00:00.000',revolve=10,inclination=0,RAAN=0,argumentOfPerigee=0,eccentricity=0,MeanAnomaly=0):
        self.name=name
        self.Type=Type
        self.Time=Time
        self.revolve=revolve
        self.inclination=inclination
        self.RAAN=RAAN
        self.argumentOfPerigee=argumentOfPerigee
        self.eccentricity=eccentricity
        self.MeanAnomaly=MeanAnomaly
        self.uniqueNumber=18
        self.cmds=[]
        self.cmds.append('New / */Satellite %s' %name)
        self.cmds.append('New / */Satellite %s' %name)
        
    def queryFromSecenario(self,sc):
        try:
            sats=sc.Children.GetElements(self.uniqueNumber)
            sat=sats.Item(self.name)
            return sat
        except:
            return None
    
    def deleteFromSecenario(self,sc):
        if self.queryFromSecenario(sc):
            sc.Children.Unload(self.uniqueNumber,self.name)
            return 'already deleted'
        else:
            return 'not exist'
        
    def addToScenario(self,root,sc):
        if self.queryFromSecenario(sc):
#             'can not add, this name already exists'
            return None
        sat=sc.Children.New(self.uniqueNumber, self.name) # eSatellite 
        satIAg= sat.QueryInterface(STKObjects.IAgSatellite)
        satIAg.PropagatorSupportedTypes
        satIAg.SetPropagatorType(STKObjects.ePropagatorJ4Perturbation)
        satProp = satIAg.Propagator
        satProp=satProp.QueryInterface(STKObjects.IAgVePropagatorJ4Perturbation)
        
        satProp.InitialState.Epoch=self.Time
        
        keplerian = satProp.InitialState.Representation.ConvertTo(STKUtil.eOrbitStateClassical)
        keplerian2 = keplerian.QueryInterface(STKObjects.IAgOrbitStateClassical)
        keplerian2.SizeShapeType =STKObjects.eSizeShapeMeanMotion
#         keplerian2.SizeShapeType =STKObjects.eSizeShapeSemimajorAxis
        keplerian2.LocationType = STKObjects.eLocationMeanAnomaly
        keplerian2.Orientation.AscNodeType = STKObjects.eAscNodeRAAN
        root.UnitPreferences.Item('AngleUnit').SetCurrentUnit('revs')
        root.UnitPreferences.Item('TimeUnit').SetCurrentUnit('day')
        root.UnitPreferences.Item('Distance').SetCurrentUnit('km')
        print(keplerian2.SizeShape)
        keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeMeanMotion).MeanMotion = self.revolve
        keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeMeanMotion).Eccentricity = self.eccentricity
#         keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).SemimajorAxis = self.SemimajorAxis
#         keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).Eccentricity = self.Eccentricity
        root.UnitPreferences.Item('AngleUnit').SetCurrentUnit('deg')
        root.UnitPreferences.Item('TimeUnit').SetCurrentUnit('sec')
        keplerian2.Orientation.Inclination = self.inclination
        keplerian2.Orientation.ArgOfPerigee = self.argumentOfPerigee
        keplerian2.Orientation.AscNode.QueryInterface(STKObjects.IAgOrientationAscNodeRAAN).Value = self.RAAN
        keplerian2.Location.QueryInterface(STKObjects.IAgClassicalLocationMeanAnomaly).Value = self.MeanAnomaly
        satProp.InitialState.Representation.Assign(keplerian)
        satProp.Propagate()
        self.sat=sat
        self.satIAg=satIAg
        return satIAg

Target:

python 复制代码
class Target:
    def __init__(self,name,Longitude=0,Latitude=0,Altitude=0):
        self.name=name
        self.Longitude=Longitude
        self.Latitude=Latitude
        self.Altitude=Altitude
        self.uniqueNumber=23
        
    def queryFromSecenario(self,sc):
        try:
            targets=sc.Children.GetElements(self.uniqueNumber)
            target=targets.Item(self.name)
            return target
        except:
            return None
        
    def deleteFromSecenario(self,sc):
        if self.queryFromSecenario(sc):
            sc.Children.Unload(self.uniqueNumber,self.name)
            return 'already deleted'
        else:
            return 'not exist'
    
    def addToScenario(self,sc):
        if self.queryFromSecenario(sc):
#             'can not add, this name already exists'
            return None
        target = sc.Children.New(self.uniqueNumber, self.name) 
        targetIAg = target.QueryInterface(STKObjects.IAgTarget)
        pos = targetIAg.Position
        pos.AssignGeodetic(self.Latitude,self.Longitude,self.Altitude)
        self.targetIAg=targetIAg
        self.target=target
        return targetIAg

Aircraft:

python 复制代码
class Aircraft:
    def __init__(self,name):
        self.name=name
        self.uniqueNumber=1
        
    def queryFromSecenario(self,sc):
        try:
            aircrafts=sc.Children.GetElements(self.uniqueNumber)
            aircraft=aircrafts.Item(self.name)
            return aircraft
        except:
            return None
        
    def deleteFromSecenario(self,sc):
        if self.queryFromSecenario(sc):
            sc.Children.Unload(self.uniqueNumber,self.name)
            return 'already deleted'
        else:
            return 'not exist'
    
    def addToScenario(self,sc):
        if self.queryFromSecenario(sc):
#             'can not add, this name already exists'
            return None
        aircraft = sc.Children.New(self.uniqueNumber, self.name) 
        aircraftIAg = aircraft.QueryInterface(STKObjects.IAgAircraft)
        self.aircraftIAg=aircraftIAg
        self.aircraft=aircraft
        return aircraftIAg
    
    def addWayPoints(self,points):
        self.aircraftIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
        route = self.aircraftIAg.Route
        route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
        route.Method=STKObjects.AgEVeWayPtCompMethod(0)
        
        try:
            for point in points:
                waypoint = route.Waypoints.Add()
                waypoint.Longitude = point[0]
                waypoint.Latitude = point[1]
                waypoint.Altitude = point[2]
                waypoint.Speed=point[3]

            route.Propagate()
            return 'add waypoints successfully'
        except:
            return 'add waypoints unsuccessfully'
    
    def removeWayPoints(self):
        self.aircraftIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
        route = self.aircraftIAg.Route
        route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
        route.Waypoints.RemoveAll()
            
        route.Propagate()

Ship:

python 复制代码
class Ship:
    def __init__(self,name):
        self.name=name
        self.uniqueNumber=21
        
    def queryFromSecenario(self,sc):
        try:
            ships=sc.Children.GetElements(self.uniqueNumber)
            ship=ships.Item(self.name)
            return ship
        except:
            return None
        
    def deleteFromSecenario(self,sc):
        if self.queryFromSecenario(sc):
            sc.Children.Unload(self.uniqueNumber,self.name)
            return 'already deleted'
        else:
            return 'not exist'
    
    def addToScenario(self,sc):
        if self.queryFromSecenario(sc):
#             'can not add, this name already exists'
            return None
        ship = sc.Children.New(self.uniqueNumber, self.name) 
        shipIAg = ship.QueryInterface(STKObjects.IAgShip)
        self.shipIAg=shipIAg
        self.ship=ship
        return shipIAg
    
    def addWayPoints(self,points):
        self.shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
        route = self.shipIAg.Route
        route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
        route.Method=STKObjects.AgEVeWayPtCompMethod(0)
        
        try:
            for point in points:
                waypoint = route.Waypoints.Add()
                waypoint.Longitude = point[0]
                waypoint.Latitude = point[1]
                waypoint.Altitude = point[2]
                waypoint.Speed=point[3]

            route.Propagate()
            return 'add waypoints successfully'
        except:
            return 'add waypoints unsuccessfully'
    
    def removeWayPoints(self):
        self.shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
        route = self.shipIAg.Route
        route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
        route.Waypoints.RemoveAll()
            
        route.Propagate()

获取可见性:

python 复制代码
def addAccess(Monitor,Monitored):
    Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)
    Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)
    access = Monitor.GetAccessToObject(Monitored)
    access.ComputeAccess()
    results = access.ComputedAccessIntervalTimes
    results=results.ToArray(0,results.Count)
    return results

使用示例:

python 复制代码
def addAccess(Monitor,Monitored):
    Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)
    Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)
    access = Monitor.GetAccessToObject(Monitored)
    access.ComputeAccess()
    results = access.ComputedAccessIntervalTimes
    results=results.ToArray(0,results.Count)
    return results

# open STK and creat Scenario
STKW=STKWindow('E:/AGI/STKFiles/test1/test1.sc')
sc=STKW.newScenario('test1',"1 Jan 2020 00:00:00.000 ","8 Jan 2020 00:00:00.000 ")


# select satellites from datebase
sql="select name,type,time,revolve,inclination,RAAN,argumentOfPerigee,eccentricity,MeanAnomaly from spacecraft"
sat=connect(sql)[0]
# (self,name,Type,Time,revolve=10,inclination=0,RAAN=0,argumentOfPerigee=0,eccentricity=0,MeanAnomaly=0):
sat=Spacecraft(sat[0],sat[1],sat[2],sat[3],sat[4],sat[5],sat[6],sat[7],sat[8])

sql='select name,Longitude,Latitude,Altitude from Target'
target=connect(sql)[0]
target=Target(target[0],target[1],target[2],target[3])


# new satellite and Target
addSat=sat.addToScenario(STKW.root,STKW.sc)
addTarget=target.addToScenario(STKW.sc)


# sat.deleteFromSecenario(STKW.sc)
# target.deleteFromSecenario(STKW.sc)


#add access
accessTimes=addAccess(sat.satIAg,target.targetIAg)
for accessTime in accessTimes:
    print(accessTime)
# sats = STKW.root.CurrentScenario.Children.GetElements(18)

# print(type(sats.Item('satellite1')),type(sat.satIAg))



aircraft=Aircraft('aircraft1')
aircraft.addToScenario(STKW.sc)

sql="select Longitude,Latitude,Altitude,Speed from aircraft"
waypoints=connect(sql)
aircraft.addWayPoints(waypoints)



ship=Ship('ship1')
ship.addToScenario(STKW.sc)

sql="select Longitude,Latitude,Altitude,Speed from ship"
waypoints=connect(sql)
for point in waypoints:
    print(point[0])
ship.addWayPoints(waypoints)


STKW.root.SaveAs('E:/AGI/STKFiles/test1/test1')



ship = sc.Children.New(21, 'ship1') 
shipIAg = ship.QueryInterface(STKObjects.IAgShip)
shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
route = shipIAg.Route
route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
route.Method=STKObjects.AgEVeWayPtCompMethod(0)

waypoint1 = route.Waypoints.Add()
waypoint1.Latitude = 39
waypoint1.Longitude = -79
waypoint1.Altitude = 10
waypoint1.Speed=0.001

waypoint2 = route.Waypoints.Add()
waypoint2.Latitude = 40
waypoint2.Longitude = -80
waypoint2.Altitude = 10
waypoint2.Speed=0.001

waypoint3 = route.Waypoints.Add()
waypoint3.Latitude = 41
waypoint3.Longitude = -81
waypoint3.Altitude = 10
waypoint3.Speed=0.001

route.Propagate()
相关推荐
吴佳浩12 小时前
Python入门指南(六) - 搭建你的第一个YOLO检测API
人工智能·后端·python
superman超哥13 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
Learner__Q13 小时前
每天五分钟:滑动窗口-LeetCode高频题解析_day3
python·算法·leetcode
————A13 小时前
强化学习----->轨迹、回报、折扣因子和回合
人工智能·python
徐先生 @_@|||14 小时前
(Wheel 格式) Python 的标准分发格式的生成规则规范
开发语言·python
Mqh18076214 小时前
day45 简单CNN
python
学习者00715 小时前
python 下载离线库方法
python
声声codeGrandMaster15 小时前
AI之模型提升
人工智能·pytorch·python·算法·ai
魔镜前的帅比15 小时前
多 Agent 架构:Coordinator + Worker 模式
python·ai
路长冬15 小时前
python基本语法
python