地心惯性坐标系,通常指J2000地心惯性系,一般简称天球系,其与卫星轨道坐标系的互相转换在轨道动力学计算以及仿真中很常见。本文从工程实用角度出发,拒绝废话,兼顾定义、原理和代码实现,并且给出一个包含输入输出的算例,供读者对照移植。
1.天球系和轨道系的定义
(1)地心惯性坐标系 (简称:天球系)
原点 在地心处, 轴沿地球自转轴方向,指向北天极, 指向春分点, 与另两轴构成右手直角坐标系。
(2)轨道坐标系 (简称:轨道系)
轨道坐标系是由轨道平面所确定的坐标系,坐标原点 与卫星质心重合,其中 轴指向地心,其 轴在轨道平面内与 轴垂直,指向卫星飞行方向, 垂直轨道平面与另两轴构成右手直角坐标系。
2.天球系转轨道系的两种方法
由于轨道六根数和三维速度位置矢量可以互相转换,则产生两种姿态转换方法,工程上实际应用常用第二种方法。
方法一,基于轨道六根数:
方法二,基于位置速度矢量:
3.主要代码以及算例
typedef struct OrbitSixElement
{
double a; //半长轴
double i; //轨道倾角
double Omiga; //升交点赤经RA
double e; //偏心率
double omiga; //近地点幅角
double theta; //真近点角
}ORBIT6E;
int main()
{
//方法一
Matrix T1(3, 3), T2(3, 3), T0(3, 3); //天球系到轨道系
T0(0, 0) = 0; T0(0, 1) = 1; T0(0, 2) = 0;
T0(1, 0) = 0; T0(1, 1) = 0; T0(1, 2) = -1;
T0(2, 0) = -1; T0(2, 1) = 0; T0(2, 2) = 0;
Vector r1(-42163474.43, 403423.4267, 135.3820711);
Vector v1(-30.1984135, -3074.495479, -0.004924677);
ORBIT6E sE1; //自定义的轨道六根数结构体
GibbsOrbit::Cal6EleBy_rv(r1 / 1000.0, v1 / 1000.0, sE1); //自定义函数,根据位置速度矢量计算轨道六根数
cout << sE1.a << " " << sE1.i << " " << sE1.Omiga << " " << sE1.e << " " << sE1.omiga << " " << sE1.theta << " " << endl; //打印轨道六根数
double u1 = DEG2RAD(sE1.omiga + sE1.theta);
double i1 = DEG2RAD(sE1.i);
double omg1 = DEG2RAD(sE1.Omiga);
T1 = T0 * R_z(u1) * R_x(i1) * R_z(omg1); //天球系到轨道系
cout << "方法一,天球系到轨道系旋转矩阵:" << endl;
MatPrint(T1); //自定义的矩阵打印函数
//方法二
Matrix M1(3, 3);
Vector Yo = Cross(v1, r1) / Norm(Cross(v1, r1)); //Cross为求叉乘,Norm为求二范数
Vector Zo = -1 * r1 / Norm(r1);
Vector Xo = Cross(Yo, Zo);
M1.SetRow(0, Xo);
M1.SetRow(1, Yo);
M1.SetRow(2, Zo);
cout << "方法二,天球系到轨道系旋转矩阵:" << endl;
MatPrint(M1); //自定义的矩阵打印函数
}
4.转换结果