STK12与Python联合仿真(三):分析星座覆盖性能

2023-10-08 12:50

本文主要是介绍STK12与Python联合仿真(三):分析星座覆盖性能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分析星座覆盖性能

  • 打开STK,连接到工程
  • 创建种子星 (STK)
  • 创建种子星 (Python)
  • 生成星座
  • Python 创建覆盖网格
  • 绑定卫星的传感器
  • 建立星座
  • 定义多重网格
  • 计算与绘图
  • 结语

打开STK,连接到工程

jupyter:

导入相关的包

from agi.stk12.stkdesktop import STKDesktop
from agi.stk12.stkobjects import *
from agi.stk12.stkutil import *
from agi.stk12.vgt import *
import os

链接STK

STK_PID = 5600  # 根据自己刚刚得到的PID
stk = STKDesktop.AttachToApplication(pid=int(STK_PID))
# stk = STKDesktop.StartApplication(visible=True) #using optional visible argument
root = stk.Root
print(type(root))
scenario = root.CurrentScenario # 链接当前场景

创建种子星 (STK)

这里我在STK手动建立了高度600km,倾角75° 的种子卫星,并携带了对地观测角80°的传感器
然后建立Wakler星座
在这里插入图片描述
设置36个轨道面,每个轨道面10个星
在这里插入图片描述
结果如下:
在这里插入图片描述

创建种子星 (Python)

# 创建星座 —— 种子卫星
sat_seed = scenario.Children.New(AgESTKObjectType.eSatellite,'COL') # 种子卫星
# 种子卫星属性
sat_seed.SetPropagatorType(2) #  J4 摄动
keplerian = sat_seed.Propagator.InitialState.Representation.ConvertTo(1)  # eOrbitStateClassical, Use the Classical Element interface
keplerian.SizeShapeType = 0  # eSizeShapeAltitude, Changes from Ecc/Inc to Perigee/Apogee Altitude
keplerian.LocationType = 5  # eLocationTrueAnomaly, Makes sure True Anomaly is being used
keplerian.Orientation.AscNodeType = 0  # eAscNodeLAN, Use LAN instead of RAAN for data entry# Assign the perigee and apogee altitude values:
keplerian.SizeShape.PerigeeAltitude = 600      # km 近地点 高度
keplerian.SizeShape.ApogeeAltitude = 600       # km 远地点 高度# Assign the other desired orbital parameters:
keplerian.Orientation.Inclination = 75         # deg 倾角 
keplerian.Orientation.ArgOfPerigee = 0        # deg 近地点幅角度
keplerian.Orientation.AscNode.Value = 0       # deg
keplerian.Location.Value =  0              # deg 平近点角# Apply the changes made to the satellite's state and propagate:
sat_seed.Propagator.InitialState.Representation.Assign(keplerian)
sat_seed.Propagator.Propagate()
  • 添加传感器,命名Cam
# 添加传感器
sensor = sat_seed.Children.New(AgESTKObjectType.eSensor,'Cam')
# 传感器属性
sensor.CommonTasks.SetPatternSimpleConic(40,1) # 半张角40°,角分辨率1°
LOS = sensor.AccessConstraints.AddConstraint(34) # Range 类型
# 对照 https://help.agi.com/stkdevkit/Content/DocX/STKObjects~Enumerations~AgEAccessConstraints_EN.html 
LOS = LOS.QueryInterface(STKObjects.IAgAccessCnstrMinMax)  # 如果报错没有QueryInterface方法就把这一段注释
LOS.EnableMax = True
LOS.Max = 1100

这里解释一下约束
首先https://help.agi.com/stkdevkit/Content/DocX/STKObjectsEnumerationsAgEAccessConstraints_EN.html 这里解释sensor.AccessConstraints.AddConstraint(34)是IAgAccessCnstrMinMax的Range 类型
因此要接入STKObjects.IAgAccessCnstrMinMax,然后LOS.EnableMax对应的是图中的可选框,是否激活
LOS.Max = 1100表示设定的值
比如LOS.EnableMin = True
LOS.Min = 10

在这里插入图片描述

生成星座

生成星座只需要一个命令,

root.ExecuteCommand(‘Walker */Satellite/COL Type Delta NumPlanes 16 NumSatsPerPlane 10 InterPlanePhaseIncrement 1 ColorByPlane Yes’);

‘Walker */Satellite/COL Type Delta NumPlanes 16 NumSatsPerPlane 10 InterPlanePhaseIncrement 1 ColorByPlane Yes’ 这里面中,COL是种子卫星的平面,往后的参数依次是 轨道平面数、每轨道卫星数、轨道相位因子,对应STK如下
在这里插入图片描述
(这里为了演示能快一点就减少了卫星数量)

