卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
來源:軌道機動算法的C++實現_shirro123的專欄-CSDN博客
衛星軌道推演計算相關基礎知識點總結
??????????? 一、衛星的運動特性
??????????? 二、衛星的空間坐標系
??????????????? (1)地心慣性坐標系(ECI×J2000歷元坐標系)(ECSF 地心空間坐標系)
??????????????? (2)地心固定坐標系(ECF)(WGS84坐標系)
??????????????? (3)地心地固坐標系(ECEF)
??????????????? (4)地心橢球慣性坐標系(ECEI)(地心黃道慣性坐標系)
??????????? 三、根據軌道根數計算衛星位置
??????????????? (1)計算衛星在軌道坐標系下的位置
??????????????? (2)軌道坐標系與大地坐標系間的換算
??????????????? (3)軌道坐標系與大地坐標系間的換算
??????????? 四、空間幾何關系相關知識點及C++代碼
??????????????? (1)歐拉角、旋轉向量和旋轉矩陣的相互轉換
??? 近期在補衛星仿真領域的相關基礎知識,并總結一些衛星軌道計算的算法與工具類代碼函數。
??? 參考內容見百度公開文庫文檔與PPT:
??? https://max.book118.com/html/2019/0309/5304232023002020.shtm
??? https://wenku.baidu.com/view/e231b968a32d7375a417806b.html?rec_flag=default&fr=Recommend_RelativeDoc-60272,60321,40155,40311,40251,60314,40300-kpdrec_doc_pc_view-bf93f0936bec0975f465e2dd&sxts=1629169656038
一、衛星的運動特性
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
二、衛星的空間坐標系
(1)地心慣性坐標系(ECI×J2000歷元坐標系)(ECSF 地心空間坐標系)
地心慣性坐標系是太陽系內的一個慣性坐標系,不隨地球而轉動,也不受地球、DAC6574IDGS太陽運行的章動和歲差的影響。其坐標原點位于地心Oe;OeX軸位于赤道平面內,指向特定某一年(歷元時刻)的太陽春分點位置,每年春分點均會發生變動;OeZ軸指向某一年(歷元時刻)地球北極的平均位置處,即地球平均自轉極點(CIO);OcY軸位于赤道平面內,與0eX軸垂直,且與OeX、OeZ構成滿足右手定則的笛卡兒直角坐標系。
由于采用的歷元時間不同,可以有各種不同的地心慣性坐標系,目前國際上通用的地心慣性坐標系是J2000歷元坐標系,它是以公元2000年的春分點為基準的歷元坐標系。
(2)地心固定坐標系(ECF)(WGS84坐標系)
如圖所示,地心固定坐標系的坐標原點位于地心Oe,OeZ軸指向地球北極,OeX軸位于赤道平面內指向地理經度的零點,OeY軸根據右手定則確定。地心固定坐標系為笛卡爾直角坐標系,該坐標系在宇宙空間中相對地球靜止,伴隨地球自轉和公轉。
在這里插入圖片描述
(3)地心地固坐標系(ECEF)
地心地固坐標系的坐標原點位于地心Oe,OeZ軸指向地球平均自轉極點(CIO),OeX軸位于赤道平面內指向子午線與赤道交點,OeY軸根據右手定則確定。地心地固坐標系為笛卡爾直角坐標系,該坐標系在宇宙空間中相對地球靜止,伴隨地球自轉和公轉。
(4)地心橢球慣性坐標系(ECEI)(地心黃道慣性坐標系)
地心橢球慣性坐標系的坐標原點位于地心Oe,OeZ軸指向橢球極軸(黃道極-地球公轉 軌跡在地球表面投影軌跡形成),OeX軸位于赤道平面內,指向特定某一年(歷元時刻)的太陽春分點位置,每年春分點均會發生變動,OeY軸根據右手定則確定。地心地固坐標系為笛卡爾直角坐標系,該坐標系在宇宙空間中相對地球靜止,伴隨地球自轉和公轉。
三、根據軌道根數計算衛星位置
(1)計算衛星在軌道坐標系下的位置
軌道根數(或稱軌道要素或軌道參數)是描述在牛頓運動定律和牛頓萬有引力定律的作用下的天體或航天器,在其開普勒軌道上運動時,確定其軌道所必要的六個參數。由于運動的方式有許多種的參數表示法,依照選定的測量裝置不同,對相同的軌道,有幾種不同的方式來定義軌道根數。
軌道半長軸:橢圓軌道長軸的一半,有時可視作平均軌道半徑。
軌道離心率:為橢圓扁平程度的一種量度,定義是橢圓兩焦點間的距離與長軸長度的比值。 就是e=c/a。
軌道傾角:行星軌道面對黃道面的傾角;在升交點處從黃道面逆時針方向量到行星軌道面的角度。
升交點赤經:行星軌道升交點的黃道經度。
近日點幅角:從升交點沿行星運動軌道逆時針量到近日點的角度。
平近點角:行星對應于t0時衛星的平近點角。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(2)軌道坐標系與大地坐標系間的換算
在這里插入圖片描述
在這里插入圖片描述
(3)軌道坐標系與大地坐標系間的換算
在這里插入圖片描述
在這里插入圖片描述
四、空間幾何關系相關知識點及C++代碼
(1)歐拉角、旋轉向量和旋轉矩陣的相互轉換
在這里插入圖片描述
任何一個旋轉可以表示為依次繞著三個旋轉軸旋三個角度的組合,這三個角度成為歐拉角。對于在三維空間里的一個參考系,任何坐標系的取向都可以用歐拉角來表示,如圖所示,藍色為起始坐標系,紅色為旋轉之后的坐標系。
在這里插入圖片描述
因此歐拉角轉為旋轉矩陣的公式如下:
在這里插入圖片描述
歐拉角和旋轉矩陣相互轉換的C++代碼如下所示:
Mat eulerAnglesToRotationMatrix(Vec3f &theta)
{
??? // Calculate rotation about x axis
??? Mat R_x = (Mat_<double>(3,3) <<
??????? 1,?????? 0,????????????? 0,
??????? 0,?????? cos(theta[0]),?? -sin(theta[0]),
??????? 0,?????? sin(theta[0]),?? cos(theta[0])
??? );
??? // Calculate rotation about y axis
??? Mat R_y = (Mat_<double>(3,3) <<
??????? cos(theta[1]),??? 0,????? sin(theta[1]),
??????? 0,?????????????? 1,????? 0,
??????? -sin(theta[1]),?? 0,????? cos(theta[1])
??? );
??? // Calculate rotation about z axis
??? Mat R_z = (Mat_<double>(3,3) <<
??????? cos(theta[2]),??? -sin(theta[2]),????? 0,
??????? sin(theta[2]),??? cos(theta[2]),?????? 0,
??????? 0,?????????????? 0,????????????????? 1
??? );
??? // Combined rotation matrix
??? Mat R = R_z * R_y * R_x;
??? return R;
}
Vec3f rotationMatrixToEulerAngles(Mat &R)
{
??? float sy = sqrt(R.at<double>(0,0) * R.at<double>(0,0) +? R.at<double>(1,0) * R.at<double>(1,0) );
??? bool singular = sy < 1e-6; // If
??? float x, y, z;
??? if (!singular)
??? {
??????? x = atan2(R.at<double>(2,1) , R.at<double>(2,2));
??????? y = atan2(-R.at<double>(2,0), sy);
??????? z = atan2(R.at<double>(1,0), R.at<double>(0,0));
??? }
??? else
??? {
??????? x = atan2(-R.at<double>(1,2), R.at<double>(1,1));
??????? y = atan2(-R.at<double>(2,0), sy);
??????? z = 0;
??? }
??? #if 1
??? x = x*180.0f/3.141592653589793f;
??? y = y*180.0f/3.141592653589793f;
??? z = z*180.0f/3.141592653589793f;
??? #endif
??? return Vec3f(x, y, z);
}
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16
??? 17
??? 18
??? 19
??? 20
??? 21
??? 22
??? 23
??? 24
??? 25
??? 26
??? 27
??? 28
??? 29
??? 30
??? 31
??? 32
??? 33
??? 34
??? 35
??? 36
??? 37
??? 38
??? 39
??? 40
??? 41
??? 42
??? 43
??? 44
??? 45
??? 46
??? 47
??? 48
這里存一下項目開發過程中常用的一些計算需求,例如根據旋轉前后的兩個向量求二者之間的旋轉矩陣,C++代碼如下所示:
AcGeVector3d CrossProduct(AcGeVector3d a, AcGeVector3d b)
{
?? ?AcGeVector3d c;
?? ?c.x = a.y * b.z - a.z * b.y;
?? ?c.y = a.z * b.x - a.x * b.z;
?? ?c.z = a.x * b.y - a.y * b.x;
?? ?return c;
}
double DotProduct(AcGeVector3d a, AcGeVector3d b)
{
?? ?double result;
?? ?//result = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
?? ?result = a.x * b.x + a.y * b.y + a.z * b.z;
?? ?return result;
}
double Absolute(AcGeVector3d v)
{
?? ?double result;
?? ?result = sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
?? ?return result;
}
AcGeMatrix3d RotationMatrix(double angle, AcGeVector3d u)
{
?? ?double norm = Absolute(u);
?? ?u.x = u.x / norm;
?? ?u.y = u.y / norm;
?? ?u.z = u.z / norm;
?? ?AcGeMatrix3d rotatinMatrix;
?? ?rotatinMatrix.entry[0][0] = cos(angle) + u.x * u.x * (1 - cos(angle));
?? ?rotatinMatrix.entry[0][1] = u.x * u.y * (1 - cos(angle)) - u.z * sin(angle);
?? ?rotatinMatrix.entry[0][2] = u.y * sin(angle) + u.x * u.z * (1 - cos(angle));
?? ?rotatinMatrix.entry[0][3] = 0.0;
?? ?rotatinMatrix.entry[1][0] = u.z * sin(angle) + u.x * u.y * (1 - cos(angle));
?? ?rotatinMatrix.entry[1][1] = cos(angle) + u.y * u.y * (1 - cos(angle));
?? ?rotatinMatrix.entry[1][2] = -u.x * sin(angle) + u.y * u.z * (1 - cos(angle));
?? ?rotatinMatrix.entry[1][3] = 0.0;
?? ?rotatinMatrix.entry[2][0] = -u.y * sin(angle) + u.x * u.z * (1 - cos(angle));
?? ?rotatinMatrix.entry[2][1] = u.x * sin(angle) + u.y * u.z * (1 - cos(angle));
?? ?rotatinMatrix.entry[2][2] = cos(angle) + u.z * u.z * (1 - cos(angle));
?? ?rotatinMatrix.entry[2][3] = 0.0;
?? ?rotatinMatrix.entry[3][0] = 0.0;
?? ?rotatinMatrix.entry[3][1] = 0.0;
?? ?rotatinMatrix.entry[3][2] = 0.0;
?? ?rotatinMatrix.entry[3][3] = 1.0;
?? ?return rotatinMatrix;
}
AcGeMatrix3d CalculationMtrix(AcGeVector3d vectorBefore, AcGeVector3d vectorAfter)
{
?? ?double rotationAngle = acos(DotProduct(vectorBefore, vectorAfter) / Absolute(vectorBefore) / Absolute(vectorAfter));
?? ?AcGeVector3d rotationAxis = CrossProduct(vectorBefore, vectorAfter);
?? ?AcGeMatrix3d rotationMatrix = RotationMatrix(rotationAngle, rotationAxis);
?? ?return rotationMatrix;
}
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16
??? 17
??? 18
??? 19
??? 20
??? 21
??? 22
??? 23
??? 24
??? 25
??? 26
??? 27
??? 28
??? 29
??? 30
??? 31
??? 32
??? 33
??? 34
??? 35
??? 36
??? 37
??? 38
??? 39
??? 40
??? 41
??? 42
??? 43
??? 44
??? 45
??? 46
??? 47
??? 48
??? 49
??? 50
??? 51
??? 52
??? 53
??? 54
??? 55
??? 56
??? 57
??? 58
??? 59
??? 60
??? 61
??? 62
??? 63
未完待續 ,后面如果又涉及到衛星仿真的相關項目再進行更新完善。
努力補課的喬木小姐
————————————————
版權聲明:本文為CSDN博主「碼代碼的喬木」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/nannan7777/article/details/119752362
總結
以上是生活随笔為你收集整理的卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国务院办公厅关于2022年部分节假日安排
- 下一篇: 什么是卫星轨道?