From 9e690fa91eb3fd59a3054f556a349c4ff1323655 Mon Sep 17 00:00:00 2001 From: guanyuming <12705544+guanyuming@user.noreply.gitee.com> Date: Thu, 6 Apr 2023 09:44:20 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guanyuming <12705544+guanyuming@user.noreply.gitee.com> --- "\346\272\220.cpp" | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 "\346\272\220.cpp" diff --git "a/\346\272\220.cpp" "b/\346\272\220.cpp" new file mode 100644 index 0000000..fbb749e --- /dev/null +++ "b/\346\272\220.cpp" @@ -0,0 +1,73 @@ +///*********************************************************************** +/// 轨道六根数变换位置速度 +/// @Author Guan Yuming +/// @Date 2023.04.06 +/// @Input +/// @Param m_SMajAx; 长半轴 a +/// @Param m_Ecc; 偏心率 e +/// @Param m_I; 轨道倾角 i +/// @Param m_RAAN; 升交点赤经 Omega +/// @Param m_ArgPeri; 近供点角 omega +/// @Param m_TrueA; 真近点角 theta +/// @Param m_p; 半通径 +/// @Param m_r; 地心坐标系中,中心天体-第二天体位置矢量 +/// @Param m_v; 地心坐标系中, 速度矢量 +/// @Param mtx_1,mtx_2,mtx_3 3个坐标变换矩阵 +/// @Param m1,m2 中心天体m1质量,第二天体质量m2 +/// @Output +/// 在参考坐标系下,物体坐标为(r*cos(trueA), r*sin(trueA), 0) +///*********************************************************************** +#include +#include +#include "AsVector.h" +#include "AsMatrix.h" +#include +#define G 6.67e-11 +using namespace std; +void AsOrb2RV(double sMajAx, double ecc, double i, double raan, double argPeri, double trueA, + double m1,double m2) +{ + double m_r,r, m_p;// 位置矢量和半通径 + if (ecc == 0 || ecc == 1) m_p = sMajAx; + else if (ecc > 1) m_p = -sMajAx*(1 - ecc*ecc); + else m_p = sMajAx*(1 - ecc*ecc); + r = m_p / (1 + ecc*cos(trueA)); //位置矢量和半通径关系 + //第二天体轨道面----中心天体轨道面,需进行3次坐标旋转变换 + //第一次按3 旋转 -raan + double pi = 3.1415926; + CMatrix mtx_1(cos(-raan), sin(-raan), 0, + -sin(-raan), cos(-raan), 0, + 0, 0, 1.0); + //第二次按1 旋转-i + CMatrix mtx_2(1.0, 0, 0, + 0, cos(-i), sin(-i), + 0, -sin(-i), cos(-i)); + //第三次旋转按3 旋转-argPeri + CMatrix mtx_3(cos(-argPeri), sin(-argPeri), 0, + -sin(-argPeri), cos(-argPeri), 0, + 0, 0, 1.0); + //初始位置矢量R + //CVector R(r*cos(trueA), r*sin(trueA),0); 不知道如何转置-,-! + CMatrix R(3, 1); + R[0] = r*cos(trueA); + R[1] = r*sin(trueA); + R[2] = 0; + m_r = mtx_3*mtx_2*mtx_1*R;//地心坐标系下的位置矢量 + //速度 + //由于运动中除了trueA,其余轨道根数均不变, + //且轨道六根数可唯一确定位置矢量,因此位置矢量是trueA的函数。 + //v=(dm_r/dtrueA)*(dtrueA/dt) + double miu,m_v; + miu = G*m1*m2; + CMatrix mtx_4(3, 1); + mtx_4[0] = -cos(raan)*(sin(argPeri + trueA) + ecc*sin(argPeri)) - + sin(raan)*(cos(argPeri + trueA) + + ecc*cos(argPeri))*cos(i); + mtx_4[1] = -sin(raan)*(sin(argPeri + trueA) + ecc*sin(argPeri)) + + cos(raan)*(cos(argPeri + trueA) + + ecc*cos(argPeri))*cos(i); + mtx_4[2] = (cos(argPeri + trueA) + ecc*cos(argPeri))*sin(i); + m_v = sqrt(miu / m_p)*mtx_4; + cout << "位置为:" << m_r << endl; + cout << "速度为:" << m_p << endl; +} \ No newline at end of file -- Gitee From 77f641d1a32c9108d6748aa02cb36e900b8e0f9f Mon Sep 17 00:00:00 2001 From: guanyuming <12705544+guanyuming@user.noreply.gitee.com> Date: Thu, 6 Apr 2023 11:02:06 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E6=BA=90.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\272\220.cpp" | 73 ---------------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 "\346\272\220.cpp" diff --git "a/\346\272\220.cpp" "b/\346\272\220.cpp" deleted file mode 100644 index fbb749e..0000000 --- "a/\346\272\220.cpp" +++ /dev/null @@ -1,73 +0,0 @@ -///*********************************************************************** -/// 轨道六根数变换位置速度 -/// @Author Guan Yuming -/// @Date 2023.04.06 -/// @Input -/// @Param m_SMajAx; 长半轴 a -/// @Param m_Ecc; 偏心率 e -/// @Param m_I; 轨道倾角 i -/// @Param m_RAAN; 升交点赤经 Omega -/// @Param m_ArgPeri; 近供点角 omega -/// @Param m_TrueA; 真近点角 theta -/// @Param m_p; 半通径 -/// @Param m_r; 地心坐标系中,中心天体-第二天体位置矢量 -/// @Param m_v; 地心坐标系中, 速度矢量 -/// @Param mtx_1,mtx_2,mtx_3 3个坐标变换矩阵 -/// @Param m1,m2 中心天体m1质量,第二天体质量m2 -/// @Output -/// 在参考坐标系下,物体坐标为(r*cos(trueA), r*sin(trueA), 0) -///*********************************************************************** -#include -#include -#include "AsVector.h" -#include "AsMatrix.h" -#include -#define G 6.67e-11 -using namespace std; -void AsOrb2RV(double sMajAx, double ecc, double i, double raan, double argPeri, double trueA, - double m1,double m2) -{ - double m_r,r, m_p;// 位置矢量和半通径 - if (ecc == 0 || ecc == 1) m_p = sMajAx; - else if (ecc > 1) m_p = -sMajAx*(1 - ecc*ecc); - else m_p = sMajAx*(1 - ecc*ecc); - r = m_p / (1 + ecc*cos(trueA)); //位置矢量和半通径关系 - //第二天体轨道面----中心天体轨道面,需进行3次坐标旋转变换 - //第一次按3 旋转 -raan - double pi = 3.1415926; - CMatrix mtx_1(cos(-raan), sin(-raan), 0, - -sin(-raan), cos(-raan), 0, - 0, 0, 1.0); - //第二次按1 旋转-i - CMatrix mtx_2(1.0, 0, 0, - 0, cos(-i), sin(-i), - 0, -sin(-i), cos(-i)); - //第三次旋转按3 旋转-argPeri - CMatrix mtx_3(cos(-argPeri), sin(-argPeri), 0, - -sin(-argPeri), cos(-argPeri), 0, - 0, 0, 1.0); - //初始位置矢量R - //CVector R(r*cos(trueA), r*sin(trueA),0); 不知道如何转置-,-! - CMatrix R(3, 1); - R[0] = r*cos(trueA); - R[1] = r*sin(trueA); - R[2] = 0; - m_r = mtx_3*mtx_2*mtx_1*R;//地心坐标系下的位置矢量 - //速度 - //由于运动中除了trueA,其余轨道根数均不变, - //且轨道六根数可唯一确定位置矢量,因此位置矢量是trueA的函数。 - //v=(dm_r/dtrueA)*(dtrueA/dt) - double miu,m_v; - miu = G*m1*m2; - CMatrix mtx_4(3, 1); - mtx_4[0] = -cos(raan)*(sin(argPeri + trueA) + ecc*sin(argPeri)) - - sin(raan)*(cos(argPeri + trueA) + - ecc*cos(argPeri))*cos(i); - mtx_4[1] = -sin(raan)*(sin(argPeri + trueA) + ecc*sin(argPeri)) + - cos(raan)*(cos(argPeri + trueA) + - ecc*cos(argPeri))*cos(i); - mtx_4[2] = (cos(argPeri + trueA) + ecc*cos(argPeri))*sin(i); - m_v = sqrt(miu / m_p)*mtx_4; - cout << "位置为:" << m_r << endl; - cout << "速度为:" << m_p << endl; -} \ No newline at end of file -- Gitee From 3680405704fc35eac246e6c74089301624b2e87e Mon Sep 17 00:00:00 2001 From: guanyuming <12705544+guanyuming@user.noreply.gitee.com> Date: Thu, 13 Apr 2023 06:04:05 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E8=BD=A8=E9=81=93=E5=85=AD=E6=A0=B9?= =?UTF-8?q?=E6=95=B0=E8=BD=AC=E4=BD=8D=E7=BD=AE=E9=80=9F=E5=BA=A6=E5=A4=B4?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guanyuming <12705544+guanyuming@user.noreply.gitee.com> --- AstroLib/Include/AsOrbElemToCart.h | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 AstroLib/Include/AsOrbElemToCart.h diff --git a/AstroLib/Include/AsOrbElemToCart.h b/AstroLib/Include/AsOrbElemToCart.h new file mode 100644 index 0000000..fac029c --- /dev/null +++ b/AstroLib/Include/AsOrbElemToCart.h @@ -0,0 +1,6 @@ +#include +#include +#include "AstroLib.h" +#include +using namespace std; +bool AsOrbElemToCart(const COrbElem& Orb, double m1, double m2, CCoord& cartPos, CCoord & cartVel); -- Gitee From 3bf897f95eabc9898cdd867c6560c9accf351092 Mon Sep 17 00:00:00 2001 From: guanyuming <12705544+guanyuming@user.noreply.gitee.com> Date: Thu, 13 Apr 2023 06:05:02 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=E8=BD=A8=E9=81=93=E5=85=AD=E6=A0=B9?= =?UTF-8?q?=E6=95=B0=E8=BD=AC=E4=BD=8D=E7=BD=AE=E9=80=9F=E5=BA=A6-?= =?UTF-8?q?=E6=BA=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guanyuming <12705544+guanyuming@user.noreply.gitee.com> --- AstroLib/AsOrbElemToCart.cpp | 107 +++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 AstroLib/AsOrbElemToCart.cpp diff --git a/AstroLib/AsOrbElemToCart.cpp b/AstroLib/AsOrbElemToCart.cpp new file mode 100644 index 0000000..abf5dee --- /dev/null +++ b/AstroLib/AsOrbElemToCart.cpp @@ -0,0 +1,107 @@ +///*********************************************************************** +/// 轨道六根数变换位置速度 +/// @Author Guan Yuming +/// @Date 2023.04.06 +/// @Input +/// @Param m_SMajAx; 长半轴 a +/// @Param m_Ecc; 偏心率 e +/// @Param m_I; 轨道倾角 i +/// @Param m_RAAN; 升交点赤经 Omega +/// @Param m_ArgPeri; 近供点角 omega +/// @Param m_TrueA; 真近点角 theta +/// @Param m_p; 半通径 +/// @Param m_r; 地心坐标系中,中心天体-第二天体位置矢量 +/// @Param m_v; 地心坐标系中, 速度矢量 +/// @Param mtx_1,mtx_2,mtx_3 3个坐标变换矩阵 +/// @Param m1,m2 中心天体m1质量,第二天体质量m2 +/// @Output +/// 在参考坐标系下,物体坐标为(r*cos(trueA), r*sin(trueA), 0) +/// 统一单位 m kg rad double earth_m1 = 5.97237e24, air_m2 = 8500.0 +///*********************************************************************** +#include +#include +#include "AstroLib.h" +#include +#include "AsOrbElemToCart.h" +#define G 6.67e-11 +using namespace std; +bool AsOrbElemToCart(const COrbElem& Orb, double m1, double m2, CCoord& cartPos, CCoord & cartVel) +{ + //异常状态 + if ( + //质量异常 + m1 <= 0 || m2 <= 0 || + //半长轴异常 + Orb.m_SMajAx <= 6371e3 || + //偏心率异常 + Orb.m_Ecc < 0 || + //轨道倾角异常 + Orb.m_I<0 ||Orb.m_I>AsCPI || + //升交点赤经异常 + Orb.m_RAAN < -AsCPI || Orb.m_RAAN > 2 * AsCPI || + //近供点角异常 + Orb.m_ArgPeri < 0 || Orb.m_ArgPeri> 2 * AsCPI || + //真近点角异常 + Orb.m_TrueA < -AsCPI || Orb.m_TrueA> 2 * AsCPI || + //角度关系异常 + (Orb.m_Ecc >= 1 && Orb.m_TrueA >= AsCPI - acos(1.0 / Orb.m_Ecc) && + Orb.m_TrueA <= AsCPI + acos(1.0 / Orb.m_Ecc)) + ) + { + cout << "One of the six elements or m1 or m2 is wrong" << endl; + return false; + } + else + { + // 位置矢量和半通径 + double r, m_p; + //根据ecc判断轨道形状,决定半通径取值 + if (Orb.m_Ecc == 0 || Orb.m_Ecc == 1) + m_p = Orb.m_SMajAx; + else if (Orb.m_Ecc > 1) + m_p = -Orb.m_SMajAx*(1 - Orb.m_Ecc*Orb.m_Ecc); + else + m_p = Orb.m_SMajAx*(1 - Orb.m_Ecc*Orb.m_Ecc); + //位置矢量和半通径关系 + r = m_p / (1 + Orb.m_Ecc*cos(Orb.m_TrueA)); + /* + //第二天体轨道面-中心天体轨道面,需进行3次坐标旋转变换 + //第一次按3 旋转 -raan + CMatrix mtx_1(cos(-Orb.m_RAAN), sin(-Orb.m_RAAN), 0, + -sin(-Orb.m_RAAN), cos(-Orb.m_RAAN), 0, + 0, 0, 1.0); + //第二次按1 旋转-i + CMatrix mtx_2(1.0, 0, 0, + 0, cos(-Orb.m_I), sin(-Orb.m_I), + 0, -sin(-Orb.m_I), cos(-Orb.m_I)); + //第三次旋转按3 旋转-argPeri + CMatrix mtx_3(cos(-Orb.m_ArgPeri), sin(-Orb.m_ArgPeri), 0, + -sin(-Orb.m_ArgPeri), cos(-Orb.m_ArgPeri), 0, + 0, 0, 1.0); + CMatrix R(3, 1);//初始位置矢量R + R[0][0] = r*cos(Orb.m_TrueA); + R[1][0] = r*sin(Orb.m_TrueA); + R[2][0] = 0; + */ + //位置,同时换算为km + cartPos[0] = -1*r*(cos(Orb.m_RAAN)*cos(Orb.m_ArgPeri + Orb.m_TrueA) - sin(Orb.m_RAAN)*sin(Orb.m_ArgPeri + Orb.m_TrueA)*cos(Orb.m_I))/1000; + cartPos[1] = -1*r*(sin(Orb.m_RAAN)*cos(Orb.m_ArgPeri + Orb.m_TrueA) + cos(Orb.m_RAAN)*sin(Orb.m_ArgPeri + Orb.m_TrueA)*cos(Orb.m_I)) / 1000; + cartPos[2] = -1*r*sin(Orb.m_RAAN + Orb.m_ArgPeri)*sin(Orb.m_I) / 1000; + //速度 + //由于运动中除了trueA,其余轨道根数均不变,且轨道六根数可唯一确定位置矢量,因此位置矢量是trueA的函数。 + //v=(dm_r/dtrueA)*(dtrueA/dt) + double miu; + miu = G*(m1 + m2); + //m/s换算为km/s + cartVel[0] = (-cos(Orb.m_RAAN)*(sin(Orb.m_ArgPeri + Orb.m_TrueA) + Orb.m_Ecc*sin(Orb.m_ArgPeri)) - + sin(Orb.m_RAAN)*(cos(Orb.m_ArgPeri + Orb.m_TrueA) + + Orb.m_Ecc*cos(Orb.m_ArgPeri))*cos(Orb.m_I))*sqrt(miu / m_p)/1000*(-1); + cartVel[1] = (-sin(Orb.m_RAAN)*(sin(Orb.m_ArgPeri + Orb.m_TrueA) + Orb.m_Ecc*sin(Orb.m_ArgPeri)) + + cos(Orb.m_RAAN)*(cos(Orb.m_ArgPeri + Orb.m_TrueA) + + Orb.m_Ecc*cos(Orb.m_ArgPeri))*cos(Orb.m_I))*sqrt(miu / m_p) / 1000 * (-1); + cartVel[2] = ((cos(Orb.m_ArgPeri + Orb.m_TrueA) + + Orb.m_Ecc*cos(Orb.m_ArgPeri))*sin(Orb.m_I))*sqrt(miu / m_p) / 1000 * (-1); + return true; + } +} + -- Gitee