天球系到轨道系的转换算法

地心惯性坐标系,通常指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.转换结果

 

Matlab 中可以使用一些内置的函数和工具箱来实现地心惯性坐标系(ECI)和大地坐标系(ECEF)之间的转换。 首先,我们可以使用 Matlab 中的 Aerospace Toolbox 来处理空间与地面坐标系转换。此工具箱提供了一些函数来计算地球的几何参数,如椭球体参数和参考椭球体投影。 对于地心惯性坐标系到大地坐标系转换,有一个重要的参数必须提供,即观测时间。我们可以通过使用`datetime`函数来创建一个具体的观测时间。然后,我们可以使用 Aerospace Toolbox 中的函数`eci2lla`来将地心惯性坐标系的位置(以 X、Y、Z 坐标表示)转换为大地坐标系的经度、纬度和海拨。 一个简单的 Matlab 代码示例如下: ```matlab % 输入地心惯性坐标系的位置和观测时间 X = 1000; % 地心坐标系的 X 坐标 Y = 2000; % 地心坐标系的 Y 坐标 Z = 3000; % 地心坐标系的 Z 坐标 observationTime = datetime('2021-01-01 12:34:56'); % 观测时间 % 将地心惯性坐标转换为大地坐标 [latitude, longitude, altitude] = eci2lla([X, Y, Z], observationTime); % 显示转换结果 disp(['经度:', num2str(longitude)]); disp(['纬度:', num2str(latitude)]); disp(['海拔:', num2str(altitude)]); ``` 上述代码中,我们给定了地心惯性坐标系的位置和观测时间,然后使用`eci2lla`函数将其转换为大地坐标系的经度、纬度和海拔。最后,我们将这些结果打印出来。 请注意,此代码示例仅演示了地心惯性坐标系到大地坐标系转换方法,真实的转换可能涉及更多的参数和计算。具体使用时,请根据需要进行适当的调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值