Unity3D 广播星历与精密星历

本文介绍了一种通过广播星历和精密星历计算卫星轨迹的方法,并对比分析了两种星历的差异,展示了如何通过计算残差来评估精度。文中详细解释了星历文件的读取、解析过程,以及如何利用这些数据进行卫星位置的计算和图形展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过广播星历文件计算过卫星的轨迹并与精密星历作比较,计算残差并绘图,具体效果参看下图。
在这里插入图片描述

// 全局变量
public static class SystemConstant
{
    public static double omegae = 7.2921151467e-5;  //地球自转角速度
    public static double mu = 3.986005e14; //地球引力常数
}


//精密星历Reader
using System;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class PrecisionEphemerisReader 
{
    public PrecisionEphemerisReader(int headline=22)
    {
        FileHeadLine = headline;
    }
    private int FileHeadLine;
    
    /// <summary>
    /// 加载精密星历文件
    /// </summary>
    public PrecisionEphemerisFile LoadPrecisionEphemerisFile(string Path)
    {
        PrecisionEphemerisFile PrecisionEphemerisFile = new PrecisionEphemerisFile();
        using (StreamReader reader = File.OpenText(Path))
        {
            //加载文件头{
            PrecisionEphemerisFile.FileHead.Clear(); //清空数据
            for (int i = 0; i < FileHeadLine; i++)
            {
                PrecisionEphemerisFile.FileHead.Add(reader.ReadLine());
            }
            while (true)
            {
                string value = reader.ReadLine();
                if (value != "EOF")
                {
                    PrecisionEphemerisModle modle = new PrecisionEphemerisModle();
                    modle.TimeStamp = ResloveTimeStamp(value);
                   // Debug.Log(ResloveTimeStamp(value).ToString());
                    for (int i = 0; i < 32; i++)
                    {
                        SatelliteInfo info = ResolveSatelliteInfo(reader.ReadLine());
                        modle.SatelliteInfos.Add(info);
                       // Debug.Log(info.LogSatelliteInfo()); 
                    }
                    PrecisionEphemerisFile.Modles.Add(modle);
                }
                else
                {
                    break;
                }
            }
           return PrecisionEphemerisFile;
        }
    }
    /// <summary>
    /// 解析时间戳
    /// </summary>
    /// <param name="info"></param>
    /// <returns></returns>
    private DateTime ResloveTimeStamp(string info)
    {
        string[] infos = info
            .Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);

        int year = int.Parse(infos[1]);
        int mouth = int.Parse(infos[2]);
        int day = int.Parse(infos[3]);
        int hour = int.Parse(infos[4]);
        int minnute = int.Parse(infos[5]);
        //Int32 seconds=Int32.Parse(infos[6]);;
        return new DateTime(year, mouth, day, hour, minnute, 0);
    }
    /// <summary>
    /// 解析卫星信息
    /// </summary>
    /// <param name="info"></param>
    /// <returns></returns>
    private SatelliteInfo ResolveSatelliteInfo(string info)
    {
        string[] infos = info
            .Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
        if (infos.Length == 9)
        {
            SatelliteInfo m_SatelliteInfo=new SatelliteInfo();
            m_SatelliteInfo.SatelliteID = infos[0];
            m_SatelliteInfo.X_Coordinate =double.Parse(infos[1])*1000;
            m_SatelliteInfo.Y_Coordinate =double.Parse(infos[2])*1000;
            m_SatelliteInfo.Z_Coordinate =double.Parse(infos[3])*1000;
            m_SatelliteInfo.Clock_Microsec =double.Parse(infos[4]);
            m_SatelliteInfo.X_sdev =int.Parse(infos[5]);
            m_SatelliteInfo.Y_sdev =int.Parse(infos[6]);
            m_SatelliteInfo.Z_sdev =int.Parse(infos[7]);
            m_SatelliteInfo.C_sdev = int.Parse(infos[8]);
            return m_SatelliteInfo;
        } 
        if(infos.Length == 5)
        {
            SatelliteInfo m_SatelliteInfo=new SatelliteInfo();
            m_SatelliteInfo.SatelliteID = infos[0];
            m_SatelliteInfo.X_Coordinate =double.Parse(infos[1])*1000;
            m_SatelliteInfo.Y_Coordinate =double.Parse(infos[2])*1000;
            m_SatelliteInfo.Z_Coordinate =double.Parse(infos[3])*1000;
            m_SatelliteInfo.Clock_Microsec =double.Parse(infos[4]);
            return m_SatelliteInfo;
        }
        return new SatelliteInfo();
    }
}

