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

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安