关于如何在STK中根据TLE数据插入卫星对象,参见本人另一篇文章:

STK9中根据TLE数据插入卫星对象。

本回文探索如何利用STK提供的实例代码和接口直接通过VC++编程,由TLE数据插入卫星对象。

预分析:

根据对STK的初步学习,在加入卫星对象时,STK首先创建一个卫星对象,可以什么也不做(不进行设置),此时的对象是一个空对象(只有名称,没有相关配置参数),直观的结果就是二三维视窗不会有对应的对象显示,说明STK还没有进行(与卫星有关的轨道)计算。这点与其他对象不同,例如加入地面设施,不需要进行对象属性配置(例如地面设施的经纬度设置),场景中会在当前默认的位置增加一个地面设施对象,并同时在二三维场景中显示。

有了空的卫星对象后,应当继续借助卫星对象的属性配置窗口卫星轨道向导工具对卫星的相关属性进一步配置,例如轨道六根数、轨道预报器类型等,在对相关操作进行确认后,STK会根据当前的设置进行轨道计算,应该是(个人判断)先把计算结果缓存了,后续进行动画仿真或显示只是一个查表的过程,所以在仿真的时候会感觉比较流畅。

当我们在动画(仿真)过程中进行对象的属性更新并确认时,二三维视窗的显示会有明显的卡顿,可能的原因就是STK在根据最新的变更进行计算,并在后台更新相应的数据。

如上所述,可以通过两种方式对卫星进行配置,一是通过对象属性窗口,包括卫星对象的‘Basic/基本’属性,还有二三维图形(显示)属性、约束(Constraints)、RF、DIS等属性配置。在基本属性配置中,会提供用户选择轨道预报器类型,然后根据轨道预报器的类型进行进一步的参数配置;另一种是通过轨道向导(Orbit Wizard)进行配置,此时提供给用户选择的是卫星轨道类型,例如圆轨道(Circle)、地球同步轨道(Geosynchronous)等。

在STK由TLE数据插入卫星的操作中,首先需要(从TLE数据文件)读入TLE数据,列表数据中包含的卫星对象,用户从列表选择相关对象后,点击确认,对象被加入到场景中。

这里有一个问题是仿真时间卫星星历时间,TLE数据给出了每个卫星对象在某一时刻的数据,而场景的仿真时间是用户在新建场景时指定的,并且,加入多个TLE数据对象时,它们的TLE数据时刻(卫星星历)可能各不相同,STK在将对象加入到场景执行计算时,(个人猜测)应该是根据各个时间进行了调整。

所以如果是自行解析TLE数据,计算并获取相关的轨道参数,然后利用经典轨道参数方式(例如STK给出的示例项目Events)加入卫星对象,则需要解决仿真时间卫星星历时间的转换问题,俺是非专业领域人士,还是看看STK是否提供了相关接口为妙。

TLE数据文件是与SGP4轨道预报器一起使用的,那我们就从SGP4轨道预报器开始。

// 注:文件 agstkobjects.tlh,第31327行开始定义,省略了本文分析的非必要信息

IAgVePropagatorSGP4 : IAgVePropagator

{

// 属性

_variant_t StartTime;

_variant_t StopTime;

double Step;

IAgVeSGP4SegmentCollectionPtr Segments;

VARIANT_BOOL UseScenarioAnalysisTime;

VARIANT_BOOL AutoUpdateEnabled;            // 是否根据TLE数据源自动更新

IAgVeSGP4AutoUpdatePtr AutoUpdate;         // 自动更新设置

IAgVePropagatorSGP4CommonTasksPtr CommonTasks;  // 从TLE源获取Segments

IAgVeSGP4PropagatorSettingsPtr Settings;     // SGP4预报器设置

// 方法

HRESULT Propagate();

_variant_t GetStartTime ( );

void PutStartTime (const _variant_t & pVal );

_variant_t GetStopTime ( );

void PutStopTime (const _variant_t & pVal );

double GetStep ( );

void PutStep (double pVal );

IAgVeSGP4SegmentCollectionPtr GetSegments ( );

VARIANT_BOOL GetUseScenarioAnalysisTime ( );

void PutUseScenarioAnalysisTime (VARIANT_BOOL pRetVal );

VARIANT_BOOL GetAutoUpdateEnabled ( );

void PutAutoUpdateEnabled (VARIANT_BOOL pRetVal );

IAgVeSGP4AutoUpdatePtr GetAutoUpdate ( );

IAgVePropagatorSGP4CommonTasksPtr GetCommonTasks ( );

IAgVeSGP4PropagatorSettingsPtr GetSettings ( );

};

