根据卫星运动矢量计算轨道六根数

这篇具有很好参考价值的文章主要介绍了根据卫星运动矢量计算轨道六根数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

STK软件在给定六根数时,可求得卫星位置和速度矢量,但有时我们通过星历参数得到卫星的位置和速度矢量,希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。

计算过程

给定卫星在J2000坐标系下的的位置矢量r和速度矢量v

  1. 利用卫星动量矩计算轨道倾角升交点赤径
    计算卫星相对于地心的动量矩,该动量矩等于卫星地心矩矢量和速度矢量的矢积: h = r × v \textbf{h}=\textbf{r}×\textbf{v} h=r×v,动量矩的方向和卫星轨道面的法线是平行的,动量矩和Z轴夹角为轨道倾角 i i i,轨道平面和地球赤道平面的交线为节线ON;节线ON与X轴夹角为升交点赤径 Ω \Omega Ω ( i , Ω ) (i,\Omega) (i,Ω)确定了轨道平面在空间坐标系中的方位。
    i = a r c c o s ( h x / h ) , Ω = a r c t a n ( − h x / h y ) i=arccos(h_x/h), \Omega=arctan(-h_x/h_y) i=arccos(hx/h),Ω=arctan(hx/hy)根据卫星运动矢量计算轨道六根数
  2. 利用卫星机械能计算轨道半长轴
    E = v 2 / 2 − μ / r , E = − μ / 2 a E=v^2/2-\mu/r, E=-\mu/2a E=v2/2μ/r,E=μ/2a
    其中 h h h为动量矩模值, μ \mu μ为引力常量:398600.44
    k m 3 / s 2 {km^3}/s^2 km3/s2 v v v为速度矢量模值, r r r为位置矢量模值, a a a为椭圆轨道半长轴。
  3. 利用轨道半通经和轨道半长轴计算椭圆轨道偏心率
    p = h 2 / μ , e = ( 1 − ( p / a ) ) p=h^2/\mu, e=\sqrt{(1-(p/a))} p=h2/μ,e=(1(p/a))
    其中, p p p为半通径, e e e为偏心率。
  4. 利用偏心率、半通经和位置矢量模值计算真近点角
    f = a r c c o s ( p − r ) / r e f=arccos{(p-r)/re} f=arccos(pr)/re
  5. 利用真近点角和升交点幅角计算近地点辐角
    ω = u − f , u = a r c c o s ( ON ⋅ r / ( r ∗ O N ) ) \omega=u-f, u=arccos(\textbf{ON} \cdot \textbf{r} /({r*ON})) ω=uf,u=arccos(ONr/(rON))
    其中,升交点幅角为节线ON矢量与卫星位置矢量的夹角。
    ON = ( c o s Ω , s i n Ω , 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{ };       //轨道倾角:deg
    double RAAN{ };             //升交点赤经:deg    :计算结果差180
    double semimajorAxis{};     //半长轴:km  6917.21
    double Eccentricity{};    //偏心率:

    double argumentOfPerigee{};  //近地点辐角:deg  :
    double trueAnomaly{  };  //真近点角 :主要考虑什么时候要对称变换,因为acos只能输出0—pi,而目标区间范围0—2pi
};
struct Motion {//J2000
    double location[3]{};   //位置:x、y、z  km
    double 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—2pi
        opa.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; //卫星的机械能E
    opa.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—2pi
        opa.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(矢量的矢积)
	//J2000
	double location[3]={ sat_x_g,sat_y_g,sat_z_g };   //位置:x、y、z  km
	double 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—2pi
		opa.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; //卫星的机械能E
	opa.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—2pi
		opa.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;

}

总结

该文实现了通过卫星星历参数反演得出卫星轨道的六根数。文章来源地址https://www.toymoban.com/news/detail-405730.html

