Python与STK交互:创建场景,目标和计算目标参数并获取数据

Python与STK交互:创建场景,目标和计算目标参数并获取数据

Python 与 STK 连接初始化

在使用python与STK交互前,需要进行Python与STK的首次连接,本人也是使用Python做STK交互的初学者,采用了以下链接的方法进行连接初始化。
STK二次开发-Python的首次连接

在Python中对STK操作:创建卫星,计算参数,获取数据

在与STK进行首次连接后,只要导入 win32com.client 即可与STK进行交互。

# %%import
import datetime
import os
import time

import pandas as pd
import win32com.client

# %%
# 创建数据存储路径
target_excel_dir = r'D:/PythonProject/STK'
if not os.path.exists(target_excel_dir):
    os.makedirs(target_excel_dir)

# %%run stk
# Get reference to running STK instance
app = win32com.client.Dispatch('STK11.Application')
app.Visible = True
# Get our IAgStkObjectRoot interface
root = app.Personality2
# creat a new scenario
# IAgStkObjectRoot root: STK Object Model Root
root.NewScenario('Beidou3G2')  # 场景名称不能有空格等非法字符
scenario = root.CurrentScenario
root.UnitPreferences.SetCurrentUnit('DateFormat', 'UTCG')
# 设置场景时间
root.CurrentScenario.StartTime = '8 Jun 2020 16:00:00.00'
root.CurrentScenario.StopTime = '10 Jun 2020 04:00:00.00'
# %%定义函数创建卫星并导出数据
# path_tle:D:/xxx/xxx.txt存储目标的tle文件夹


def createSatellite(path_tle, starttime, stoptime):
    # 创建卫星
    # IAgStkObjectRoot root: STK Object Model Root
    satellite = root.CurrentScenario.Children.New(
        18, 'Beidou3G2')  # eSatellite
    # IAgSatellite satellite: Satellite object
    satellite.SetPropagatorType(4)  # ePropagatorSGP4
    propagator = satellite.Propagator
    propagator.UseScenarioAnalysisTime
    # 用tle根数生成卫星,注意:
    # 1、该函数有两个输入参数皆为字符串,'NORADID','根数文件路径'
    # 2、根数文件里同一目标不能有相同历元根数
    # propagator.CommonTasks.AddSegsFromFile('ID','path.txt'),txt中要有该卫星的根数
    propagator.CommonTasks.AddSegsFromFile(
        '45344', path_tle)
    propagator.AutoUpdateEnabled = True
    propagator.Propagate()

    # 通过Dataprovider接口计算卫星参数
    # 推荐使用这些方式连接接口
    # There are 4 Methods to get DP From a Path depending on the kind of DP:
    #   GetDataPrvTimeVarFromPath
    #   GetDataPrvIntervalFromPath
    #   GetDataPrvInfoFromPath
    #   GetDataPrvFixeDataromPath
    # Orbit元素:半长轴等
    satOrbitDP = satellite.DataProviders.GetDataPrvTimeVarFromPath(
        'Classical Elements/J2000')
    results_orbit = satOrbitDP.Exec(
        starttime, stoptime, 300)
    # (t1,t2,时间步长)t1,t2都必须是符合STK格式的时间字符串:'1 Jan 2020 04:00:00'
    # LLA State 经纬度轨迹
    satLLADP = satellite.DataProviders.GetDataPrvTimeVarFromPath(
        'LLA State/Fixed')
    results_LLA = satLLADP.Exec(
        starttime, stoptime, 300)
    # 组:Classical Elements,类:J2000,计算元素:Time x y z等等
    # 使用Exec,会计算类下所有元素的值,更多详情请参考STK帮助文档
    # GET DATA
    # 从DataSets中获取数据有两种方式:1、序号;2、元素名称。
    # satax = results_orbit.DataSets.GetDataSetByName('Semi-major Axis').GetValues()
    # [0]:'Time' [1]:'Semi-major Axis'
    sat_time = results_orbit.DataSets[0].GetValues()
    sat_sma = results_orbit.DataSets[1].GetValues()
    sat_inc = results_orbit.DataSets[3].GetValues()
    sat_lat = results_LLA.DataSets[1].GetValues()
    sat_lon = results_LLA.DataSets[2].GetValues()
    # create new dataframes to store these data
    Data = pd.DataFrame(
        columns=('Time (UTC)',
                 'Semi-major Axis (km)', 'Inclination (deg)',
                 'latitude (deg)', 'longitude (deg)'))
    Data_a = pd.DataFrame(columns=('Time', 'Semi-major Axis (km)'))
    # 给Data,Data_a赋值
    for j in range(0, len(sat_time)):
        t = sat_time[j].split('.', 1)[0]
        # 转换输出时间为时间戳方便筛选核计算数据
        # STK输出的时间格式样式:1 Jan 2020 04:00:00
        t_stamp = time.strptime(t, '%d %b %Y %H:%M:%S')
        t_stamp = time.mktime(t_stamp) / 3600
        # 转换输出时间为格式时间便于显示以及读取
        t = datetime.datetime.strptime(t, '%d %b %Y %H:%M:%S')
        t = datetime.datetime.strftime(t, '%Y-%m-%d %H:%M:%S')
        sma = sat_sma[j]
        inc = sat_inc[j]
        lat = sat_lat[j]
        lon = sat_lon[j]
        Data_a = Data_a.append(pd.DataFrame(
            {'Time': [t_stamp], 'Semi-major Axis (km)': [sma]}),
            ignore_index=True)
        print(Data_a.head())
        Data = Data.append(pd.DataFrame(
            {'Time (UTC)': [t],
             'Semi-major Axis (km)': [sma], 'Inclination (deg)': [inc],
             'latitude (deg)': [lat], 'longitude (deg)': [lon]}),
            ignore_index=True)
        print(Data.head())
    # 存储Data
    Data.to_excel(target_excel_dir + '/' + 'test.xlsx',
                  'sheet1', float_format='%.3f', index=False)
    Data_a.to_excel(target_excel_dir + '/' + 'test.xlsx',
                    'sheet1', float_format='%.3f', index=False)