public class PrecisionEphemerisFile
{
    public List<string> FileHead = new List<string>();
    public List<PrecisionEphemerisModle> Modles = new List<PrecisionEphemerisModle>();
    
    /// <summary>
    /// 返回头文件的字符串
    /// </summary>
    /// <returns></returns>
    public string FileHeadInfo()
    {
        if (FileHead.Count > 0)
        {
            string temp = String.Empty;
            foreach (var item in FileHead)
            {
                temp = temp + item + "\r\n";
            }

            return temp;
        }
        else
        {
            return "没有文件头信息";
        }
    }

    public string ContentInfo()
    {
        
        if (Modles.Count>0)
        {
            string temp = string.Empty;
            foreach (var item in Modles)
            {
                temp = temp + item.TimeStamp + "\r\n";
                temp = temp + item.LogInfos() + "\r\n";
            }
            return temp;
        }
        else
        {
            return "数据为空";
        }
    }
}

public class PrecisionEphemerisModle
{
    public DateTime TimeStamp = new DateTime();
    public List<SatelliteInfo> SatelliteInfos = new List<SatelliteInfo>();

    public string LogInfos()
    {
        string temp=String.Empty;
        foreach (var item in SatelliteInfos)
        {
            temp = temp + item.LogSatelliteInfo()+"\r\n";
        }
        return temp;
    }
}

public class SatelliteInfo
{
    public string SatelliteID=String.Empty;
    public double X_Coordinate;
    public double Y_Coordinate;
    public double Z_Coordinate;
    public double Clock_Microsec;
    public int X_sdev;
    public int Y_sdev;
    public int Z_sdev;
    public int C_sdev;

    public string LogSatelliteInfo()
    {
        if (SatelliteID != String.Empty)
        {
            return String.Format
                ("卫星ID:{0}; X坐标:{1},Y坐标:{2}, Z坐标:{3}, Clock_Microsec:{4},X_sdev:{5},Y_sdev:{6},Z_sdev:{7},C_sdev:{8} "
            ,SatelliteID,X_Coordinate,Y_Coordinate,Z_Coordinate,Clock_Microsec,X_sdev,Y_sdev,Z_sdev,C_sdev);
        }
        return "卫星信息为空";
    }
}