除了一目了然的属性外,另外有三个属性:

  1. IAgVeSGP4SegmentCollectionPtr Segments;
  2. IAgVePropagatorSGP4CommonTasksPtr CommonTasks;
  3. IAgVeSGP4PropagatorSettingsPtr Settings

以及,一个方法:

  1. Propagatet()    // 执行轨道计算

为清晰起见,利用VS2017集成编译环境提供的‘转到定义’功能,将SGP4轨道预报器相关的STK COM接口对象及属性画出来,如下图:

图中标记了小红旗的为关键属性或方法,分析如下:

SGP4预报器有两个重要属性:

  1. IAgVeSGP4SegmentCollectionPtr Segments
  2. IAgVePropagatorSGP4CommonTasksPtr CommonTasks

其中,Segments包含了当前有效的所有TLE对象(在SGP4接口类中称为‘Segment’)的集合,Segments有一个属性为IAgVeSGP4SegmentPtr Item[],那个‘Item[]’应该就是TLE对象数组,该接口类另外提供了一个接口类IAgVeSGP4LoadFile支持从TLE文件加载TLE对象(Segments)。

CommonTasks属性对象则另外提供了加载TLE对象的方法,即:AddSegsFromFile(),个人感觉通过该方法加入的Segments也保存在了SegmentCollection集合中。

开始尝试!

1、下载TLE数据

参考本人之前一篇文章‘STK9中根据TLE数据插入卫星对象’,下载中国空间站轨道参数,另存为文本文件,如下图:

2、定制界面

如下图,增加一个操作按钮,当新建场景后,允许通过TLE数据文件插入卫星对象。

3、定制按钮点击事件代码,如下:

如果对各文件(例如***Dlg.cpp, ***Helper.cpp)不熟悉,请参见本系列之前文章。

// ***Dlg.cpp

// 通过TLE数据文件插入卫星对象,统一起见,均通过Helper执行实际的操作

void CEventsDlg::OnBnClickedAddtle()

{

try

{

CObjectModelHelper helper;

helper.LoadTLE(m_pRoot);

}

catch (_com_error& err)

{

ReportComError(err);

}

UpdateDisplayState();

}

// ObjectModelHelper.cpp

// 由TLE数据(文件)添加卫星对象

void CObjectModelHelper::LoadTLE(STKObjects::IAgStkObjectRootPtr pRoot)

{

_bstr_t                   bstrName;

_bstr_t                   bstrSSCNum;

_bstr_t                   bstrTLEFile;

IAgStkObjectPtr           pNewObj;     // STK Object

IAgSatellitePtr           pSat;        // STK卫星对象

IAgVePropagatorSGP4Ptr    pSGP4Prop;   // SGP4轨道预报器

IAgVeSGP4SegmentCollectionPtr segments; // TLE对象集合

IAgVeSGP4LoadFilePtr   pSGP4LoadFile;

SAFEARRAY*                pArray = NULL;

// 确保首先执行了 NewScenario 操作

ASSERT(pRoot != NULL);

// 参照STK的示例代码,首先获取当前场景,通过当前场景新增一个卫星对象

bstrName = "TianGong";

pNewObj = pRoot->GetCurrentScenario()->GetChildren()->New(eSatellite, bstrName);

pSat = pNewObj;

// 设置轨道预报器:SGP4。注:STK给的对外接口中定义了 15 种轨道预报器

pSat->SetPropagatorType(ePropagatorSGP4);

pSGP4Prop = pSat->Propagator;

// TLE数据

bstrSSCNum = "48274"; // 卫星编号,TLE轨道数据第1行以及第2行第03-07列(通常为5位数字)

bstrTLEFile = "D:\\tledata_TianGong_220406.txt";

// 加载TLE数据,方法一:由CommonTask加入

// 此方法加入数据后,SGP4SegmentCollection会自动生效,即 Segments->Count 不为 0

if (pSGP4Prop->CommonTasks->AddSegsFromFile(bstrSSCNum, bstrTLEFile) != S_OK) {

AfxMessageBox("Load TLE data failed!");

return;

}

// 加载TLE数据,方法二:由Segments对象加载

// 此方法加载数据后,SGP4SegmentCollection的Segments对象不会立刻生效,需要在调用轨道计算方法

// Propagate()之后才会生效

//segments = pSGP4Prop->Segments;

//segments->LoadMethodType = eFileLoad;

//pSGP4LoadFile = segments->LoadMethod;

//pSGP4LoadFile->File = bstrTLEFile;

//pArray = pSGP4LoadFile->GetSegsFromFile(bstrSSCNum);

// 执行轨道计算(预报器计算,并显示)

pSGP4Prop->Propagate();

if (pSGP4Prop->Segments->Count == 0) {

AfxMessageBox("No valid TLE data loaded!");

}

}

经验证,两种方法都可以通过TLE数据成功加入卫星对象,效果如下图:

继续深入探讨之题目:

  1. 由上图可以看出,三维视窗绘制的卫星轨道明显可以看出是一个多边形,如何使之更平滑?
  2. 通过在SSCNum使用通配符,尝试通过TLE数据文件一次加载多个卫星对象。
  3. SGP4预报器支持自动更新,包括在线自动更新和基于本地数据文件的自动更新,值得尝试一下。

STK与VC++联合编程实战(第四回:由TLE数据插入卫星对象)相关推荐

  1. STK与VC++联合编程实战(第三回:加入卫星对象)

    特别声明,本人对于天体物理学.轨道动力学完全是门外汉,不是一个学科方向,本人仅从代码角度以及STK提供的代码和资料作为参考进行分析,欢迎专业人士指正.若不喜,请勿喷! 继续以STK提供的VC++代码实 ...

  2. STK + C# + Cesium联合编程(一):技术路线验证

    概述 本文演示了一个基于STK +C# + Cesium联合编程的应用实例.关于STK和Cesium编程网上在线资料丰富,本文主要解决了如果配置IIS服务以使得远程客户端能访问.初始化.以及执行服务器 ...

  3. 基于Winsock API的VC网络编程实战

    基于Winsock API的VC网络编程实战 随着计算机信息技术的飞速发展,互联网与人类社会的工作.生活越来越紧密相关,它已经成为人类获取.交流信息的重要途径和手段.所以当前对于开发人员来说,网络编程 ...

  4. 艾伟:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写

    本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数 ...

  5. VC黑客编程实战视频-破解网吧电影下载。

    视频下载地址: 360云盘: 第一季:http://yunpan.cn/QG49aHbUDhXwi 第二季:http://yunpan.cn/QG4UgnI3uJ6vU 第三季:http://yunp ...

  6. Tkinter模块GUI界面化编程实战(四)——随机点名小程序(含详解及完整源码、完整程序下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(三)--2048小游戏]  这篇博客介绍了如何用Python Tkinter模块编写一个界面化的随机点名小程序,在博客下面有完整的源码,源码中有超详 ...

  7. 合同在线修改 java_Java并发编程实战-第四章

    序文: 如果你没有时间阅读这本,那你就来对地方了.小编会将每一章刨去废话,取其精华.分享给大家.如果觉得可以请不要忘了关注小编.我会定期跟新java 中的经典书籍. 正文: 第四章:对象的组合(更加适 ...

  8. STK与C#联合编程

    源码位置:<INSTALL DIR>\Help\stkX\Samples\CSharp\PlaceFinder\PlaceFinder.sln 此例在visual studio .NET ...

  9. ROS联合webots实战案例(四)webots中使用激光雷达

    在webots中使用激光雷达 注意: 再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识 为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题. ...

最新文章

  1. openGL学习笔记(1)——常用方法原型解释
  2. Python各种包下载地址
  3. 完美世界第二题:模拟读数字
  4. mssql的T-SQL教程(从建登陆到建库、表和约束)
  5. Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
  6. oracle怎么判断地址相似,如何查看oracle数据文件的地址
  7. 【英语学习】【WOTD】wherewithal 释义/词源/示例
  8. 力扣559. N 叉树的最大深度(JavaScript)
  9. 【Java开发规范】禁止在 foreach 循环里进行元素的 remove/add 操作
  10. Angular学习笔记06——钩子
  11. html图片滤色,CSS3图片混合(Blend)效果详解
  12. stl文件 python_用Python从STL文件绘制2D图像
  13. 【小程序】滚动到指定位置
  14. 武汉创业者声讨网易:占用我们LOGO 还大张旗鼓做起销售
  15. python测试框架nose研究
  16. linux下文件结构收藏
  17. 2017年东南大学蒙纳士553C++编程题
  18. 中国无纺布制造行业发展状况与前景规模预测报告2021-2027年
  19. HJ88 扑克牌大小
  20. MySQL Server 安装和卸载

热门文章

  1. kindeditor 上传视频mp4
  2. 深圳见!本周五,GIAC全球互联网架构大会强势来袭!
  3. vb.net魔方QQ魔法表情
  4. python包怎么做双重差分did分析_【研究方法】双重差分法(DID)介绍
  5. Web简历信息管理系统
  6. 计算机专业线性代数是,计算机专业_线性代数期末试卷
  7. Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)
  8. 机械工业出版社计算机组成原理答案,孙德文+计算机组成原理+习题答案
  9. c#: NetTopologySuite凹凸多边形计算
  10. 《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》——2.3 按订单生产(MTO)...