当前位置: 首页 > news >正文

TH方程学习 (7)

一、内容介绍

TH存在广泛应用,在下面案例中,将介绍几种相对运动模型,斜滑接近模型,本节学习斜滑接近制导方法能够对接近时间、接近方向以及自主接近过程的相对速度进行控制。施加脉冲时刻追踪器的位置连线可构成一条直线,即理想轨道,实际接近轨道和理想接近轨道在脉冲施加时刻相交。脉冲施加的次数越多,则实际轨道偏离理想轨道越少;脉冲施加次数趋近于无穷大时,实际交会轨道将会和理想轨道重合,接近一条直线,从大范围看,多脉冲斜滑接近整个过程基本是沿直线运动的。

设追踪器在接近段的初始时刻,相对运动状态为\boldsymbol{r}_0\dot{\boldsymbol{r}_0},接近段终端时刻T的相对状态为\boldsymbol{r}_T\dot{\boldsymbol{r}}_T。设追踪器沿准直线完成对目标器的接近,由\boldsymbol{r}_T指向\boldsymbol{r}_0的直线矢量\boldsymbol{\rho}为规划轨迹。所以,在任意时刻t

\boldsymbol{\rho}(t)=\boldsymbol{r}_c(t)-\boldsymbol{r}_T

其中,\boldsymbol{r}_c(t)为追踪器在该直线上某点处的位置矢量。

矢量\boldsymbol{\rho}的单位矢量为

\boldsymbol{u}_{\rho}=[\cos\alpha,\cos\beta,\cos\gamma]^{T}

其中,\alpha,\beta,\gamma表示矢量\boldsymbol{\rho}(T)在VVLH坐标系中投影与三个坐标轴的夹角,从而决定了接近方向。矢量可以表示为

\boldsymbol{\rho}=\left | \rho \right |\boldsymbol{u}_{\boldsymbol{\rho}}

在接近过程中,可根据接近轨迹快速性和安全性等多种需求来确定\rho,\dot{\rho}的变化关系,即设计理想的交会轨迹。典型的相对运动速度变化模式有指数型,这里采用指数型,\rho\dot{\rho}为线性关系

\dot{\rho}=a\rho+\dot{\rho}_T\\\rho(t)=\rho_0\exp(at)+\frac{\dot{\rho}_T}{a}(\exp at)-1)

上式中a为斜率。则整个接近段的转移时间T为

T=\frac{1}{a}\ln\frac{\dot{\rho}_T}{\dot{\rho}_0}

设接近段采用多脉冲分段控制,作用N次速度脉冲使绕飞卫星在时间T内从初始位置\boldsymbol{r}_0转移到终点位置\boldsymbol{r}_T。任意控制段的两次脉冲作用的时间间隔是相同的,即\Delta t=T/N

在时刻t_m=m\Delta t(m=0,1,..,N-1),经过第m次速度脉冲后,绕飞卫星从\boldsymbol{r}_m转移到\boldsymbol{r}_{m+1},有

\boldsymbol{r}_m=\boldsymbol{r}_T+\rho_m \boldsymbol{u}_{\rho}\\ \rho_m=\rho_0\exp(at_m)+\frac{\dot{\rho}_T}{a}(\exp(at_m)-1)

每个阶段相当于一次双脉冲轨道转移,可通过如下编程