Python 创建覆盖网格

covdef = scenario.Children.New(AgESTKObjectType.eCoverageDefinition,'testCov') # 创建Coverage definition

这里对应STK的
在这里插入图片描述
设置 Converage Defination的属性

covdef.Grid.BoundsType = 6 # VAR1
'''
1 Global
2 Latitude Bounds
3 Latitude Line
4 Longitude Line
5 Custom Boundary
6 LatLon Region
'''
covdef.Grid.Resolution.LatLon = 6   # VAR2
covdef.PointDefinition.Altitude = 10 # 10 km  # VAR3# 如果选择eBoundsLatLonRegion可以定义网格的覆盖区域
# covdef.Grid.BoundsType = ‘eBoundsLatLonRegion’;
# covdef.Grid.Bounds.MinLongitude = -120;
# covdef.Grid.Bounds.MaxLongitude = 120;
# covdef.Grid.Bounds.MinLatitude = -30;
# covdef.Grid.Bounds.MaxLatitude = 30;

这里分别对应
在这里插入图片描述

绑定卫星的传感器

  1. 要读取所有可用的对象,放入all_list
  2. 由于我们只需要卫星的传感器,即放入sensor_list 里面
  3. 卫星传感器在列表中是交替列出的,因此只要间隔取样就可以了
all_list = covdef.AssetList.AvailableAssets
sensor_list = []
for e in range(len(all_list)):if e%2 == 0:passelse:sensor_list.append(all_list[e])

将所有传感器塞入

for j in sensor_list:covdef.AssetList.Add(j)

建立星座

sate_constellation = scenario.Children.New(AgESTKObjectType.eConstellation,'COL')
for obj in tqdm(all_list):sate_constellation.Objects.Add(obj)

定义多重网格

有时候我们需要分析不同高度的覆盖性能,但是手动添加太过繁琐,一下例程演示0-300km,采样间隔10km的网格创建。
并把不同网格放在一个列表里

covdef_lits = []
for i in range(0,310,10):_string = 'CovDef' + str(i)covdef = scenario.Children.New(AgESTKObjectType.eCoverageDefinition, _string)covdef.Grid.BoundsType = 6covdef.Grid.Resolution.LatLon = 6covdef.PointDefinition.Altitude = i for j in sensor_list:covdef.AssetList.Add(j)covdef_lits.append(covdef)

计算与绘图

方法变量值描述
eFmAccessConstraint0Access Constraint Figure of Merit.
eFmAccessDuration1Access Duration Figure of Merit.
eFmAccessSeparation2Access Separation Figure of Merit.
eFmCoverageTime3Coverage Time Figure of Merit.
eFmDilutionOfPrecision4Dilution of Precision Figure of Merit.
eFmNAssetCoverage5N Asset Coverage Figure of Merit.
eFmNavigationAccuracy6Navigation Accuracy Figure of Merit.
eFmNumberOfAccesses7Number of Accesses Figure of Merit.
eFmNumberOfGaps8Number of Gaps Figure of Merit.
eFmResponseTime9Response Time Figure of Merit.
eFmRevisitTime10Revisit Time Figure of Merit.
eFmSimpleCoverage11Simple Coverage Figure of Merit.
eFmTimeAverageGap12Time Average Gap Figure of Merit.
eFmSystemResponseTime13System Response Time Figure of Merit.
eFmAgeOfData14Age of Data Figure of Merit.
eFmScalarCalculation15Scalar Calculation Figure of Merit.
eFmSystemAgeOfData16System Age Of Data Figure of Merit.
figmerit1.SetDefinitionType(1)  # eFmAccessDuration 
covdef_tmp.ComputeAccesses();
pov = covdef_tmp.DataProviders.Item('Coverage by Latitude').Exec() # Coverage By Latitude

这里对照Reoprt Style 的属性
在这里插入图片描述在这里插入图片描述

data_array = pov.DataSets.ToArray() # 转换为数组

在这里插入图片描述
对比STK数据
在这里插入图片描述
在这里插入图片描述
完成绘图

import numpy as np
from matplotlib import pyplot as plt
data_array = np.array(data_array)
x = []
y = []
for ele in data_array:x.append(ele[0])y.append(ele[1])passplt.plot(x,y)

在这里插入图片描述
对比STK生成的图
在这里插入图片描述

结语

Python 有很多接口都是整形变量,不像MATLAB可以直接用字符串那么方便,需要自己找对应的变量。
我一般是对照着MATLAB的例程找到一些范式,可以在网站中慢慢找
STK Help

本文所有代码我将上传至我的Github

这篇关于STK12与Python联合仿真(三):分析星座覆盖性能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中