# %%执行函数
path_tle = r'D:/PythonProject/STK/beidou3.txt'
t1 = scenario.StartTime
t2 = scenario.StopTime
# 你也可以自定义计算卫星参数的时间区间,但需要在场景时间范围内。
t3 = '9 Jun 2020 04:00:00.00'
t4 = '9 Jun 2020 16:00:00.00'
# 可以用root多次设置场景时间
createSatellite(path_tle,t1,t2)

疑问:

是否有更好的方式直接通过 STKObject 进行计算和获取需要的数据,而不是依旧要打开STK。

参考:

1、https://blog.csdn.net/u011575168/article/details/86582961?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-8
2、https://blog.csdn.net/u011575168/article/details/80671283
3、STK Programming Interface Help/Python code snippets

  • 3
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Python STK交互是指使用Python编程语言与STK软件进行交互的过程。在进行PythonSTK交互之前,需要进行首次连接的初始化。可以使用以下链接中提供的方法进行连接初始化。该链接中提供了使用Python进行STK操作的示例,包括创建卫星、计算参数获取数据等。 为了验证是否安装了必要的组件,可以在Python文件中复制并粘贴以下代码并运行: ```python from agi.stk12.stkengine import STKEngine stk = STKEngine.StartApplication(noGraphics=True) print(stk.Version) ``` 以下是完整的首次连接STKPython代码示例: ```python # -*- coding: utf-8 -*- """ Python 首次连接STK(此文件只运行一次) 此文件运行后,会在目录<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PythonSTK交互创建场景目标计算目标参数获取数据](https://blog.csdn.net/weixin_43534654/article/details/107020445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [大型SAR卫星星座设计——Python STK联合仿真](https://blog.csdn.net/Beau_Wen/article/details/129961249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [STK二次开发-Python的首次连接](https://blog.csdn.net/u011575168/article/details/86582961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值