% 本节旨在利用TH方程实现椭圆的轨道的滑行制导
clc;clear
% 初始化条件
Ecc    =  0.1;
Perigee=  500;
TA     =  45;
N      =  5  ;    %施加脉冲次数  
r_i    =  [1;1;1];
v_i    =  [0.01;0.01;0.01];
% 期望末端条件
r_f    =  [0.1;0;0];
v_f    =  [0;0;0];
% 求出初始相对距离
rho0   =  norm(r_i-r_f);
rhof   =  0;%设计初始和结束沿着rho方向的速度
drho0  =  -0.005;
drhof  =  -0.0001;
a            =  (drho0-drhof)/rho0;
t            =  1/a *log(drhof/drho0);
% 求出单位矢量
u_rho        =  (r_i-r_f)/rho0;rho1_vec     =  zeros(3,N);
rho1_vec(:,1)=  r_i;
% 记录每次施加脉冲前的速度
vvff         =   zeros(3,N);
vvff(:,1)    =  v_i;
% 记录每次施加脉冲后的速度
vvrr         =  zeros(3,N);
vvrr(:,N)    =  v_f; 
delta_t      =  t/(N-1);
% 脉冲希望到达的位置
for i=1:N-1t1            =  i*t/(N-1);rho1          =  rho0*exp(a*t1)+drhof/a*(exp(a*t1)-1);rho1_vec(:,i+1) = r_f+rho1*u_rho;    [v,Phi,vv]    =  TH_solver(Ecc,Perigee,TA,rho1_vec(:,i),vvff(:,i),t/(N-1));Phiall{i}     =  Phi;Phi_rr        =  Phi(1:3,1:3);Phi_rv        =  Phi(1:3,4:6);vvrr(:,i)     =  inv(Phi_rv)*(rho1_vec(:,i+1)-Phi_rr*rho1_vec(:,i));[x,Phi0,xx]   =  TH_solver(Ecc,Perigee,TA,rho1_vec(:,i),vvrr(:,i),t/(N-1));yy(:,i)       =  x(1:3);vvff(:,i+1)   =  x(4:6);
end
dv=vvrr-vvff;
Phiall{4}*[rho1_vec(:,4);vvrr(:,4)];
tt            =  linspace(0,delta_t,1000);
for ss=1:Nfor j=1:length(tt)[mm,Phi00,zz0]=  TH_solver(Ecc,Perigee,TA,rho1_vec(:,ss),vvrr(:,ss),tt(j));tarx((ss-1)*1000+j)       =  mm(1);tary((ss-1)*1000+j)       =  mm(2);tarz((ss-1)*1000+j)       =  mm(3);end
end
% 使用STK验证VVLH坐标系
uiApplication = actxGetRunningServer('STK12.application');
root = uiApplication.Personality2;
checkempty = root.Children.Count;
if checkempty ~= 0root.CurrentScenario.Unloadroot.CloseScenario;
end
root.NewScenario('VVLH');
StartTime = '26 Jan 2024 04:00:00.000';    % 场景开始时间
StopTime = '10 Feb 2024 04:00:00.000';     % 场景结束时间
root.ExecuteCommand(['SetAnalysisTimePeriod * "',StartTime,'" "',StopTime,'"']);
root.ExecuteCommand(' Animate * Reset');
SatName = 'Target';       %  SAR_   GX_   Sat_  GX_1_  SAR_1_
satellite = root.CurrentScenario.Children.New('eSatellite', SatName);
satellite.SetPropagatorType('ePropagatorAstrogator');   %  不设置的时候默认为二体模型  ePropagatorJ4Perturbation
satellite.Propagator;
% 目标星初始状态
Perigee = 500;
T       = 60;
% 追踪星在VVLH坐下的相对位置
delta_r = [1;1;1];
delta_v = [0.01;0.01;0.01];
Perige  = 6378.137+Perigee;
ecc     = 0.1;
sma     = Perige/(1-ecc);
Inc     = 30;
w       = 0;
RAAN    = 0;
TA      = 45;
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList Initial_State Propagate']);
InitialState=satellite.Propagator.MainSequence.Item(0);
%% 初始化卫星参数
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.CoordinateType Modified Keplerian']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch ',StartTime,' UTCG']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.sma ',num2str(sma),' km']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc ',num2str(ecc)]);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc ',num2str(Inc),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w ',num2str(w),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.RAAN ',num2str(RAAN),' deg']);
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.TA ',num2str(TA),' deg']);
%% 二体传播
Propagate=satellite.Propagator.MainSequence.Item(1);
Propagate.PropagatorName='Earth Point Mass';
root.ExecuteCommand(['Astrogator */Satellite/',SatName,' RunMCS']);% 插入目标星
SatName2 = 'Chaser';       
satellite2 = root.CurrentScenario.Children.New('eSatellite', SatName2);
satellite2.SetPropagatorType('ePropagatorAstrogator');   %  不设置的时候默认为二体模型  ePropagatorJ4Perturbation
satellite2.Propagator;
InitialState2=satellite2.Propagator.MainSequence.Item(0);
InitialState2.CoordSystemName='Satellite/Target VVLH';
InitialState2.Element.X=delta_r(1);
InitialState2.Element.Y=delta_r(2);
InitialState2.Element.Z=delta_r(3);
InitialState2.Element.Vx=delta_v(1);
InitialState2.Element.Vy=delta_v(2);
InitialState2.Element.Vz=delta_v(3);
Propagate2=satellite2.Propagator.MainSequence.Item(1);
Propagate2.PropagatorName='Earth Point Mass';
for j=1:NManeuverName=['Maneuver',num2str(j)];PropagateName=['Propagate',num2str(j)];satellite2.Propagator.MainSequence.Insert('eVASegmentTypeManeuver',ManeuverName,'Propagate');Maneuver=satellite2.Propagator.MainSequence.Item(ManeuverName);root.ExecuteCommand(['Astrogator */Satellite/',SatName2,' SetValue MainSequence.SegmentList.',ManeuverName,'.ImpulsiveMnvr.AttitudeControl Thrust Vector']);Maneuver.Maneuver.AttitudeControl.ThrustAxesName='Satellite VVLH.Axes';Maneuver.Maneuver.AttitudeControl.X=dv(1,j)*1000;Maneuver.Maneuver.AttitudeControl.Y=dv(2,j)*1000;Maneuver.Maneuver.AttitudeControl.Z=dv(3,j)*1000;satellite2.Propagator.MainSequence.Insert('eVASegmentTypePropagate',PropagateName,'Propagate');Propagate3=satellite2.Propagator.MainSequence.Item(PropagateName);Propagate3.PropagatorName='Earth Point Mass';Propagate3.Properties.Color=255;Propagate3.StoppingConditions.Item(0).Properties.Trip = delta_t;
end
satellite2.Propagator.MainSequence.Cut('Propagate')
root.ExecuteCommand(['Astrogator */Satellite/',SatName2,' RunMCS']);
% 报告二颗卫星的三维关系
satellite.VO.OrbitSystems.InertialByWindow.IsVisible=0;
satellite2.VO.OrbitSystems.InertialByWindow.IsVisible=0;
satellite2.VO.OrbitSystems.Add('Satellite/Target VVLH System')
satellite.VO.Vector.RefCrdns.Item(2).Visible=1;targetdata=root.ExecuteCommand(['Report_RM */Satellite/Target  Style "VVLH" TimePeriod "26 Jan 2024 04:00:00.000" "26 Jan 2024 4:30:00.000" TimeStep 1']);
Num=targetdata.Count;
root.ExecuteCommand('Astrogator */Satellite/Target ClearDWCGraphics');
root.ExecuteCommand('Astrogator */Satellite/Chaser ClearDWCGraphics');
for j=1:Num-2struct=regexp(targetdata.Item(j),',','split');Tar_x(j)=str2double(struct{2});Tar_y(j)=str2double(struct{3});Tar_z(j)=str2double(struct{4});
endfigure(1)
plot3(Tar_x(1:floor(t)),Tar_y(1:floor(t)),Tar_z(1:floor(t)),'LineWidth',1);
hold on
plot3(tarx,tary,tarz,'LineWidth',1)
axis([-1.5 1.5 -1.5 1.5 -1.5 1.5])
set(gca,'XDir','reverse');
set(gca,'YDir','reverse');
set(gca,'ZDir','reverse');
xlabel('X axis(km)','FontName','Times New Roman')
ylabel('Y axis(km)','FontName','Times New Roman')
zlabel('Z axis(km)','FontName','Times New Roman')
title('e=0.1,Perigee=500km','FontName','Times New Roman')
grid onplot3(rho1_vec(1,:),rho1_vec(2,:),rho1_vec(3,:),'g.')
plot3(delta_r(1),delta_r(2),delta_r(3),'r.')legend('transfer trajectory(STK)','trasnfer trajecoty(TH)','Impulsive Point','Original','Location','Northeast')

