Python 调用STK接口的常用操作

2024-01-23 06:52

本文主要是介绍Python 调用STK接口的常用操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

生成STK场景:

import pymysql
import win32comfrom 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 STKObjectsclass STKWindow:def __init__(self,flag=False):if flag==True:self.uiApplication = win32com.client.Dispatch('STK11.Application')self.uiApplication.Visible = Trueself.uiApplication = CreateObject('STK11.Application')self.uiApplication.Visible = True# Get our IAgStkObjectRoot interfaceself.root = self.uiApplication.Personality2elif flag==False:try:self.uiApplication=GetActiveObject('STK11.Application')self.root = self.uiApplication.Personality2self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)except:print("no active STK or Scenario") else:self.uiApplication = win32com.client.Dispatch('STK11.Application')self.uiApplication.Visible = Trueself.uiApplication = CreateObject('STK11.Application')self.uiApplication.Visible = Trueself.root = self.uiApplication.Personality2self.root.Load(flag)self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)def newScenario(self,name,startTime,endTime):self.root.NewScenario(name)self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)scIAg.SetTimePeriod(startTime,endTime)self.root.Rewind()return self.scdef 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:

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=nameself.Type=Typeself.Time=Timeself.revolve=revolveself.inclination=inclinationself.RAAN=RAANself.argumentOfPerigee=argumentOfPerigeeself.eccentricity=eccentricityself.MeanAnomaly=MeanAnomalyself.uniqueNumber=18self.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 satexcept:return Nonedef 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 Nonesat=sc.Children.New(self.uniqueNumber, self.name) # eSatellite satIAg= sat.QueryInterface(STKObjects.IAgSatellite)satIAg.PropagatorSupportedTypessatIAg.SetPropagatorType(STKObjects.ePropagatorJ4Perturbation)satProp = satIAg.PropagatorsatProp=satProp.QueryInterface(STKObjects.IAgVePropagatorJ4Perturbation)satProp.InitialState.Epoch=self.Timekeplerian = satProp.InitialState.Representation.ConvertTo(STKUtil.eOrbitStateClassical)keplerian2 = keplerian.QueryInterface(STKObjects.IAgOrbitStateClassical)keplerian2.SizeShapeType =STKObjects.eSizeShapeMeanMotion
#         keplerian2.SizeShapeType =STKObjects.eSizeShapeSemimajorAxiskeplerian2.LocationType = STKObjects.eLocationMeanAnomalykeplerian2.Orientation.AscNodeType = STKObjects.eAscNodeRAANroot.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.revolvekeplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeMeanMotion).Eccentricity = self.eccentricity
#         keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).SemimajorAxis = self.SemimajorAxis
#         keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).Eccentricity = self.Eccentricityroot.UnitPreferences.Item('AngleUnit').SetCurrentUnit('deg')root.UnitPreferences.Item('TimeUnit').SetCurrentUnit('sec')keplerian2.Orientation.Inclination = self.inclinationkeplerian2.Orientation.ArgOfPerigee = self.argumentOfPerigeekeplerian2.Orientation.AscNode.QueryInterface(STKObjects.IAgOrientationAscNodeRAAN).Value = self.RAANkeplerian2.Location.QueryInterface(STKObjects.IAgClassicalLocationMeanAnomaly).Value = self.MeanAnomalysatProp.InitialState.Representation.Assign(keplerian)satProp.Propagate()self.sat=satself.satIAg=satIAgreturn satIAg

Target:

class Target:def __init__(self,name,Longitude=0,Latitude=0,Altitude=0):self.name=nameself.Longitude=Longitudeself.Latitude=Latitudeself.Altitude=Altitudeself.uniqueNumber=23def queryFromSecenario(self,sc):try:targets=sc.Children.GetElements(self.uniqueNumber)target=targets.Item(self.name)return targetexcept:return Nonedef 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 Nonetarget = sc.Children.New(self.uniqueNumber, self.name) targetIAg = target.QueryInterface(STKObjects.IAgTarget)pos = targetIAg.Positionpos.AssignGeodetic(self.Latitude,self.Longitude,self.Altitude)self.targetIAg=targetIAgself.target=targetreturn targetIAg

Aircraft:

class Aircraft:def __init__(self,name):self.name=nameself.uniqueNumber=1def queryFromSecenario(self,sc):try:aircrafts=sc.Children.GetElements(self.uniqueNumber)aircraft=aircrafts.Item(self.name)return aircraftexcept:return Nonedef 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 Noneaircraft = sc.Children.New(self.uniqueNumber, self.name) aircraftIAg = aircraft.QueryInterface(STKObjects.IAgAircraft)self.aircraftIAg=aircraftIAgself.aircraft=aircraftreturn aircraftIAgdef addWayPoints(self,points):self.aircraftIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.aircraftIAg.Routeroute = 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.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Waypoints.RemoveAll()route.Propagate()

Ship:

class Ship:def __init__(self,name):self.name=nameself.uniqueNumber=21def queryFromSecenario(self,sc):try:ships=sc.Children.GetElements(self.uniqueNumber)ship=ships.Item(self.name)return shipexcept:return Nonedef 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 Noneship = sc.Children.New(self.uniqueNumber, self.name) shipIAg = ship.QueryInterface(STKObjects.IAgShip)self.shipIAg=shipIAgself.ship=shipreturn shipIAgdef addWayPoints(self,points):self.shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.shipIAg.Routeroute = 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.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Waypoints.RemoveAll()route.Propagate()

获取可见性:

def addAccess(Monitor,Monitored):Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)access = Monitor.GetAccessToObject(Monitored)access.ComputeAccess()results = access.ComputedAccessIntervalTimesresults=results.ToArray(0,results.Count)return results

使用示例:

def addAccess(Monitor,Monitored):Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)access = Monitor.GetAccessToObject(Monitored)access.ComputeAccess()results = access.ComputedAccessIntervalTimesresults=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.001waypoint2 = route.Waypoints.Add()
waypoint2.Latitude = 40
waypoint2.Longitude = -80
waypoint2.Altitude = 10
waypoint2.Speed=0.001waypoint3 = route.Waypoints.Add()
waypoint3.Latitude = 41
waypoint3.Longitude = -81
waypoint3.Altitude = 10
waypoint3.Speed=0.001route.Propagate()

这篇关于Python 调用STK接口的常用操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635562

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos