2021-03-04低轨卫星定轨流程整理学习04

各类坐标系及坐标系之间的转换
为了减少牵连运动所引起的附加速度,使卫星的运动方程相对简化,一般在惯性坐标系中建立和求解卫星的运动方程。
而地球对卫星的引力(地球重力场模型)是在地固坐标系中定义的。因此要建立卫星卫星运动方程和参数估计的观测方程,必须掌握这些坐标系统的定义及其相互转换关系。
①2000.0惯性坐标系
原点位于地球质心,基准面为2000.0地球平赤道面,X轴在基准面内由地球质心指向2000.0的平春分点。Z轴为基准面的法向。Y轴与X、Z轴成右手系。
②地固坐标系
地固坐标系的坐标原点为地球质心,X 轴指向赤道面与格林尼治子午圈的交点,Z 轴指向国际协议原点(CIO),Y 轴与 X 轴和 Z 轴成右手系。
③卫星轨道坐标系(RTN)
为了便于对特定摄动力(如大气阻力主要集中在横向)进行分析,卫星精密定轨中常将作用于卫星的力分解到卫星轨道坐标系统下进行分析。坐标系的原点位于卫星质心,T轴沿卫星轨道运动方向。R 轴与地心到卫星质心的向径方向一致,且与 T 轴垂直。N 轴与R 轴和 T 轴成右手系。
地固坐标系与惯性坐标系之间转换(见《GPS测量和数据处理》)
从J2000到平天球坐标系:

           YearErrorZ = 2.650545 / 3600 + 2306.083227 / 3600 * T + 0.2988499 / 3600 * T * T + 0.01801828 / 3600 * T * T * T - 0.000005971 / 3600 * T * T * T * T - 0.0000003173 * T * T * T * T * T;
            YearErroro = 2004.191903 / 3600 * T - 0.4294934 / 3600 * T * T - 0.04182264 / 3600 * T * T * T - 0.000007089 / 3600 * T * T * T * T - 0.0000001274 / 3600 * T * T * T * T * T;
            YearErrorf = 2306.07718 / 3600 * T + 1.092748 / 3600 * T * T + 0.01826837 / 3600 * T * T * T + 0.000028596 / 3600 * T * T * T * T - 0.0000002904 / 3600 * T * T * T * T * T - 2.650545 / 3600;
            RP[0, 0] = Math.Cos(YearErrorZ * PI / 180) * Math.Cos(YearErroro * PI / 180) * Math.Cos(YearErrorf * PI / 180) - Math.Sin(YearErrorZ * PI / 180) * Math.Sin(YearErrorf * PI / 180);
            RP[0, 1] = -Math.Sin(YearErrorZ * PI / 180) * Math.Cos(YearErroro * PI / 180) * Math.Cos(YearErrorf * PI / 180) - Math.Cos(YearErrorZ * PI / 180) * Math.Sin(YearErrorf * PI / 180);
            RP[0, 2] = -Math.Sin(YearErroro * PI / 180) * Math.Cos(YearErrorf * PI / 180);
            RP[1, 0] = Math.Cos(YearErrorZ * PI / 180) * Math.Cos(YearErroro * PI / 180) * Math.Sin(YearErrorf * PI / 180) + Math.Sin(YearErrorZ * PI / 180) * Math.Cos(YearErrorf * PI / 180);
            RP[1, 1] = -Math.Sin(YearErrorZ * PI / 180) * Math.Cos(YearErroro * PI / 180) * Math.Sin(YearErrorf * PI / 180) + Math.Cos(YearErrorZ * PI / 180) * Math.Cos(YearErrorf * PI / 180);
            RP[1, 2] = -Math.Sin(YearErroro * PI / 180) * Math.Sin(YearErrorf * PI / 180);
            RP[2, 0] = Math.Cos(YearErrorZ * PI / 180) * Math.Sin(YearErroro * PI / 180);
            RP[2, 1] = -Math.Sin(YearErrorZ * PI / 180) * Math.Sin(YearErroro * PI / 180);
            RP[2, 2] = Math.Cos(YearErroro * PI / 180);

            Ping_X = J2000_X * RP[0, 0] + J2000_Y * RP[0, 1] + J2000_Z * RP[0, 2];
            Ping_Y = J2000_X * RP[1, 0] + J2000_Y * RP[1, 1] + J2000_Z * RP[1, 2];
            Ping_Z = J2000_X * RP[2, 0] + J2000_Y * RP[2, 1] + J2000_Z * RP[2, 2];