//广播星历Reader
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class BroadcastEphemerisReader 
{
    public BroadcastEphemerisReader(int fileHeadLine=8)
    {
        FileHeadLine = fileHeadLine;
    }
    private int FileHeadLine ;
    
    public BroadcaseEphemerisFile LoadBroadcastEphemerisFile( string Path)
    {
        BroadcaseEphemerisFile m_BroadcaseEphemerisFile=new BroadcaseEphemerisFile();
        
        using (StreamReader reader = File.OpenText(Path))
        {
            //读文件头
            for (int i = 0; i < FileHeadLine; i++)
            {
                string temp = reader.ReadLine();
                m_BroadcaseEphemerisFile.FileHead.Add(temp);
            }

            int lineNum = 8;
            while (true)
            {
                string temp01=reader.ReadLine();
                if (temp01!=null)
                {
                    lineNum += 8;
                    /*
                     * 处理第一行数据
                     */
                     //雷达编号
                     BroadcaseEphemerisModle modle=new BroadcaseEphemerisModle();
                     modle.SatelliteID = int.Parse(temp01.Substring(0, 2));
                     //时间戳
                     string[] infos = temp01.Substring(2,20)
                         .Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
                     modle.TimeStamp=new DateTime(int.Parse(infos[0])+2000,int.Parse(infos[1]),int.Parse(infos[2]),
                         int.Parse(infos[3]),int.Parse(infos[4]),(int)float.Parse(infos[5]));
                     //卫星时钟的偏移  毫秒
                    modle.卫星时钟的偏移=Double.Parse(temp01.Substring(22, 19));
                    //卫星时钟的漂移
                    modle.卫星时钟的漂移=Double.Parse(temp01.Substring(41, 19));
                    //卫星时钟的漂移速度
                    modle.卫星时钟的漂移速度=Double.Parse(temp01.Substring(60, 19));

                    /*
                     * 处理第二行数据
                     */
                    string temp02= reader.ReadLine();
                    modle.IODE = Double.Parse(temp02.Substring(3, 19));
                    modle.Crs = Double.Parse(temp02.Substring(22, 19));
                    modle.Delta_R = Double.Parse(temp02.Substring(41, 19));
                    modle.Mo = Double.Parse(temp02.Substring(60, 19));
                 
                    /*
                     * 处理第三行数据
                     */
                    string temp03= reader.ReadLine();
                    modle.Cuc=Double.Parse(temp03.Substring(3, 19));
                    modle.e = Double.Parse(temp03.Substring(22, 19));
                    modle.Cus=Double.Parse(temp03.Substring(41, 19));
                    modle.根号a=Double.Parse(temp03.Substring(60, 19));
                    
                    /*
                     * 处理第四行数据
                     */
                    string temp04= reader.ReadLine();
                    modle.Toe=Double.Parse(temp04.Substring(3, 19));
                    modle.Cic= Double.Parse(temp04.Substring(22, 19));
                    modle.OUo=Double.Parse(temp04.Substring(41, 19));
                    modle.Cis=Double.Parse(temp04.Substring(60, 19));
                    
                    /*
                    * 处理第五行数据
                    */
                    string temp05= reader.ReadLine();
                    modle.I0=Double.Parse(temp05.Substring(3, 19));
                    modle.Crc= Double.Parse(temp05.Substring(22, 19));
                    modle.w=Double.Parse(temp05.Substring(41, 19));
                    modle.OU=Double.Parse(temp05.Substring(60, 19));

                    /*
                     * 处理第六行数据
                    */
                    string temp06= reader.ReadLine();
                    modle.I=Double.Parse(temp06.Substring(3, 19));
                    modle.L2上的码= Double.Parse(temp06.Substring(22, 19));
                    modle.GPS周数=Double.Parse(temp06.Substring(41, 19));
                    modle.L2码数据标记=Double.Parse(temp06.Substring(60, 19));


                    /*
                    * 处理第七行数据
                    */
                    string temp07= reader.ReadLine();
                    modle.卫星精度=Double.Parse(temp07.Substring(3, 19));
                    modle.卫星健康= Double.Parse(temp07.Substring(22, 19));
                    modle.Tgd=Double.Parse(temp07.Substring(41, 19));
                    modle.IODC=Double.Parse(temp07.Substring(60, 19));

                    /*
                    * 处理第八行数据
                   */
                    string temp08= reader.ReadLine();
                    modle.电文发送时刻=Double.Parse(temp08.Substring(3, 19));
                    modle.拟合区间= Double.Parse(temp08.Substring(22, 19));
                    modle.Unuse01=Double.Parse(temp08.Substring(41, 19));
                    modle.Unuse02=Double.Parse(temp08.Substring(60, 19));
                   
                   // Debug.Log(modle.LogBroadcaseEphemerisModle());
                    m_BroadcaseEphemerisFile.modles.Add(modle);
                }
                else
                {
                    break;
                }
            }
            return m_BroadcaseEphemerisFile;
        }
    }
}

public class BroadcaseEphemerisFile
{
    public List<string> FileHead=new List<string>();
    public List<BroadcaseEphemerisModle> modles=new List<BroadcaseEphemerisModle>();
    //public 
    public string LogFileHead()
    {
        if (FileHead.Count > 0)
        {
            string temp=String.Empty;
            foreach (var item in FileHead)
            {
                temp = temp + item + "\r\n";
            }
            return temp;
        }

        return "文件头为空";
    }
}

