STK与matlab交互 Astrogator模块(13)

一、背景介绍

在本文介绍一个场景,五颗蓝方卫星和一颗红方卫星,在两个小时之内,使用神经网络等人工智能算法,实现一个轨道追踪的问题,其中接口输入是六颗卫星在J2000坐标系下的坐标,接口输出是该六颗卫星沿着自己速度方向施加的脉冲大小。下面开始创建仿真场景。

二、场景搭建

第一步:搭建STK场景,获取施加脉冲机动的时间片段,本文认为该卫星每5分钟进行一次计算,通过预测5分钟后的位置,来计算需要施加的脉冲。所以,根据(12)的方法,可以通过每5分钟更新一次卫星的MCS序列,来实现实时的控制。所以,首先获取时间片段,也就是每次更新的时间节点。代码如下:

%% 创建六颗卫星,五颗蓝方卫星,一颗红方卫星
clear;clc
uiApplication = actxGetRunningServer('STK12.application');
% Get our IAgStkObjectRoot interface
global root
root = uiApplication.Personality2;
checkempty = root.Children.Count;
if checkempty ~= 0root.CurrentScenario.Unloadroot.CloseScenario;
end
%% 根据你的需要设定场景的名称
root.NewScenario('lanjie');
StartTime = '01 Jan 2024 08:00:00.000';    % 场景开始时间
StopTime = '01 Jan 2024 10:00:00.000';     % 场景结束时间
root.ExecuteCommand(['SetAnalysisTimePeriod * "',StartTime,'" "',StopTime,'"']);
root.ExecuteCommand(' Animate * Reset');
Sat_Name='red';
satellite=root.CurrentScenario.Children.New('eSatellite', Sat_Name);
satellite.Propagator;
sma=7078.637;
Ecc=0;
Inc=20;
w=0;
RAAN=0;
TA=0;
satellite.SetPropagatorType('ePropagatorAstrogator'); 
satellite.Propagator;
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList Initial_State Propagate']);
%% 初始化卫星参数
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.CoordinateType Modified Keplerian']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',StartTime,' UTCG']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ElementType "Osculating"']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.sma ',num2str(sma),' km']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc ',num2str(Ecc)]);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc ',num2str(Inc),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w ',num2str(w),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.TA ',num2str(TA),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.RAAN ',num2str(RAAN),' deg']);
%% 设置时间为2个小时,获取5分钟的时间片段
sat=root.CurrentScenario.Children.Item('red');
Propagate=sat.Propagator.MainSequence.Item(1);
Propagate.StoppingConditions.Item(0).Properties.Trip=7200;
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' RunMCS']);
data=root.ExecuteCommand(['Report_RM */Satellite/',Sat_Name,' Style "J2000 Position Velocity"  TimePeriod "',StartTime,'" "',StopTime,'" TimeStep 300']);
Num=data.Count;
for i=1:Num-2struct=regexp(data.Item(i),',','split');Time{i}=struct{1};
end

式子最后获得的Time即为本文中每次更新的时间节点。

第二步:蓝、红方星的轨道高度随机分布在500~2000km的轨道高度,真近地点角随机分布在0~360°。由于人工智能算法还没有搭建起来。目前先固定六颗轨道卫星的轨道六根数。红方星的轨道六根数已经在第一步的代码给出,蓝方星也给出,每一次预报设置的时间为300s