从平天球坐标系到真天球坐标系
```csharp
 A1 = 134.9634025 + 1717915923.2178 / 3600 * T + 31.8792 / 3600 * T * T + 0.051635 / 3600 * T * T * T - 0.000244704 / 3600 * T * T * T * T;
            A2 = 357.0529109 + 129596581.0481 / 3600 * T - 0.5532 / 3600 * T * T + 0.000136 / 3600 * T * T * T + 0.00001149 / 3600 * T * T * T * T;
            A3 = 93.2720906 + 1739527262.8474 / 3600 * T - 12.7512 / 3600 * T * T - 0.001037 / 3600 * T * T * T + 0.00000417 / 3600 * T * T * T * T;
            A4 = 297.850195 + 1602961601.2090 / 3600 * T - 6.3706 / 3600 * T * T + 0.006593 / 3600 * T * T * T - 0.00003169 / 3600 * T * T * T * T;
            A5 = 125.044555 - 6962890.2665 / 3600 * T + 7.4722 / 3600 * T * T - 0.007702 / 3600 * T * T * T - 0.00005969 / 3600 * T * T * T * T;

            PingHuangChiJiaoJiao = 23.4333333 + 21.448 / 3600 - 46.815 / 3600 * T - 0.00059 / 3600 * T * T + 0.001813 / 3600 * T * T * T;
            for (int i = 0; i < 106; i++)
            {
                HuangJingZhangDong += (ZhangDongTable[i, 5] * 0.0001 + ZhangDongTable[i, 6] * T * 0.0001) * Math.Sin((A1 * ZhangDongTable[i, 0] + A2 * ZhangDongTable[i, 1] + A3 * ZhangDongTable[i, 2] + A4 * ZhangDongTable[i, 3] + A5 * ZhangDongTable[i, 4]) * PI / 180);
                JiaoJiaoZhangDong += (ZhangDongTable[i, 7] * 0.0001 + ZhangDongTable[i, 8] * T * 0.0001) * Math.Cos((A1 * ZhangDongTable[i, 0] + A2 * ZhangDongTable[i, 1] + A3 * ZhangDongTable[i, 2] + A4 * ZhangDongTable[i, 3] + A5 * ZhangDongTable[i, 4]) * PI / 180);
            }
            //HuangJingZhangDong=HuangJingZhangDong/180*PI;
            //JiaoJiaoZhangDong = JiaoJiaoZhangDong / 180 * PI;

            N[0, 0] = Math.Cos(HuangJingZhangDong / 3600 * PI / 180);
            N[0, 1] = -Math.Sin(HuangJingZhangDong / 3600 * PI / 180) * Math.Cos(PingHuangChiJiaoJiao * PI / 180);
            N[0, 2] = -Math.Sin(HuangJingZhangDong / 3600 * PI / 180) * Math.Sin(PingHuangChiJiaoJiao * PI / 180);
            N[1, 0] = Math.Sin(HuangJingZhangDong / 3600 * PI / 180) * Math.Cos((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);
            N[1, 1] = Math.Cos(HuangJingZhangDong / 3600 * PI / 180) * Math.Cos(PingHuangChiJiaoJiao * PI / 180) * Math.Cos((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180) + Math.Sin(PingHuangChiJiaoJiao * PI / 180) * Math.Sin((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);
            N[1, 2] = Math.Cos(HuangJingZhangDong / 3600 * PI / 180) * Math.Sin(PingHuangChiJiaoJiao * PI / 180) * Math.Cos((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180) - Math.Cos(PingHuangChiJiaoJiao * PI / 180) * Math.Sin((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);
            N[2, 0] = Math.Sin(HuangJingZhangDong / 3600 * PI / 180) * Math.Sin((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);
            N[2, 1] = Math.Cos(HuangJingZhangDong / 3600 * PI / 180) * Math.Cos(PingHuangChiJiaoJiao * PI / 180) * Math.Sin((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180) - Math.Sin(PingHuangChiJiaoJiao * PI / 180) * Math.Cos((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);
            N[2, 2] = Math.Cos(HuangJingZhangDong / 3600 * PI / 180) * Math.Sin(PingHuangChiJiaoJiao * PI / 180) * Math.Sin((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180) + Math.Cos(PingHuangChiJiaoJiao * PI / 180) * Math.Cos((PingHuangChiJiaoJiao + JiaoJiaoZhangDong / 3600) * PI / 180);

            Zhen_X = Ping_X * N[0, 0] + Ping_Y * N[0, 1] + Ping_Z * N[0, 2];
            Zhen_Y = Ping_X * N[1, 0] + Ping_Y * N[1, 1] + Ping_Z * N[1, 2];
            Zhen_Z = Ping_X * N[2, 0] + Ping_Y * N[2, 1] + Ping_Z * N[2, 2];

从真天球坐标系到WGS84坐标系

 Period_X = Math.Cos(GeLinNiZhiHengXingTime ) * Zhen_X + Math.Sin(GeLinNiZhiHengXingTime) * Zhen_Y;
            Period_Y = -Math.Sin(GeLinNiZhiHengXingTime ) * Zhen_X + Math.Cos(GeLinNiZhiHengXingTime) * Zhen_Y;
            Period_Z = Zhen_Z;
             X_pole = X_pole / 3600000000 / 180 * PI;
            Y_pole = Y_pole / 3600000000 / 180 * PI;

            WGS84_X = Period_X * Math.Cos(X_pole) + Period_Y * Math.Sin(X_pole) * Math.Sin(Y_pole) + Math.Sin(X_pole) *Math.Cos(Y_pole) * Period_Z;
            WGS84_Y = Period_Y * Math.Cos(Y_pole) - Math.Sin(Y_pole) * Period_Z;
            WGS84_Z = -Period_X * Math.Sin(X_pole) + Period_Y * Math.Cos(X_pole) * Math.Sin(Y_pole) + Math.Cos(X_pole) * Math.Cos(Y_pole) * Period_Z;

星固系和地固系转换
Sun_WGS84和GNSSPosition分别表示太阳和GNSS卫星在地心地固坐标系下的坐标。
代码为PCV由星固系下转换到地固系下。

            //天线相位中心偏差由星固系转为地固系

            Ezx = -GNSSPosition.XX / Math.Sqrt(GNSSPosition.XX * GNSSPosition.XX + GNSSPosition.YY * GNSSPosition.YY + GNSSPosition.ZZ * GNSSPosition.ZZ);
            Ezy = -GNSSPosition.YY / Math.Sqrt(GNSSPosition.XX * GNSSPosition.XX + GNSSPosition.YY * GNSSPosition.YY + GNSSPosition.ZZ * GNSSPosition.ZZ);
            Ezz = -GNSSPosition.ZZ / Math.Sqrt(GNSSPosition.XX * GNSSPosition.XX + GNSSPosition.YY * GNSSPosition.YY + GNSSPosition.ZZ * GNSSPosition.ZZ);

            Eyx = (Ezy * (SunZ_WGS84 - GNSSPosition.ZZ) - Ezz * (SunY_WGS84 - GNSSPosition.YY)) / Math.Sqrt(Math.Pow(Ezy * (SunZ_WGS84 - GNSSPosition.ZZ) - Ezz * (SunY_WGS84 - GNSSPosition.YY), 2) + Math.Pow(Ezz * (SunX_WGS84 - GNSSPosition.XX) - Ezx * (SunZ_WGS84 - GNSSPosition.ZZ), 2) + Math.Pow(Ezx * (SunY_WGS84 - GNSSPosition.YY) - Ezy * (SunX_WGS84 - GNSSPosition.XX), 2));
            Eyy = (Ezz * (SunX_WGS84 - GNSSPosition.XX) - Ezx * (SunZ_WGS84 - GNSSPosition.ZZ)) / Math.Sqrt(Math.Pow(Ezy * (SunZ_WGS84 - GNSSPosition.ZZ) - Ezz * (SunY_WGS84 - GNSSPosition.YY), 2) + Math.Pow(Ezz * (SunX_WGS84 - GNSSPosition.XX) - Ezx * (SunZ_WGS84 - GNSSPosition.ZZ), 2) + Math.Pow(Ezx * (SunY_WGS84 - GNSSPosition.YY) - Ezy * (SunX_WGS84 - GNSSPosition.XX), 2));
            Eyz = (Ezx * (SunY_WGS84 - GNSSPosition.YY) - Ezy * (SunX_WGS84 - GNSSPosition.XX)) / Math.Sqrt(Math.Pow(Ezy * (SunZ_WGS84 - GNSSPosition.ZZ) - Ezz * (SunY_WGS84 - GNSSPosition.YY), 2) + Math.Pow(Ezz * (SunX_WGS84 - GNSSPosition.XX) - Ezx * (SunZ_WGS84 - GNSSPosition.ZZ), 2) + Math.Pow(Ezx * (SunY_WGS84 - GNSSPosition.YY) - Ezy * (SunX_WGS84 - GNSSPosition.XX), 2));

            Exx = Eyy * Ezz - Eyz * Ezy;
            Exy = Eyz * Ezx - Eyx * Ezz;
            Exz = Eyx * Ezy - Eyy * Ezx;


            dant[0] = pcvX * Exx + pcvY * Eyx + pcvZ * Ezx;
            dant[1] = pcvX * Exy + pcvY * Eyy + pcvZ * Ezy;
            dant[2] = pcvX * Exz + pcvY * Eyz + pcvZ * Ezz;
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值