public class BroadcaseEphemerisModle
{
    public string LogBroadcaseEphemerisModle()
    {
        return String.Format("卫星编号:{0},时间戳:{1},卫星时钟的偏移:{2},卫星时钟的漂移:{3},卫星时钟的漂移速度:{4},IODE:{5},Crs:{6},Delta_R:{7}," +
                             "Mo:{8},Cuc:{9}, e:{10}, Cus:{11}, 根号a:{12}, Toe:{13}, Cic:{14}, OUo:{15}, Cis:{16}, I0:{17}, Crc:{18}, w:{19}, OU:{20}, I:{21}, L2上的码:{22}, GPS周数:{23}, L2码数据标记:{24}," +
                             "卫星精度:{25}, 卫星健康:{26}, Tgd:{27}, IODC:{28}, 电文发送时刻:{29}, 拟合区间:{30}, Unuse01:{31}, Unuse02:{32}" 
            , SatelliteID,TimeStamp,卫星时钟的偏移,卫星时钟的漂移,卫星时钟的漂移速度,
            IODE,Crs,Delta_R,Mo,Cuc,e,Cus,根号a,Toe,Cic,OUo,Cis,I0,Crc,w,OU,I,L2上的码,
            GPS周数,L2码数据标记,卫星精度,卫星健康,Tgd,IODC,电文发送时刻,拟合区间,Unuse01,Unuse02);
    }
   
    public int SatelliteID;
    public DateTime TimeStamp;
    public double 卫星时钟的偏移;
    public double 卫星时钟的漂移;
    public double 卫星时钟的漂移速度;
    
    public double IODE;
    public double Crs;
    public double Delta_R;
    public double Mo;
    
    public double Cuc;
    public double e;
    public double Cus;
    public double 根号a;
    
    public double Toe;
    public double Cic;
    public double OUo;
    public double Cis;
    
    public double I0;
    public double Crc;
    public double w;
    public double OU;
    
    public double I;
    public double L2上的码;
    public double GPS周数;
    public double L2码数据标记;
    
    public double 卫星精度;
    public double 卫星健康;
    public double Tgd;
    public double IODC;
    
    public double 电文发送时刻;
    public double 拟合区间;
    public double Unuse01;
    public double Unuse02;
}







//主程序
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using UnityEngine;
using UnityEngine.UI;
using XCharts;
using Application = UnityEngine.Application;
using Button = UnityEngine.UI.Button;

public class RootMsg : MonoBehaviour
{
    private int ID = 1;
    private static Text m_text;

    private LineChart PrecisionEphemerisChart;
    private LineChart BroadcaseEphemerisChart;
    private LineChart ResidualChart;
    private Dropdown SateliteID;
    private Button Btn_PrecisionImg;
    private Button Btn_BroadcaseImg;
    private Button Btn_ResidualImg;
    
    private string bPath=String.Empty;
    private string pPath=String.Empty;
    
    public PrecisionEphemerisFile m_PrecisionEphemerisFile=new PrecisionEphemerisFile();
    public BroadcaseEphemerisFile m_BroadcaseEphemerisFile=new BroadcaseEphemerisFile();
    
    //private string bPath=@"D:\Users\30721\Desktop\广播星历源码及PPT-曹勃杨\广播星历源码及PPT-曹勃杨\brdc0010.20n";
   //private string pPath=@"D:\Users\30721\Desktop\广播星历源码及PPT-曹勃杨\广播星历源码及PPT-曹勃杨\igs20863.sp3";
    
    private List<double> PrecisionEphemerisPos_X=new List<double>();
    private List<double> PrecisionEphemerisPos_Y=new List<double>();
    private List<double> PrecisionEphemerisPos_Z=new List<double>();
    
    private List<double> BroadcaseEphemerisPos_X=new List<double>();
    private List<double> BroadcaseEphemerisPos_Y=new List<double>();
    private List<double> BroadcaseEphemerisPos_Z=new List<double>();

    private List<double> ResidualPos_X = new List<double>();
    private List<double> ResidualPos_Y=new List<double>();
    private List<double> ResidualPos_Z=new List<double>();
     