%% 获取完片段后,将时间设置为5分钟
Propagate.StoppingConditions.Item(0).Properties.Trip=300;
root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' RunMCS']);SatJ2000=zeros(6,6);%获取六颗卫星在5分钟后的位置
%% 获取5分钟后其在J2000坐标系下的位置
data=root.ExecuteCommand(['Report_RM */Satellite/',Sat_Name,' Style "J2000 Position Velocity"  TimePeriod "',StartTime,'" "',Time{2},'" TimeStep 300']);
st=regexp(data.Item(2),',','split');
SatJ2000(6,1)=str2double(st{2});
SatJ2000(6,2)=str2double(st{3});
SatJ2000(6,3)=str2double(st{4});
SatJ2000(6,4)=str2double(st{5});
SatJ2000(6,5)=str2double(st{6});
SatJ2000(6,6)=str2double(st{7});%% ------------通过循环生成5颗蓝方卫星-----------
h=[500;600;700;800;900];%% 先按照确定高度来确定
TAA=[10;20;30;40;50];
for jj=1:5%% B卫星Sat_Name2=['blue',num2str(jj)];satellite2=root.CurrentScenario.Children.New('eSatellite', Sat_Name2);satellite2.Propagator;%% 500-2000km随机生成轨道高度 随机生成真近地点角sma=6378.137+h(jj);Ecc=0;Inc=20;w=0;RAAN=0;TA2=TAA(jj);satellite2.SetPropagatorType('ePropagatorAstrogator'); satellite2.Propagator;root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList Initial_State Propagate']);%% 初始化卫星参数root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.CoordinateType Modified Keplerian']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',StartTime,' UTCG']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ElementType "Osculating"']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.sma ',num2str(sma),' km']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc ',num2str(Ecc)]);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc ',num2str(Inc),' deg']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w ',num2str(w),' deg']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.TA ',num2str(TA2),' deg']);root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.RAAN ',num2str(RAAN),' deg']);sat=root.CurrentScenario.Children.Item(Sat_Name2);Propagate=sat.Propagator.MainSequence.Item(1);Propagate.StoppingConditions.Item(0).Properties.Trip=300;root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name2,' RunMCS']);data2=root.ExecuteCommand(['Report_RM */Satellite/',Sat_Name2,' Style "J2000 Position Velocity"  TimePeriod "',StartTime,'" "',Time{2},'" TimeStep 300']);stt=regexp(data2.Item(2),',','split');SatJ2000(jj,1)=str2double(stt{2});SatJ2000(jj,2)=str2double(stt{3});SatJ2000(jj,3)=str2double(stt{4});SatJ2000(jj,4)=str2double(stt{5});SatJ2000(jj,5)=str2double(stt{6});SatJ2000(jj,6)=str2double(stt{7});
end

运行完后,STK生成了6颗卫星,打开每颗卫星的任务序列

可以看到前5分钟的卫星按照给定的初始轨道条件进行预报,并且这六颗卫星的数据值均记录在SatJ2000这个6*6的数组里,蓝方1星在8点05时的在J2000坐标系下位置速度为第一行对应的数据,蓝方2星为第二行,依此类推,最后一行为红星的位置速度。

第三步,根据人工智能等算法计算6颗卫星这个时刻沿着速度方向施加的脉冲大小,这里由于人工智能算法没有搭建出来,将23次施加脉冲策略提前给出,导入数据DeltaV,其中第一行对应的数据为蓝方1,2,3,4,5星,红星在8点05时刻施加的脉冲大小。

在STK中实现,首先清除掉原来8点-8点05的任务序列,将上一时刻SatJ2000中得到的六颗卫星8点05在J2000坐标系下的坐标作为初始状态,将脉冲加入,然后运行300s。然后记录下8点10分的各个卫星的状态,如此往复,记录下每个脉冲开始施加时的位置和速度。MATLAB编程实现的步骤,首先是将六个卫星的名字放在一个元胞数组里,将Sat作为一个1*24的元胞数组,其中的每个元素即为该时刻六个卫星的位置速度,初始时间为8点05。

SatList = root.ExecuteCommand('ShowNames * Class Satellite').Item(0);
SatName = regexp(SatList,' ','split');%匹配正则表达式
for m=1:6Name=SatName{m+1};index=strfind(Name,'Satellite/');NameSat{m}=Name(index+10:end);
end%% 对卫星进行批量操作
Sat=cell(length(Time)-1,1); %% 元胞数组 记录下每次机动前 六颗卫星在J2000坐标系下的位置坐标
for ss=1:length(Sat)Sat{ss}=zeros(6);
end
Sat{1}=SatJ2000;%第一个数组对应的时间为8:05,第二个数组对应的时间为8:10,第三个数组对应的时间为8:15,以此类推