到了这里,关于根据卫星运动矢量计算轨道六根数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D根据物体运动画出实体轨迹线

    在Unity3D根据物体运动画出实体轨迹线 在Inspector里面添加组件LineRender,线条圆滑设置如下, 颜色可以新建材质直接拖上该物体上就行。 添加脚本LineMark 将上面的Line放在OBS里面,对应需要画出的物体直接拖入右侧的 — 小技巧:想画出对应阶段的轨迹曲线可以通过启用和不启

    2024年02月12日
    浏览(65)
  • 【计算机网络】——前言计算机网络发展的历程概述

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记: Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算

    2024年02月08日
    浏览(55)
  • python 进行卫星坐标计算和接收机坐标计算

    python 进行卫星坐标计算和接收机坐标计算 卫星坐标计算 流程以及相关公式 从上一篇文章中我们获取到了广播星历中的文件(N文件读取),通过N文件中的数据以及周内秒我们可以计算出卫星的坐标。Python读取O文件以及N文件_Hxdih的博客-CSDN博客 在计算卫星坐标时,我们需要做到

    2024年02月03日
    浏览(44)
  • nodejs+vue城市轨道交通线路查询系统-计算机毕业设计

    着社会的快速发展,计算机的影响是全面且深入的。社会生产水平的不断提高,日常生活中人们对备忘记账系统方面的要求也在不断提高,因特网的使用越来越广泛,而在众多的因特网中,万维网更是为人们带来了新鲜的体验。在这当中,由互联网平台进行的工作是比较受欢

    2024年02月08日
    浏览(55)
  • 微软行星云计算——卫星图像数据源配准

    卫星图像数据源配准 在本教程中,您将学习如何在 Planetary Computer 上使用 stackstac 将来自 Sentinel-2 Level 2A 和 Landsat Collection 2 Level-2 的两个空间重叠栅格图像配准(对齐)到一个数据集中。然后,您将计算所得数据集的归一化差异植被指数 (NDVI),并将其与基于原始数据的 NDVI 进

    2024年02月10日
    浏览(47)
  • 【python】利用广播星历计算BDS卫星的位置

    前言 本程序为《卫星导航定位基础》大作业之二,功能为实现对广播星历文件的读取和处理,计算出北斗卫星的位置坐标,并绘制出二维和三维的卫星位置分布图。若需要对其他类型卫星数据处理,可根据本程序修改增进。 本文章部分代码借鉴于@学测绘的小杨【python】读取

    2024年04月13日
    浏览(38)
  • FifthOne:用于矢量搜索的计算机视觉接口

             数据太多了。数据湖和数据仓库;广阔的像素牧场和充满文字的海洋。找到 正确的 数据就像大海捞针一样!如果你喜欢开源机器学习库 FiftyOne,矢量搜索引擎通过将复杂数据(图像的原始像素值、文本文档中的字符)转换为称为嵌入矢量的实体来解决此问题。   

    2024年02月12日
    浏览(43)
  • 全国大学生数字建模竞赛、中国研究生数学建模竞赛(数学建模与计算实验)前言

    1.什么是数学建模 2.所需要学的知识,知识算法分类表格汇总 3.所需要的软件工具 4.论文模板,查找文献,查找数据   全国大学生数字建模竞赛(National College Student Mathematical Modeling Contest)是中国的一项全国性大学生竞赛活动,旨在 提高大学生的数学建模能力和创新思维,

    2024年02月15日
    浏览(62)
  • NTP时钟同步服务器(卫星授时服务)在云计算数据机房的应用

    NTP时钟同步服务器(卫星授时服务)在云计算数据机房的应用 NTP时钟同步服务器(卫星授时服务)在云计算数据机房的应用 1、云计算定义与特点 云计算概念定义 现阶段广为被接受的定义来自于每个国家标准与技术研究院(NIST),如下: 云计算是一种按需交付的资源模式,

    2024年02月04日
    浏览(47)
  • 深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.com/da

    2024年02月03日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包