当前位置: 首页 > 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…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...