第四步:创建一个循环,代码如下

%% 可以在这里设一个断点
for ii=1:length(Time)-2SatJ2000_2=Sat{ii+1};deltaV=DeltaV(ii,:);%%  按道理应该是通过神经网络计算 这一步for s=1:length(NameSat)Sat_Name=NameSat{s};Satellite=root.CurrentScenario.Children.Item(Sat_Name);Satellite.Propagator.MainSequence.RemoveAll;%% 清空MCS命令 然后添加一个初始条件 一个脉冲数 一个轨道转移root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' SetValue MainSequence.SegmentList Initial_State Maneuver Propagate']);Initial=Satellite.Propagator.MainSequence.Item(0);Initial.CoordSystemName='CentralBody/Earth J2000';Initial.SetElementType('eVAElementTypeCartesian');Initial.OrbitEpoch=Time{ii+1};%% 将上一时刻记录的最后记录的位置,作为这个时刻的初始位置RVx=Sat{ii}(s,:);Initial.Element.X=RVx(1);Initial.Element.Y=RVx(2); Initial.Element.Z=RVx(3);Initial.Element.Vx=RVx(4);Initial.Element.Vy=RVx(5); Initial.Element.Vz=RVx(6);%% 然后将脉冲加入Maneuver=Satellite.Propagator.MainSequence.Item(1);Maneuver.Maneuver.AttitudeControl.DeltaVMagnitude=deltaV(s)/1000; %沿着速度脉冲施加方向Propagate=Satellite.Propagator.MainSequence.Item(2);Propagate.StoppingConditions.Item(0).Properties.Trip=300;root.ExecuteCommand(['Astrogator */Satellite/',Sat_Name,' RunMCS']);data3=root.ExecuteCommand(['Report_RM */Satellite/',Sat_Name,' Style "J2000 Position Velocity"  TimePeriod "',Time{ii+1},'" "',Time{ii+2},'" TimeStep 300']);sstt=regexp(data3.Item(2),',','split');SatJ2000_2(s,1)=str2double(sstt{2});SatJ2000_2(s,2)=str2double(sstt{3});SatJ2000_2(s,3)=str2double(sstt{4});SatJ2000_2(s,4)=str2double(sstt{5});SatJ2000_2(s,5)=str2double(sstt{6});SatJ2000_2(s,6)=str2double(sstt{7});endSat{ii+1}=SatJ2000_2;%% 在这里设置断点也能看
end

设置断点观测,当ii=1时,这个时候的Sat第一个元素即为8点05时刻的六颗卫星的位置和速度。这个时候六颗卫星的MCS序列如图所示,以蓝星1为例

记录下该卫星在8点10分的位置速度,写入Sat的第二个元素里面的矩阵

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下安装onlyoffice

文章目录 1、 安装ErLang2、 安装rabbitmq3、 安装postgresql4、 安装onlyoffice(社区版) 1、 安装ErLang 下载地址:https://erlang.org/download/otp_win64_24.2.exe opt_wind64_24.2.exe 直接运行,一步一步安装 2、 安装rabbitmq 下载地址&#xf…

.NET C# ORM 瀚高数据库

SqlSugar ORM SqlSugar 是一款 老牌 .NET开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用最易上手的ORM 优点 :【生态丰富】【高性能】【超简单】 【功能全面】 【多库兼容】【适合产品】 【SqlSugar视频教程】 支持 &#xff1a…

linux部署java1.8(java17)

两种方式: 方式一 1.输入查找命令: yum -y list java*2.输入安装命令: yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装: java -version方式二: 点击链接进入官网:https://www.oracle.com/…

H3C无线AP管理命令

先上链接 01-AP管理命令-新华三集团-H3C display wlan ap all

redis安装配置