得到最终的结果,滑移的曲线如图所示

下图是每次施加脉冲前和施加脉冲后的位置速度,将上述脉冲形式写入STK,使用二体预报,发现计算出来的脉冲曲线与TH状态转移方程计算出来的曲线不一致,存在微小的误差。并且随着脉冲次数的增多,该误差会更加明显。

相关文章:

TH方程学习 (7)

一、内容介绍 TH存在广泛应用,在下面案例中,将介绍几种相对运动模型,斜滑接近模型,本节学习斜滑接近制导方法能够对接近时间、接近方向以及自主接近过程的相对速度进行控制。施加脉冲时刻追踪器的位置连线可构成一条直线&#xf…...

2024最新python入门教程|python安装|pycharm安装

前言:在安装PyCharm之前,首先需要明确PyCharm是一款功能强大的Python集成开发环境(IDE),由JetBrains公司开发。PyCharm旨在通过提供智能代码补全、语法高亮、代码检查、快速导航和重构等丰富的编码辅助工具&#xff0c…...

docker架构

docker架构 Docker daemon 是Docker最核心的后台进程,它负责响应来自Dockerclient的请求,然后将这此请求翻译成系统调用完成容器管理操作。该进程会在后台后启动一个APIServer,负责接收由 Dockerclient发送的请求;接收到的请求将通…...

使用Java进行网络采集:代理IP与参数传递详解

在Java编程语言中,参数传递机制是一个常见的讨论话题。理解这一点对于编写高效且无错误的Java代码至关重要。本文将探讨Java的参数传递机制,解析其究竟是“按引用传递”还是“按值传递”,并结合网络爬虫技术的实例,展示如何在实际…...

多功能光时域反射仪的工作原理