    /// <summary>
    /// 获取广播星历文件路径
    /// </summary>
    public void GetBroadcastEphemerPath()
    {
        bPath=String.Empty;
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.InitialDirectory = "D:\\";  
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            bPath = dialog.FileName;
            LogInfo(String.Format("广播星历文件路径:{0}",bPath));
        }
    }
    
    /// <summary>
    /// 获取精密星历文件路径
    /// </summary>
    public void GetPrecisionEphemerPath()
    {
        pPath=String.Empty;
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.InitialDirectory = "D:\\";  
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            pPath = dialog.FileName;
            LogInfo(String.Format("精密星历文件路径:{0}",pPath));
        }
    }
    
    /// <summary>
    /// 加载星历
    /// </summary>
    public void LoadFile()
    {
        if (bPath != String.Empty && pPath != String.Empty)
        {
            m_PrecisionEphemerisFile= new PrecisionEphemerisReader().LoadPrecisionEphemerisFile(pPath);
            m_BroadcaseEphemerisFile=new BroadcastEphemerisReader().LoadBroadcastEphemerisFile(bPath);
            LogInfo(string.Format("精密星历加载文件{0}组,广播星历加载文件{1}组",m_PrecisionEphemerisFile.Modles.Count,
                m_BroadcaseEphemerisFile.modles.Count));
        }
        else
        {
            LogInfo("需要先选择星历路径");
        }
       
    }
    /// <summary>
    /// 绘制精密星历图像
    /// </summary>
    public void PrecisionEphemerisImage()
    {
        PrecisionEphemerisChart.gameObject.SetActive(true);
        BroadcaseEphemerisChart.gameObject.SetActive(false);
        ResidualChart.gameObject.SetActive(false);
        PrecisionEphemerisChart.title.text = string.Format("{0}号卫星精密星历图", ID);
        for (int i = 0; i < 24; i++)
        {
            PrecisionEphemerisChart.UpdateData("X", i, (float) PrecisionEphemerisPos_X[i]);
            PrecisionEphemerisChart.UpdateData("Y", i, (float) PrecisionEphemerisPos_Y[i]);
            PrecisionEphemerisChart.UpdateData("Z", i, (float) PrecisionEphemerisPos_Z[i]);
        }
    }
    /// <summary>
    /// 绘制广播星历图像
    /// </summary>
    public void BroadcaseEphemerisImage()
    {
        PrecisionEphemerisChart.gameObject.SetActive(false);
        BroadcaseEphemerisChart.gameObject.SetActive(true);
        ResidualChart.gameObject.SetActive(false);
        BroadcaseEphemerisChart.title.text = string.Format("{0}号卫星广播星历图", ID);
        for (int i = 0; i < 24; i++)
        {
            BroadcaseEphemerisChart.UpdateData("X", i, (float) BroadcaseEphemerisPos_X[i]);
            BroadcaseEphemerisChart.UpdateData("Y", i, (float) BroadcaseEphemerisPos_Y[i]);
            BroadcaseEphemerisChart.UpdateData("Z", i, (float) BroadcaseEphemerisPos_Z[i]);
        }
    }
    
    /// <summary>
    /// 绘制残差图像
    /// </summary>
    public void ResidualImage()
    {   
        PrecisionEphemerisChart.gameObject.SetActive(false);
        BroadcaseEphemerisChart.gameObject.SetActive(false);
        ResidualChart.gameObject.SetActive(true);
        ResidualChart.title.text = string.Format("{0}号卫星残差图", ID);
        
        for (int i = 0; i < 7; i++)
        {
            ResidualChart.UpdateData("X", i, (float) ResidualPos_X[i]);
            ResidualChart.UpdateData("Y", i, (float) ResidualPos_Y[i]);
            ResidualChart.UpdateData("Z", i, (float) ResidualPos_Z[i]);
        }
    }
    /// <summary>
    /// 选择卫星ID
    /// </summary>
    public void SelectSatelite()
    {
        ID = int.Parse(SateliteID.captionText.text);
        LogInfo("卫星编号:"+ID);
    }
    /// <summary>
    /// 数据处理
    /// </summary>
    public void CalculateDraw()
    {
        if (m_BroadcaseEphemerisFile.FileHead.Count == 0)
        {
            LogInfo("请先加载文件");
            return;
        }
        ProcessPrecisionEphemeris();
        ProcessBroadcaseEphemeris();
        ProvessResidualEphemeris();
        Btn_BroadcaseImg.interactable = true;
        Btn_PrecisionImg.interactable = true;
        Btn_ResidualImg.interactable = true;
    }
    
    /// <summary>
    /// 处理精密星历数据
    /// </summary>
    private void ProcessPrecisionEphemeris()
    {
        List<PrecisionEphemerisModle> temp=new List<PrecisionEphemerisModle>();
        for (int i = 0; i < 24; i++)
        {
            temp.Add(m_PrecisionEphemerisFile.Modles[i*4]);
        }
        List<double> result_X=new List<double>();
        List<double> result_Y=new List<double>();
        List<double> result_Z=new List<double>();
        foreach (var item in temp)
        {
            result_X.Add(item.SatelliteInfos[ID-1].X_Coordinate);
            result_Y.Add(item.SatelliteInfos[ID-1].Y_Coordinate);
            result_Z.Add(item.SatelliteInfos[ID-1].Z_Coordinate);
        }
        PrecisionEphemerisPos_X = result_X;
        PrecisionEphemerisPos_Y = result_Y;
        PrecisionEphemerisPos_Z = result_Z;

    }
    /// <summary>
    /// 处理广播星历数据
    /// </summary>
    private void ProcessBroadcaseEphemeris()
    {
        
        List<BroadcaseEphemerisModle> modles =
            m_BroadcaseEphemerisFile.modles.FindAll((modle => modle.SatelliteID == ID));
        CalculatePos(modles);
    }

    private void  CalculatePos(List<BroadcaseEphemerisModle> modles)
    {
        List<double> result_X=new List<double>();
        List<double> result_Y=new List<double>();
        List<double> result_Z=new List<double>();
        for (int i = 0; i < 24; i++)
        {
            DateTime time=new DateTime(modles[0].TimeStamp.Year,modles[0].TimeStamp.Month,
                modles[0].TimeStamp.Day,i,0,0);
            BroadcaseEphemerisModle modle = modles[0];
            TimeSpan span = time - modles[0].TimeStamp;
            double second = Math.Abs(span.TotalSeconds);
            foreach (var item in modles)
            {
                TimeSpan span01 = time - item.TimeStamp;
                double second01 = Math.Abs(span01.TotalSeconds);
                if (second > second01)
                {
                    modle = item;
                    second = second01;
                }
            }
            //Debug.LogFormat("最接近{0}的时刻是{1}",time,modle.TimeStamp);
            //卫星的平均角速度
            double tk = (time - modle.TimeStamp).TotalSeconds;
            double A = Math.Pow(modle.根号a, 2);
            double n0=Math.Sqrt(SystemConstant.mu/Math.Pow(A,3));
            double n = n0 + modle.Delta_R * tk; 
            //平近点角(迭代法)
            double Mk = modle.Mo + n * tk;
            if (Mk < 0)
            {
                Mk += 2 * Math.PI;
            }
            if (Mk > 2 * Math.PI)
            {
                Mk -= 2 * Math.PI;
            }
            //偏近点角
            double Eold = Mk;
            double Enew = Mk+modle.e*Math.Sin(Eold);
            int j = 1;

            while (Math.Abs(Enew-Eold)>1e-8)
            {
                Eold = Enew;
                Enew = Mk+modle.e*Math.Sin(Eold);
                j += 1;
                if (j > 10)
                {
                    break;
                }
            }
            double EK = Enew;
            
           // 真近点角
           double cosNuk=(Math.Cos(EK)-modle.e)/(1-modle.e*Math.Cos(EK));
           double sinNuk = (Math.Sqrt(1 - Math.Pow(modle.e, 2))*Math.Sin(EK))/(1-modle.e*Math.Cos(EK));
           double NK = Math.Atan(sinNuk / cosNuk);
           
           //结局真近点角象限不同出现的取值异常情况
           if (cosNuk < 0)
           {
               NK += Math.PI;
           }
           
           //升交点角距
           double PK = NK + modle.w;
           double deltauk = modle.Cus * Math.Sin(2 * PK) + modle.Cuc * Math.Cos(2 * PK);
           double deltark = modle.Crs * Math.Sin(2 * PK) + modle.Crc * Math.Cos(2 * PK);
           double deltaik = modle.Cis * Math.Sin(2 * PK) + modle.Cic * Math.Cos(2 * PK);
           
           //摄动改正后升交点角距、卫星矢径长度、轨道倾角
           double uk = PK + deltauk;
           double rk = A * (1 - modle.e * Math.Cos(EK)) + deltark;
           double ik = modle.I0 + modle.I * tk + deltaik;
           //极坐标转化为直角坐标
           double x1k = rk * Math.Cos(uk);
           double y1k= rk * Math.Sin(uk);
           //升交点赤经
           double omegak = modle.OUo + (modle.OU - SystemConstant.omegae) * tk - SystemConstant.omegae * modle.Toe;
           //最终WGS84坐标
           double x = x1k * Math.Cos(omegak) - y1k * Math.Cos(ik) * Math.Sin(omegak);
           double y = x1k * Math.Sin(omegak) + y1k * Math.Cos(ik) * Math.Cos(omegak);
           double z = y1k * Math.Sin(ik);
           
           result_X.Add(x);
           result_Y.Add(y);
           result_Z.Add(z);
        }

        BroadcaseEphemerisPos_X = result_X;
        BroadcaseEphemerisPos_Y = result_Y;
        BroadcaseEphemerisPos_Z = result_Z;
    }
    
    /// <summary>
    /// 处理残差数据
    /// </summary>
    
    private void ProvessResidualEphemeris()
    {
        ResidualPos_X.Clear();
        ResidualPos_Y.Clear();
        ResidualPos_Z.Clear();
        for (int i = 0; i < 14; i+=2)
        {
            ResidualPos_X.Add(PrecisionEphemerisPos_X[i] - BroadcaseEphemerisPos_X[i]);
            ResidualPos_Y.Add(PrecisionEphemerisPos_Y[i] - BroadcaseEphemerisPos_Y[i]);
            ResidualPos_Z.Add(PrecisionEphemerisPos_Z[i] - BroadcaseEphemerisPos_Z[i]);
        }
    }
    
    /// <summary>
    /// 清空数据
    /// </summary>
    public void ClearData()
    {
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        PrecisionEphemerisPos_X.Clear();
        
        Btn_BroadcaseImg.interactable = false;
        Btn_PrecisionImg.interactable = false;
        Btn_ResidualImg.interactable = false;
        
        PrecisionEphemerisChart.gameObject.SetActive(false);
        BroadcaseEphemerisChart.gameObject.SetActive(false);
        ResidualChart.gameObject.SetActive(false);
    }
    
    /// <summary>
    /// 程序退出
    /// </summary>
    public void QuitApp()
    {
        Application.Quit();
    }
    /// <summary>
    /// 程序开始
    /// </summary>
    void Start()
    {
        m_text = GameObject.Find("InfoTip").GetComponent<Text>();
       
        
        PrecisionEphemerisChart= GameObject.Find("PrecisionEphemerisChart").GetComponent<LineChart>();
        BroadcaseEphemerisChart= GameObject.Find("BroadcaseEphemerisChart").GetComponent<LineChart>();
        ResidualChart= GameObject.Find("ResidualChart").GetComponent<LineChart>();
        PrecisionEphemerisChart.gameObject.SetActive(false);
        BroadcaseEphemerisChart.gameObject.SetActive(false);
        ResidualChart.gameObject.SetActive(false);
        SateliteID = GameObject.Find("SatelliteID").GetComponent<Dropdown>();
        
        Btn_BroadcaseImg= GameObject.Find("广播星历图像").GetComponent<Button>();
        Btn_PrecisionImg= GameObject.Find("精密星历图像").GetComponent<Button>();
        Btn_ResidualImg= GameObject.Find("残差图").GetComponent<Button>();
        
        Btn_BroadcaseImg.interactable = false;
        Btn_PrecisionImg.interactable = false;
        Btn_ResidualImg.interactable = false;
    }
    /// <summary>
    /// log日志
    /// </summary>
    /// <param name="info"></param>
    public static void LogInfo(string info)
    {
        m_text.text = info;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值