简单启动一个redis容器 拉取redis镜像:(更多版本看https://hub.docker.com/_/redis/tags) sudo docker pull redis:7.2.4简单启动一个redis服务 ,–requirepass 指定密码 123456 sudo docker run -d \ --name redis \ --restartalways \ -p 6379:6379…

Java 如何避免代码中大量的 if else 判断

文章目录 Java 如何避免代码中大量的 if else 判断解决方案1.策略模式2.工厂模式3.策略模式 工厂模式4.提前 return(适用于分支逻辑很简单的 if else)5.枚举 Java 如何避免代码中大量的 if else 判断 在代码中经常会出现 if else 判断,如下…

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些(3篇) 当众演讲技巧的方法有很多,下面我将分三篇来详细阐述其中的一些关键技巧: **篇:准备与开场技巧 充分准备:提前规划演讲内容,明确主题和目标,准备详…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心,但又确乎说得上是19岁途中的又一枚勋章 从去年得知,纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客,记录好题和成长……感谢你们的关注&…

APT预警攻击平台截获Nday

APT预警攻击平台截获Nday 2024年4月26日 设备漏洞【漏洞利用】H3C Magic R100任意代码执行漏洞(CVE-2022-34598) 0000 : 0010 : 0020 : 0030 : 0040 : 0050 : 0060 : 0070 :6F 72…

请求接口报错:java.lang.IllegalStateException: argument type mismatch

目录 一、场景二、报错信息三、控制器四、接口调用五、原因六、解决 一、场景 1、调用后端接口报错 2、接口参数以Json方式传递 – 二、报错信息 java.lang.IllegalStateException: argument type mismatch Controller [com.xxx.huarunshouzheng.controller.MallControlle…

CCF-CSP真题题解:201409-3 字符串匹配

201409-3 字符串匹配 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int n, type; string s, p;string tolower(string s) {string res;for (char c : s) res tolower(c);return res; }int main() {cin >> p >…

【探索Linux】P.33(HTTP协议)

阅读导航 引言一、认识URL二、URL编码和解码1. Urlencode&#xff08;URL编码&#xff09;2. Urldecode&#xff08;URL解码&#xff09; 三、HTTP的方法四、HTTP的状态码五、HTTP常见Header六、最简单的HTTP服务器温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了“自…

LLaMA3(Meta)微调SFT实战Meta-Llama-3-8B-Instruct

LlaMA3-SFT LlaMA3-SFT, Meta-Llama-3-8B/Meta-Llama-3-8B-Instruct微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/LLaMA3-SFT默认数据类型为bfloat6 备注 1. 非常重要: weights要用bfloat16/fp32/tf32(第二版大模型基本共识), 不要用fp16, f…

坚守食品安全,美乐家(中国)守护大众健康

在现代社会&#xff0c;食品安全已成为公众关注的焦点&#xff0c;对于食品行业的企业而言&#xff0c;确保食品安全是极为重要的责任。产品是消费者与企业之间最直接、最紧密的纽带&#xff0c;也是消费者对品牌的最直观印象。因此&#xff0c;美乐家一直将产品质量、安全、绿…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP&#xff1a;可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP&#xff1a;可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认&#xff08;像GBN&#xff09;单个重传定时器&#xff08;像…

XYCTF 2024

Web 参考博客&#xff1a;https://www.yuque.com/yunzhiyunweiji/wrgkex/rfpnkn0293l7cp09#ezMake ezhttp Via - HTTP | MDN 代理那里难住了 XFF不给用可以用client-ip ezmd5 让我们上传图片并比较&#xff0c;结合题目名可以猜测应该是比较两个图片的md5值是否相同&…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

使用硬盘对拷方法将数据无损转移到另一个硬盘!

硬盘对拷&#xff0c;其实就是磁盘克隆&#xff0c;很多人喜欢将其说成对拷&#xff0c;或者硬盘复制等&#xff0c;但不管怎么说&#xff0c;他们的目的都是一个&#xff0c;想要把原硬盘上的全部数据&#xff08;包括系统、程序、个人文件、隐藏配置数据等&#xff09;都无损…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…