6426A-2101多功能光时域反射仪是新一代掌上型智能化光纤通信测量仪器,具有强大的功能和广泛的应用领域。它能够显示光纤及光缆的损耗分布曲线图,测量光纤及光缆的多种关键参数,包括长度、损耗、接续质量等,为光纤通信系统的工程施…...

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:海洋垃圾检测数据集,真实拍摄海洋海底场景高质量垃圾检测图片数据,涉及场景丰富,比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…...

如何进行Java程序的性能优化

在软件开发中,性能优化是一个至关重要的环节,它直接影响到用户体验、系统稳定性和资源消耗。对于Java程序而言,性能优化更是不可或缺的一部分。下面,我将从技术难点、面试官关注点、回答吸引力和代码举例四个方面,详细…...

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解,但是当前解决了我遇到的问题,如有更好的方法,希望看到这篇文章的同学可以不吝指导一番,非常感谢 1、问题描述: 因Ecahrts柱状图数据有时多有时少,所以在数据达到一定程度之后&#xff…...

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢,可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…...

9、中华人民共和国个人信息保护法

第一章 总  则 第一条 为了保护个人信息权益,规范个人信息处理活动,促进个人信息合理利用,根据宪法,制定本法。 第二条 自然人的个人信息受法律保护,任何组织、个人不得侵害自然人的个人信息权益。 第三条 在中华人民共和国境内处理自然人个人信息的活动,适用本…...

经典回归模型及Python实现方法

文章目录 1. 引言2. 经典回归模型及Python实现2.1 线性回归 Linear Regression2.2 多项式回归 Polynomial Regression2.3 逻辑回归 Logistic Regression2.4 岭回归 Ridge Regression2.5 套索回归 LASSO Regression2.6 弹性网络回归 Elastic Net2.7 决策树回归 Decision Tree Re…...

Git 保留空文件夹结构

假设有如下 helloworld 项目结构: helloworld|--.git|--.gitignore|--Builds|--WebGL|--iOS|--Android现在有个需求,在上传到 github 仓库时,只想保留 WebGL、iOS、Android 文件夹的结构,不想要里面的内容,可以按以下…...

【吊打面试官系列】MySQL 中有哪几种锁?

大家好,我是锋哥。今天分享关于 【MySQL 中有哪几种锁?】面试题,希望对大家有帮助; MySQL 中有哪几种锁? 1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,…...

小巧、免费高级分类整理桌面图标和文件程序

一、简介 1、专为Windows操作系统设计的桌面整理工具,旨在帮助用户更好地管理和整理桌面上的图标和文件。这款软件以其小巧、免费且无广告的特点受到用户的欢迎,尤其适合那些希望保持桌面整洁、提高工作效率的用户。 二、下载 1、下载地址: 官网链接:https://www.coodesker…...

Elasticsearch挂掉后,如何快速恢复数据

目录 一、Elasticsearch使用 二、实体类 2.1 mysql 实体类 2.2 Elasticsearch实体类 三、XXL-job定时执行 一、Elasticsearch使用 当我们做搜索功能时,如果为了提高查询效率,通常使用Elasticsearch搜索引擎加快搜索效率。以搜索商品为例,我…...

eNSP学习——连接RIP与OSPF网络、默认路由

目录 相关主要命令 实验一、连接RIP与OSPF网络 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建RIP和OSPF网络 3、配置双向路由引入 4、手工配置引入时的开销值 实验二、使用OSPF、RIP发布默认路由 原理介绍 实验目的 实验内容 实…...

工具MyBatis Generator(MBG)

MyBatis Generator(MBG),这是官方帮我们提供的一个自动生成代码的工具,前面的课程中,我们都是脑袋里想好,pojo有哪些属性,属性的类型是什么,对应的数据表中的字段名字是什么,匹配的类型是什么..…...

NeuralForecast 模型的参数 windows_batch的含义

NeuralForecast 模型的参数 windows_batch的含义 flyfish import pandas as pd import numpy as npAirPassengers np.array([112.0, 118.0, 132.0, 129.0, 121.0, 135.0, 148.0, 148.0, 136.0, 119.0],dtypenp.float32, )AirPassengersDF pd.DataFrame({"unique_id&qu…...

【记录】打印|用浏览器生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候,我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下,用 PDF 打印应该也可以直接打印出来,然后就琢磨出来了,这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…...

【python实现】实时监测GPU,空闲时自动执行脚本

文章目录 代码 代码 # author: muzhan # contact: levio.pkugmail.com import os import sys import time cmd nohup python -u train_post_2d_aut.py > output1.log & # gpu空闲时,需要执行的脚本命令 def gpu_info():gpu_status os.popen(nvidia-smi…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...