卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
來源:軌道機(jī)動(dòng)算法的C++實(shí)現(xiàn)_shirro123的專欄-CSDN博客
衛(wèi)星軌道推演計(jì)算相關(guān)基礎(chǔ)知識(shí)點(diǎn)總結(jié)
??????????? 一、衛(wèi)星的運(yùn)動(dòng)特性
??????????? 二、衛(wèi)星的空間坐標(biāo)系
??????????????? (1)地心慣性坐標(biāo)系(ECI×J2000歷元坐標(biāo)系)(ECSF 地心空間坐標(biāo)系)
??????????????? (2)地心固定坐標(biāo)系(ECF)(WGS84坐標(biāo)系)
??????????????? (3)地心地固坐標(biāo)系(ECEF)
??????????????? (4)地心橢球慣性坐標(biāo)系(ECEI)(地心黃道慣性坐標(biāo)系)
??????????? 三、根據(jù)軌道根數(shù)計(jì)算衛(wèi)星位置
??????????????? (1)計(jì)算衛(wèi)星在軌道坐標(biāo)系下的位置
??????????????? (2)軌道坐標(biāo)系與大地坐標(biāo)系間的換算
??????????????? (3)軌道坐標(biāo)系與大地坐標(biāo)系間的換算
??????????? 四、空間幾何關(guān)系相關(guān)知識(shí)點(diǎn)及C++代碼
??????????????? (1)歐拉角、旋轉(zhuǎn)向量和旋轉(zhuǎn)矩陣的相互轉(zhuǎn)換
??? 近期在補(bǔ)衛(wèi)星仿真領(lǐng)域的相關(guān)基礎(chǔ)知識(shí),并總結(jié)一些衛(wèi)星軌道計(jì)算的算法與工具類代碼函數(shù)。
??? 參考內(nèi)容見百度公開文庫文檔與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
一、衛(wèi)星的運(yùn)動(dòng)特性
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
二、衛(wèi)星的空間坐標(biāo)系
(1)地心慣性坐標(biāo)系(ECI×J2000歷元坐標(biāo)系)(ECSF 地心空間坐標(biāo)系)
地心慣性坐標(biāo)系是太陽系內(nèi)的一個(gè)慣性坐標(biāo)系,不隨地球而轉(zhuǎn)動(dòng),也不受地球、DAC6574IDGS太陽運(yùn)行的章動(dòng)和歲差的影響。其坐標(biāo)原點(diǎn)位于地心Oe;OeX軸位于赤道平面內(nèi),指向特定某一年(歷元時(shí)刻)的太陽春分點(diǎn)位置,每年春分點(diǎn)均會(huì)發(fā)生變動(dòng);OeZ軸指向某一年(歷元時(shí)刻)地球北極的平均位置處,即地球平均自轉(zhuǎn)極點(diǎn)(CIO);OcY軸位于赤道平面內(nèi),與0eX軸垂直,且與OeX、OeZ構(gòu)成滿足右手定則的笛卡兒直角坐標(biāo)系。
由于采用的歷元時(shí)間不同,可以有各種不同的地心慣性坐標(biāo)系,目前國(guó)際上通用的地心慣性坐標(biāo)系是J2000歷元坐標(biāo)系,它是以公元2000年的春分點(diǎn)為基準(zhǔn)的歷元坐標(biāo)系。
(2)地心固定坐標(biāo)系(ECF)(WGS84坐標(biāo)系)
如圖所示,地心固定坐標(biāo)系的坐標(biāo)原點(diǎn)位于地心Oe,OeZ軸指向地球北極,OeX軸位于赤道平面內(nèi)指向地理經(jīng)度的零點(diǎn),OeY軸根據(jù)右手定則確定。地心固定坐標(biāo)系為笛卡爾直角坐標(biāo)系,該坐標(biāo)系在宇宙空間中相對(duì)地球靜止,伴隨地球自轉(zhuǎn)和公轉(zhuǎn)。
在這里插入圖片描述
(3)地心地固坐標(biāo)系(ECEF)
地心地固坐標(biāo)系的坐標(biāo)原點(diǎn)位于地心Oe,OeZ軸指向地球平均自轉(zhuǎn)極點(diǎn)(CIO),OeX軸位于赤道平面內(nèi)指向子午線與赤道交點(diǎn),OeY軸根據(jù)右手定則確定。地心地固坐標(biāo)系為笛卡爾直角坐標(biāo)系,該坐標(biāo)系在宇宙空間中相對(duì)地球靜止,伴隨地球自轉(zhuǎn)和公轉(zhuǎn)。
(4)地心橢球慣性坐標(biāo)系(ECEI)(地心黃道慣性坐標(biāo)系)
地心橢球慣性坐標(biāo)系的坐標(biāo)原點(diǎn)位于地心Oe,OeZ軸指向橢球極軸(黃道極-地球公轉(zhuǎn) 軌跡在地球表面投影軌跡形成),OeX軸位于赤道平面內(nèi),指向特定某一年(歷元時(shí)刻)的太陽春分點(diǎn)位置,每年春分點(diǎn)均會(huì)發(fā)生變動(dòng),OeY軸根據(jù)右手定則確定。地心地固坐標(biāo)系為笛卡爾直角坐標(biāo)系,該坐標(biāo)系在宇宙空間中相對(duì)地球靜止,伴隨地球自轉(zhuǎn)和公轉(zhuǎn)。
三、根據(jù)軌道根數(shù)計(jì)算衛(wèi)星位置
(1)計(jì)算衛(wèi)星在軌道坐標(biāo)系下的位置
軌道根數(shù)(或稱軌道要素或軌道參數(shù))是描述在牛頓運(yùn)動(dòng)定律和牛頓萬有引力定律的作用下的天體或航天器,在其開普勒軌道上運(yùn)動(dòng)時(shí),確定其軌道所必要的六個(gè)參數(shù)。由于運(yùn)動(dòng)的方式有許多種的參數(shù)表示法,依照選定的測(cè)量裝置不同,對(duì)相同的軌道,有幾種不同的方式來定義軌道根數(shù)。
軌道半長(zhǎng)軸:橢圓軌道長(zhǎng)軸的一半,有時(shí)可視作平均軌道半徑。
軌道離心率:為橢圓扁平程度的一種量度,定義是橢圓兩焦點(diǎn)間的距離與長(zhǎng)軸長(zhǎng)度的比值。 就是e=c/a。
軌道傾角:行星軌道面對(duì)黃道面的傾角;在升交點(diǎn)處從黃道面逆時(shí)針方向量到行星軌道面的角度。
升交點(diǎn)赤經(jīng):行星軌道升交點(diǎn)的黃道經(jīng)度。
近日點(diǎn)幅角:從升交點(diǎn)沿行星運(yùn)動(dòng)軌道逆時(shí)針量到近日點(diǎn)的角度。
平近點(diǎn)角:行星對(duì)應(yīng)于t0時(shí)衛(wèi)星的平近點(diǎn)角。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(2)軌道坐標(biāo)系與大地坐標(biāo)系間的換算
在這里插入圖片描述
在這里插入圖片描述
(3)軌道坐標(biāo)系與大地坐標(biāo)系間的換算
在這里插入圖片描述
在這里插入圖片描述
四、空間幾何關(guān)系相關(guān)知識(shí)點(diǎn)及C++代碼
(1)歐拉角、旋轉(zhuǎn)向量和旋轉(zhuǎn)矩陣的相互轉(zhuǎn)換
在這里插入圖片描述
任何一個(gè)旋轉(zhuǎn)可以表示為依次繞著三個(gè)旋轉(zhuǎn)軸旋三個(gè)角度的組合,這三個(gè)角度成為歐拉角。對(duì)于在三維空間里的一個(gè)參考系,任何坐標(biāo)系的取向都可以用歐拉角來表示,如圖所示,藍(lán)色為起始坐標(biāo)系,紅色為旋轉(zhuǎn)之后的坐標(biāo)系。
在這里插入圖片描述
因此歐拉角轉(zhuǎn)為旋轉(zhuǎn)矩陣的公式如下:
在這里插入圖片描述
歐拉角和旋轉(zhuǎn)矩陣相互轉(zhuǎn)換的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
這里存一下項(xiàng)目開發(fā)過程中常用的一些計(jì)算需求,例如根據(jù)旋轉(zhuǎn)前后的兩個(gè)向量求二者之間的旋轉(zhuǎn)矩陣,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
未完待續(xù) ,后面如果又涉及到衛(wèi)星仿真的相關(guān)項(xiàng)目再進(jìn)行更新完善。
努力補(bǔ)課的喬木小姐
————————————————
版權(quán)聲明:本文為CSDN博主「碼代碼的喬木」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/nannan7777/article/details/119752362
總結(jié)
以上是生活随笔為你收集整理的卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国务院办公厅关于2022年部分节假日安排
- 下一篇: 什么是卫星轨道?