根据卫星运动矢量计算轨道六根数
前言
STK软件在给定六根数时,可求得卫星位置和速度矢量,但有时我们通过星历参数得到卫星的位置和速度矢量,希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。
计算过程
给定卫星在J2000坐标系下的的位置矢量r和速度矢量v
- 利用卫星动量矩计算轨道倾角和升交点赤径
计算卫星相对于地心的动量矩,该动量矩等于卫星地心矩矢量和速度矢量的矢积:h=r×v\textbf{h}=\textbf{r}×\textbf{v}h=r×v,动量矩的方向和卫星轨道面的法线是平行的,动量矩和Z轴夹角为轨道倾角iii,轨道平面和地球赤道平面的交线为节线ON;节线ON与X轴夹角为升交点赤径Ω\OmegaΩ,(i,Ω)(i,\Omega)(i,Ω)确定了轨道平面在空间坐标系中的方位。
i=arccos(hx/h),Ω=arctan(−hx/hy)i=arccos(h_x/h), \Omega=arctan(-h_x/h_y)i=arccos(hx/h),Ω=arctan(−hx/hy) - 利用卫星机械能计算轨道半长轴
E=v2/2−μ/r,E=−μ/2aE=v^2/2-\mu/r, E=-\mu/2aE=v2/2−μ/r,E=−μ/2a
其中hhh为动量矩模值,μ\muμ为引力常量:398600.44
km3/s2{km^3}/s^2km3/s2,vvv为速度矢量模值,rrr为位置矢量模值,aaa为椭圆轨道半长轴。 - 利用轨道半通经和轨道半长轴计算椭圆轨道偏心率
p=h2/μ,e=(1−(p/a))p=h^2/\mu, e=\sqrt{(1-(p/a))}p=h2/μ,e=(1−(p/a))
其中,ppp为半通径,eee为偏心率。 - 利用偏心率、半通经和位置矢量模值计算真近点角
f=arccos(p−r)/ref=arccos{(p-r)/re}f=arccos(p−r)/re - 利用真近点角和升交点幅角计算近地点辐角
ω=u−f,u=arccos(ON⋅r/(r∗ON))\omega=u-f, u=arccos(\textbf{ON} \cdot \textbf{r} /({r*ON}))ω=u−f,u=arccos(ON⋅r/(r∗ON))
其中,升交点幅角为节线ON矢量与卫星位置矢量的夹角。
ON=(cosΩ,sinΩ,0)\textbf{ON} =(cos\Omega,sin\Omega,0)ON=(cosΩ,sinΩ,0)。
代码实现
具体计算时,需要考虑反三角函数的值域与实际情况对应。
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const double mu{ 398600.44 };//引力常数:(km)3/s2
const double PI{ acos(-1) };//PI
const double rad2deg{ 180.0 / PI };//PI
#define ABS(x) (sqrt((x)[0]*(x)[0]+(x)[1]*(x)[1]+(x)[2]*(x)[2]))
struct OrbitParm {double inclination{ }; //轨道倾角:degdouble RAAN{ }; //升交点赤经:deg :计算结果差180double semimajorAxis{}; //半长轴:km 6917.21double Eccentricity{}; //偏心率:double argumentOfPerigee{}; //近地点辐角:deg :double trueAnomaly{ }; //真近点角 :主要考虑什么时候要对称变换,因为acos只能输出0—pi,而目标区间范围0—2pi
};
struct Motion {//J2000double location[3]{}; //位置:x、y、z kmdouble speed[3]{}; //速度:x、y、z km/sec
};
OrbitParm motionOrbitParmConvert(Motion mot) {//to be done//卫星相对于地心的动量矩:h=r*v(矢量的矢积)double h[3]{ mot.location[1] * mot.speed[2] - mot.location[2] * mot.speed[1], \- mot.location[0] * mot.speed[2] + mot.location[2] * mot.speed[0], \mot.location[0] * mot.speed[1] - mot.location[1] * mot.speed[0] };double absH{ ABS(h) };OrbitParm opa{};opa.inclination = acos(h[2] / absH) * rad2deg;opa.RAAN = atan2(h[0], -h[1]) * rad2deg;if ((opa.RAAN) < 0)//目标区间为0—2piopa.RAAN = opa.RAAN + 360;double p{ absH * absH / mu }; //椭圆轨道的半通径double absR{ ABS(mot.location) };double absV{ ABS(mot.speed) };double E = absV * absV / 2.0 - mu / absR; //卫星的机械能Eopa.semimajorAxis = -mu / E / 2.0;//半长轴由机械能决定opa.Eccentricity = sqrt(1 - p / opa.semimajorAxis);//偏心率可通过半长轴和半通径联合求得opa.trueAnomaly = acos((p - absR) / absR / opa.Eccentricity) * rad2deg;if (1)//主要考虑什么时候要对称变换,因为acos只能输出0—pi,而目标区间范围0—2piopa.trueAnomaly = 360 - opa.trueAnomaly;double u[3] = { cos(opa.RAAN / rad2deg),sin(opa.RAAN / rad2deg),0 };opa.argumentOfPerigee = acos((u[0] * mot.location[0] + u[1] * mot.location[1]) / absR) * rad2deg;opa.argumentOfPerigee -= opa.trueAnomaly;if (opa.argumentOfPerigee < 0)opa.argumentOfPerigee += 360;return opa;
}
Motion motionOrbitParmConvert(OrbitParm opa) {//暂时不编return{};
}
int main()
{//输入示例,第一个大括号依次填入J2000坐标系下的xyz位置,第二个括号依次填入J2000坐标系下的xyz速度auto opa = motionOrbitParmConvert({ {-3904.3,-4663.0,3290.863664} , {1.4,3.4,6.6} });cout <<right <<fixed << setprecision(6)<<setfill('0');cout << setw(11) << opa.inclination << endl;cout << setw(11) << opa.Eccentricity << endl;cout << setw(11) << opa.semimajorAxis << endl;cout << setw(11) << opa.RAAN << endl;cout << setw(11) << opa.trueAnomaly << endl;cout << setw(11) << opa.argumentOfPerigee << endl;return 0;
}
运行结果
更新
除了计算六根数,还计算了平近点角、偏近点角
class Orbit_Para_Object
{
public://卫星半长轴double dOrbit_a;//计算轨道偏心率double dOrbit_e;//计算轨道偏心角double dOrbit_E1;//计算真近心角double dOrbit_Theta;//计算平均近心角double dOrbit_M;//计算轨道倾角double dOrbit_Angle_Inclination;//升交点赤经double dOrbit_Angle_Omig;//近地点幅角double dOrbit_Angle_W;protected:private:};#define ABS(x) (sqrt((x)[0]*(x)[0]+(x)[1]*(x)[1]+(x)[2]*(x)[2]))
const double rad2deg{ 180.0 / pi };//PI
Orbit_Para_Object Cal_orbit_info(double sat_x_g, double sat_y_g, double sat_z_g, double sat_vx_g, double sat_vy_g, double sat_vz_g, double Gravitation_P) {//to be done// //卫星相对于地心的动量矩:h=r*v(矢量的矢积)//J2000double location[3]={ sat_x_g,sat_y_g,sat_z_g }; //位置:x、y、z kmdouble speed[3]={ sat_vx_g,sat_vy_g,sat_vz_g }; //速度:x、y、z km/sec double h[3]={location[1] * speed[2] - location[2] * speed[1], \- location[0] * speed[2] + location[2] * speed[0], \location[0] * speed[1] - location[1] * speed[0] };double absH{ ABS(h) };Orbit_Para_Object opa{};opa.dOrbit_Angle_Inclination = acos(h[2] / absH) * rad2deg;opa.dOrbit_Angle_Omig = atan2(h[0], -h[1]) * rad2deg;if ((opa.dOrbit_Angle_Omig) < 0)//目标区间为0—2piopa.dOrbit_Angle_Omig = opa.dOrbit_Angle_Omig + 360;double p = { absH * absH / Gravitation_P }; //椭圆轨道的半通径double absR = { ABS(location) };double absV = { ABS(speed) };double E = absV * absV / 2.0 - Gravitation_P / absR; //卫星的机械能Eopa.dOrbit_a = -Gravitation_P / E / 2.0;//半长轴由机械能决定opa.dOrbit_e = sqrt(1 - p / opa.dOrbit_a);//偏心率可通过半长轴和半通径联合求得opa.dOrbit_Theta = acos((p - absR) / absR / opa.dOrbit_e) * rad2deg;if (1)//主要考虑什么时候要对称变换,因为acos只能输出0—pi,而目标区间范围0—2piopa.dOrbit_Theta = 360 - opa.dOrbit_Theta;double u[3] = { cos(opa.dOrbit_Angle_Omig / rad2deg),sin(opa.dOrbit_Angle_Omig / rad2deg),0 };opa.dOrbit_Angle_W = acos((u[0] * location[0] + u[1] * location[1]) / absR) * rad2deg;opa.dOrbit_Angle_W -= opa.dOrbit_Theta;if (opa.dOrbit_Angle_W < 0)opa.dOrbit_Angle_W += 360;double n=sqrt( Gravitation_P/( opa.dOrbit_a * opa.dOrbit_a * opa.dOrbit_a));//卫星沿椭圆轨道运行的平均速率//计算偏近点角//opa.dOrbit_E1 = acos(absR * cos(opa.dOrbit_Theta) / opa.dOrbit_a + opa.dOrbit_e);opa.dOrbit_E1 = atan2(sqrt(1-opa.dOrbit_e* opa.dOrbit_e* opa.dOrbit_e) *sin(opa.dOrbit_Theta)/(1+opa.dOrbit_e*cos(opa.dOrbit_Theta)), (opa.dOrbit_e + cos(opa.dOrbit_Theta)) / (1 + opa.dOrbit_e * cos(opa.dOrbit_Theta)));//计算平近点角opa.dOrbit_M =fmod((opa.dOrbit_E1- opa.dOrbit_e*sin(opa.dOrbit_E1)) * rad2deg,360 );opa.dOrbit_E1 *= rad2deg;if (opa.dOrbit_E1 < 0)opa.dOrbit_E1 += 360;if (opa.dOrbit_M < 0)opa.dOrbit_M += 360;return opa;}
总结
该文实现了通过卫星星历参数反演得出卫星轨道的六根数。
相关文章:
根据卫星运动矢量计算轨道六根数
前言 STK软件在给定六根数时,可求得卫星位置和速度矢量,但有时我们通过星历参数得到卫星的位置和速度矢量,希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。 计算过程 给定卫星在J2000坐标系下的的位置矢量r和速度矢…...
关于微信小程序安装npm的过程,从下载到小程序内部安装完成
1.先从官网下载nodejs 网站为Node.js (nodejs.org),选择左边第一个2 然后一直next,选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后,先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...
IO-操作系统
用户态和内核态 现代操作系统,为了保护系统的安全,都会划分出内核空间和用户空间,或者我们经常说的内核态和用户态。简单来说,就是划分为内核态和用户态两个等级,运行在用户态的进程大都是一些应用程序,能够…...
Downie 4 4.6.12 MAC上最好的一款视频下载工具
Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…...
unity 玩家移动时idle和run动画频繁切换
项目场景: unity 控制玩家移动 问题描述 idle和run动画频繁切换 void Movement(){ xVelocity Input.GetAxisRaw("Horizontal"); anim.SetFloat("speed",Mathf.Abs(rb.velocity.x));//跑动动画 if(xVelocity !0){ transform.localScal…...
小程序 table组件
最近有在小程序中用table的需求,但是没有找到有符合要求的组件,所以自己弄了一个,能满足基本需求。 组件下载:https://download.csdn.net/download/weixin_67585820/85047405 引入 "usingComponents": {"table": "…...
利用摄影测量进行地形建模的介绍
一、前言 从一个地方到另一个地方的地球表面由连续和突然的海拔变化组成,个人和社会都必须应对这些变化。 水从高山和丘陵向下流,从溪流流入河流,形成三角洲,最终汇入大海。 三维 (3D) 地面信息的获取和表示一直是与行星表面相关的…...
中文代码138
邢唷?? > ? ? ? ? ? ? ?R o o t E n t r y ? F 喹8N"a? ? S u m m a r y I n f …...
JQuery用法
JQuery 优点 : (1)提供了强大的功能函数 (2)解决浏览器兼容性问题 (3)实现丰富的 UI 和插件 (4)纠正错误的脚本知识… 1、Jquery对象 $ 符号在 jQuery 中代表对 jQuery 对象的引用,…...
Python采集热门城市景点数据+简单制作数据可视化图
人生苦短,我用python 真的好想出去玩啊!!! 春游啊这是!!! 万物复苏的好季节!!! python 安装包资料:点击此处跳转文末名片获取 一、模块使用: …...
VUE-cli搭建项目
vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;…...
Feign返回值统一处理
背景 服务端的接口一般有固定的返回格式,有数据、返回码和异常时错误信息。结构如下 Data public class BaseResponse<T> {private String code;private String message;private T data;public boolean isSuccess() {return "SUCCESS".equals(cod…...
探究如何在Linux系统中修改进程资源限制:四种方法调整进程限制,让你的系统高效运行(包含应用层getrlimit和setrlimit API)
探究如何在Linux系统中修改进程资源限制1.进程资源限制的概念2.修改进程资源限制的意义与应用场景1.软限制与硬限制2.常见资源限制类型Linux中的资源限制1.ulimit命令a. 语法及选项b. 示例与应用2./etc/security/limits.conf配置文件a. 配置文件结构b.示例与应用3. 使用cgroups…...
9.5. 机器翻译与数据集
笔记 9.5. 机器翻译与数据集 — 动手学深度学习 2.0.0 documentation 1.下载文件 读文件 2.处理数据 在所有标点符号前面加空格 后面用于分割 因为法语英语可能有半角全角的字符区分用utf编码的方式统一成半角字符的空格 3.因为分隔用的是空格split 所有vocab是没有空格的 …...
跟着凯新生物2 Arm PEG Biotin,2-Branched PEG Biotin,生物素-聚乙二醇-二臂/支,学试剂知识
中英文名:2 Arm/Branched PEG Biotin,2 ArmPEG Biotin,二臂/支 PEG 生物素一、Product specifications: 1.CAS No:N/A 2.Packaging specification:10mg,25mg,50mg, flexible packagi…...
react组件进阶(四)
文章目录1. 组件通讯介绍2. 组件的 props3. 组件通讯的三种方式3.1 父组件传递数据给子组件3.2 子组件传递数据给父组件3.3 兄弟组件4. Context5. props 深入5.1 children 属性5.2 props 校验5.3 props 的默认值6. 组件的生命周期6.1 组件的生命周期概述6.2 生命周期的三个阶段…...
阿维塔城区NCA智驾导航辅助,复杂路口,全面胜任
阿维塔11城区NCA智驾导航辅助将于3月在上海、深圳等城市分阶段开启体验,以看得清、判得准、控得稳的“智驾”,进一步巩固业界智能天花板的地位。智能驾驶里程碑,拨杆两下开启都市安适旅程作为AVATRANS智能领航系统的重要组成部分,…...
[Pandas] div()函数
div()方法将DataFrame中的每个值除以指定的值,并返回一个计算处理后的Dataframe结果 DataFrame.div()函数其实是除法运算,表格中的每个数据都是被除数 导入数据 import pandas as pd df pd.DataFrame({"col1":[5, 3, None, 4], "col2…...
c++并发与多线程
c并发与多线程 子线程结束,主线程不能结束,否则会出错,和java不一样。 可以用join的方式让主线程等待子线程执行结束。 quickStart 线程相关头文件 #include <thread> 使用全局函数构造一个线程对象 #include <iostream> #…...
Vinylsulfone PEG Biotin,Biotin-PEG-VS,生物素聚乙二醇乙烯砜,VS基团容易与游离巯基发生反应
●中文名:乙烯砜PEG生物素,生物素聚乙二醇乙烯砜 ●英文名:Vinylsulfone PEG Biotin, VS-PEG-Biotin,Vinyl sulfone-PEG-Biotin,Biotins-PEG-sulfone Vinyl●产品理化指标: CAS号:N/A 分子量&am…...
论文学习——Tune-A-Video
Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation Abstract 本文提出了一种方法,站在巨人的肩膀上——在大规模图像数据集上pretrain并表现良好的 text to image 生成模型——加入新结构并进行微调,训练出一套 …...
C++类与对象part1
目录 1.类的6个默认函数 2.构造函数(相当于init) 3.析构函数 (相当于destroy) 4.拷贝构造函数 赋值运算符重载 运算符重载 赋值运算符重载 引入: 你知道为什么cout可以自动识别类型吗? 其实cout是一…...
记一次抓取网页内容
已打码 // UserScript // name --------- // namespace http://tampermonkey.net/ // version 0.1 // description https://---------oups/{id}/topics?scopeall&count20&begin_time2022-09-01T00%3A00%3A00.000%2B0800&end_time2022-10-01T00%…...
parasoft帮助史密斯医疗通过测试驱动开发提供安全、高质量的医疗设备
parasoft是一家专门提供软件测试解决方案的公司,Parasoft通过其经过市场验证的自动化软件测试工具集成套件,帮助企业持续交付高质量的软件。Parasoft的技术支持嵌入式、企业和物联网市场,通过将静态代码分析和单元测试、Web UI和API测试等所有…...
SpringBoot整合Oauth2开放平台接口授权案例
<!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId>&l…...
Linux_创建用户
创建一个名为hello的用户,并指定/home/hello为根目录useradd -d /home/hello -m hello 设置密码 ,密码会输入两次,一次设置密码,一次确认密码,两次密码要输入的一样passwd hellouseradd的常用参数含义-d指定用户登入时的主目录&am…...
RDD(弹性分布式数据集)总结
文章目录一、设计背景二、RDD概念三、RDD特性四、RDD之间的依赖关系五、阶段的划分六、RDD运行过程七、RDD的实现一、设计背景 1.某些应用场景中,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。如:迭代式算法…...
服务器版RstudioServer安装与配置详细教程
Docker部署Rstudio server 背景:如果您想在服务器上运行RstudioServer,可以按照如下方法进行操作,笔者测试时使用腾讯云服务器(系统centos7),需要在管理员权限下运行 Rstudio 官方提供了使用不同 R 版本的 …...
如何在Java中将一个列表拆分为多个较小的列表
在Java中,有多种方法可以将一个列表拆分为多个较小的列表。在本文中,我们将介绍三种不同的方法来实现这一目标。 方法一:使用List.subList()方法 List接口提供了一个subList()方法,它可以用来获取列表中的一部分元素。我们可以使…...
TryHackMe-Inferno(boot2root)
Inferno 现实生活中的机器CTF。该机器被设计为现实生活(也许不是?),非常适合刚开始渗透测试的新手 “在我们人生旅程的中途,我发现自己身处一片黑暗的森林中,因为直截了当的道路已经迷失了。我啊…...
怎么查询一个网站有没有做竞价/代做seo排名
redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内…...
关于医院网站建设的通知/seo基础知识培训
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/7832474一、Freemarker的介绍 Freemarker 是…...
制作一个视频网站/冯站长之家
**本文针对的是启明星系统的数据库备份与还原,这同样适合其他数据库。 数据库自动备份工具(最后更新时间2015.7.24):http://files.cnblogs.com/files/mqingqing123/dbback_release.rar (1)数据库如何备份&a…...
设计人才网官网/无锡百度关键词优化
本文章仅代表个人观点,如有错误缺漏,欢迎指正。广义切比雪夫滤波器原型是现在广泛使用的滤波器函数,因其把有切比雪夫滤波器无限元处的传输零点移到有限远处(可以是近带外),使近带外的抑制特性更好。1.广义切比雪夫滤波器原型由广…...
企业做的网站开发费如何入帐/有没有好用的网站推荐
Servlet API并不复杂,主要学习三个类: HttpServlet HttpServletRequest HttpServletResponse 这部分介绍HttpServlet类 HttpServlet 我们写Servlet代码的时候,第一步就是先创建类,继承自HTTPServlet并重写其中的某些方法 核心方法 1.init:在HttpServlet实例化之后被调用一…...
莱芜网站优化/谷歌搜索指数查询
参考STM32F407例程,外部SRAM章节。 关于时序的配置,主要是设置这7个参数,如果是SRAM,则只需关注前3个参数,和最后一个参数。 根据F427 datasheet也可以看出,前3个参数均设为0x01。 代码不一定对࿰…...