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()
相关推荐
10年前端老司机21 分钟前
Milvus 8种检索能力实践
数据库·python·agent
Sakura_j_h_1 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰1 小时前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境1 小时前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530142 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
hhcgchpspk2 小时前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事2 小时前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python
vipxieliang2 小时前
Python collections:高效容器与实战案例
后端·python
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
特创数字科技3 小时前
写了个 Windows 下载器:一键拉 GitHub / Gitee 源码,带 SHA256 校验
python·github