根据卫星运动矢量计算轨道六根数
前言
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…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
