Пример #1
0
        /// <summary>
        /// 生成卫星编号相关的参数名称
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        public override string GetParamName(SatelliteNumber prn)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(prn.ToString()).Append(Gnsser.ParamNames.WaveLengthSuffix);
            return(sb.ToString());

            return(prn.ToString() + Gnsser.ParamNames.WaveLengthSuffix);
        }
Пример #2
0
        public override void Correct(EpochSatellite epochSatellite)
        {
            Time gpsTime = epochSatellite.RecevingTime;

            IEphemeris      sat = epochSatellite.Ephemeris;
            SatelliteNumber prn = epochSatellite.Prn;

            //计算太阳位置方法
            //XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime);

            //新的计算太阳位置方法
            Time tutc = gpsTime.GpstToUtc();

            //查找地球自转信息
            Gnsser.Data.ErpItem erpv = null;
            if (DataSouceProvider.ErpDataService != null)
            {
                erpv = DataSouceProvider.ErpDataService.Get(tutc);
            }
            if (erpv == null)
            {
                erpv = ErpItem.Zero;
            }

            XYZ sunPosition = new XYZ();

            DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition);

            //use L1 value
            IAntenna antenna = DataSouceProvider.AntennaDataSource.Get(prn.ToString(), gpsTime);

            if (antenna == null)
            {
                return;
            }

            string AntennaType = antenna.AntennaType;

            XYZ svPos = sat.XYZ;

            XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz;

            if (receiverPosition.Equals(XYZ.Zero))
            {
                return;
            }

            bool cycleSlip = epochSatellite.IsUnstable;

            if (cycleSlip || !PhaseManager.Contains(prn)) //a cycle slip happend
            {
                PhaseManager[prn] = new SatVectorPhase();
            }

            double windUpCorrection = GetSatPhaseWindUpCorectValue(prn, gpsTime, svPos, receiverPosition, sunPosition, AntennaType);

            //double windUpCorrection2 = GetSatPhaseWindUpCorectValue(satelliteType, gpsTime, svPos, receiverPosition, epochSatellite, sunPosition);

            this.Correction = (windUpCorrection);
        }
Пример #3
0
 /// <summary>
 /// 生成卫星编号相关的参数名称
 /// </summary>
 /// <param name="prn"></param>
 /// <returns></returns>
 public override string GetParamName(SatelliteNumber prn)
 {
     if (IsSiteNameIncluded)
     {
         var material = this.Material as MultiSiteEpochInfo;
         NetDoubleDifferName namer = new NetDoubleDifferName(material.RovSiteNames[0], material.BaseSiteName, prn, BasePrn);
         return(namer.ToString() + Gnsser.ParamNames.DoubleDifferAmbiguitySuffix);
     }
     return(prn.ToString() + "-" + BasePrn + Gnsser.ParamNames.DoubleDifferAmbiguitySuffix);
     //return prn.ToString() + "-" + BasePrn + Gnsser.ParamNames.PhaseLengthSuffix;
 }
Пример #4
0
        /// <summary>
        /// 是否可用
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public bool IsAvailable(SatelliteNumber prn, Time time)
        {
            string            prnStr            = prn.ToString();
            ClockInterpolator clockInterpolator = GetClockInterpolator(prnStr);

            if (!clockInterpolator.IsAvailable(time))
            {
                return(false);
            }
            return(true);
        }
Пример #5
0
        /// <summary>
        /// 卫星坐标偏差,G01_Dx,G01_Dy, G01_Dz
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        public List <string> GetSatDxyz(SatelliteNumber prn)
        {
            var str = prn.ToString() + ParamNames.Divider;

            return(new List <string>()
            {
                str + ParamNames.Dx,
                str + ParamNames.Dy,
                str + ParamNames.Dz,
            });
        }
 private void GetPath(SatelliteNumber prn, string PredictedClockBiasPath)
 {
     foreach (var item in this.textBox_predictedresultPath.Lines)
     {
         if (item.Contains(prn.ToString()))
         {
             PredictedClockBiasPath = item;
         }
         break;
     }
 }
Пример #7
0
        public override void Correct(EpochSatellite epochSatellite)
        {
            if (AntennaDataSource == null || SatInfoService == null)
            {
                return;
            }

            Time gpsTime = epochSatellite.RecevingTime;


            //  XYZ sunPosition = epochSatellite.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(gpsTime);// 这个可以每个历元算一次,有待优化。???czs 2014.10.05
            //下面是新的计算太阳位置
            Time tutc = gpsTime.GpstToUtc();

            //查找地球自转信息
            Gnsser.Data.ErpItem erpv = null;
            if (ErpDataService != null)
            {
                erpv = ErpDataService.Get(tutc);
            }
            if (erpv == null)
            {
                erpv = ErpItem.Zero;
            }

            XYZ sunPosition = new XYZ();

            UniverseObjectProvider.GetSunPosition(gpsTime, erpv, ref sunPosition);


            IEphemeris sat = epochSatellite.Ephemeris;

            XYZ svPos = sat.XYZ;

            XYZ receiverPosition = epochSatellite.SiteInfo.EstimatedXyz;

            SatelliteNumber prn = epochSatellite.Prn;

            SatInfoFile periodSatInfoCollection = SatInfoService.SatInfoFile;
            IAntenna    antenna = AntennaDataSource.Get(prn.ToString(), gpsTime);

            double correction = GetSatPhaseCenterCorectValue(prn, gpsTime, svPos, receiverPosition, sunPosition, periodSatInfoCollection, antenna);

            this.Correction = (correction);//
        }
Пример #8
0
        /// <summary>
        /// 根据接收机时间和位置,获取计算卫星发射时刻的位置。不计算相对地面的延迟。
        /// </summary>
        /// <param name="prn">卫星编号</param>
        /// <param name="gpsTime">时间</param>
        /// <returns>如果返回 null,在表示计算失败</returns>
        public override AtomicClock Get(SatelliteNumber prn, Time gpsTime)
        {
            string prnStr = prn.ToString();

            return(Get(prnStr, gpsTime));
        }
Пример #9
0
        /// <summary>
        /// 指定卫星的所有钟差序列
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        public List <AtomicClock> GetClocks(SatelliteNumber prn)
        {
            string prnStr = prn.ToString();

            return(ClockFile.GetClockItems(prnStr));
        }
Пример #10
0
        /// <summary>
        /// 根据接收机时间和位置,获取计算卫星发射时刻的位置。不计算相对地面的延迟。
        /// </summary>
        /// <param name="prn">卫星编号</param>
        /// <param name="gpsTime">时间</param>
        /// <returns>如果返回 null,在表示计算失败</returns>
        public override SimpleClockBias Get(SatelliteNumber prn, Time gpsTime)
        {
            string prnStr = prn.ToString();

            return(Get(prnStr, gpsTime));
        }
Пример #11
0
        /// <summary>
        /// 指定卫星的所有钟差序列
        /// </summary>
        /// <param name="prn"></param>
        /// <returns></returns>
        public List <SimpleClockBias> GetClocks(SatelliteNumber prn)
        {
            string prnStr = prn.ToString();

            return(ClockFile.GetClockItems(prnStr));
        }
Пример #12
0
 public string GetSiteSatMaker(string siteName, SatelliteNumber prn)
 {
     return(siteName + "-" + prn.ToString());
 }
Пример #13
0
        /// <summary>
        /// 根据太阳计算卫星偏差
        /// </summary>
        /// <param name="prn"></param>
        /// <param name="eph"></param>
        /// <param name="emissionTime"></param>
        /// <returns></returns>
        private XYZ GetSatAntOff(SatelliteNumber prn, RinexSatFrequency freq, IEphemeris eph, Time emissionTime)
        {
            ErpItem erpv = null;

            if (Context.ErpDataService != null)
            {
                erpv = Context.ErpDataService.Get(emissionTime);
            }
            if (erpv == null)
            {
                erpv = ErpItem.Zero;
            }
            XYZ rsun = new XYZ();

            //sun position in ecef
            //  rsun = EpochSat.EpochInfo.DataSouceProvider.UniverseObjectProvider.GetSunPosition(emissionTime);
            this.Context.UniverseObjectProvider.GetSunPosition(emissionTime, erpv, ref rsun);


            //unit vetcors of satellite fixed coordinates

            XYZ ez = -1 * eph.XYZ.UnitVector();

            XYZ es = (rsun - eph.XYZ).UnitVector();
            //outer product of 3D vectors
            XYZ r = new XYZ();

            r.X = ez.Y * es.Z - ez.Z * es.Y;
            r.Y = ez.Z * es.X - ez.X * es.Z;
            r.Z = ez.X * es.Y - ez.Y * es.X;



            XYZ r0 = new XYZ();

            r0.X = r.Y * ez.Z - r.Z * ez.Y;
            r0.Y = r.Z * ez.X - r.X * ez.Z;
            r0.Z = r.X * ez.Y - r.Y * ez.X;

            XYZ ex = r0.UnitVector();


            XYZ ey = r.UnitVector();


            //XYZ ex = new XYZ();

            //ex.X = ey.Y * ez.Z - ey.Z * ez.Y;
            //ex.Y = ey.Z * ez.X - ey.X * ez.Z;
            //ex.Z = ey.X * ez.Y - ey.Y * ez.X;


            //use L1 value
            if (Context.AntennaDataSource == null)
            {
                return(new XYZ());
            }

            IAntenna antenna = Context.AntennaDataSource.Get(prn.ToString(), emissionTime);

            //如果为空,则返回 0 坐标
            if (antenna == null)
            {
                return(new XYZ());
            }

            // Get antenna eccentricity for frequency "G01" (L1), in
            // satellite reference system.
            // NOTE: It is NOT in ECEF, it is in UEN!!!
            //lly注释
            //SatelliteFrequency freq = new SatelliteFrequency(prn, 1);
            // NEU satAnt = antenna.GetAntennaEccentricity(AntennaFrequency.G01);
            NEU satAnt = antenna.GetPcoValue(freq);

            XYZ dant = new XYZ();

            dant.X = satAnt.E * ex.X + satAnt.N * ey.X + satAnt.U * ez.X;
            dant.Y = satAnt.E * ex.Y + satAnt.N * ey.Y + satAnt.U * ez.Y;
            dant.Z = satAnt.E * ex.Z + satAnt.N * ey.Z + satAnt.U * ez.Z;


            // Unitary vector from satellite to Earth mass center (ECEF)
            XYZ satToEarthUnit = (-1.0) * eph.XYZ.UnitVector();

            // Unitary vector from Earth mass center to Sun (ECEF)
            XYZ earthToSunUnit = rsun.UnitVector();
            // rj = rk x ri: Rotation axis of solar panels (ECEF)
            XYZ rj = satToEarthUnit.Cross(earthToSunUnit);

            // Redefine ri: ri = rj x rk (ECEF)
            earthToSunUnit = rj.Cross(satToEarthUnit);
            // Let's funcKeyToDouble ri to an unitary vector. (ECEF)
            earthToSunUnit = earthToSunUnit.UnitVector();

            XYZ dant1 = new XYZ();

            dant1.X = satAnt.E * rj.X + satAnt.N * earthToSunUnit.X + satAnt.U * satToEarthUnit.X;
            dant1.Y = satAnt.E * rj.Y + satAnt.N * earthToSunUnit.Y + satAnt.U * satToEarthUnit.Y;
            dant1.Z = satAnt.E * rj.Z + satAnt.N * earthToSunUnit.Z + satAnt.U * satToEarthUnit.Z;

            return(dant1);
        }
Пример #14
0
 /// <summary>
 /// 生成卫星编号相关的参数名称
 /// </summary>
 /// <param name="prn"></param>
 /// <returns></returns>
 public override string GetParamName(SatelliteNumber prn)
 {
     return(prn.ToString() + Gnsser.ParamNames.Iono);
 }
Пример #15
0
 /// <summary>
 /// 获取卫星钟参数名称, G01_cDt_s
 /// </summary>
 /// <param name="sat"></param>
 /// <returns></returns>
 public string GetSatClockParamName(SatelliteNumber sat)
 {
     return(sat.ToString() + ParamNames.Divider + ParamNames.SatClkErrDistance);
 }
Пример #16
0
 /// <summary>
 /// 生成卫星编号相关的参数名称
 /// </summary>
 /// <param name="prn"></param>
 /// <returns></returns>
 public override string GetParamName(SatelliteNumber prn)
 {
     return(prn.ToString() + Gnsser.ParamNames.WaveLengthSuffix);
 }
 /// <summary>
 /// 检索
 /// </summary>
 /// <param name="prn"></param>
 /// <returns></returns>
 public BaseStateTransferModel this[SatelliteNumber prn]
 {
     get { return(this[prn.ToString()]); }
     set { this[prn.ToString()] = value; }
 }
Пример #18
0
        /// <summary>
        /// 逐历元进行双差模糊度固定和更新
        /// 目前只考虑算GPS的
        /// </summary>
        /// <param name="rovReceiverInfo"></param>
        /// <param name="refReceeiverInfo"></param>
        /// <param name="adjustment"></param>
        /// <param name="currentBasePrn"></param>
        /// <returns></returns>
        public WeightedVector Process(EpochInformation rovReceiverInfo, EpochInformation refReceeiverInfo, AdjustResultMatrix adjustment, SatelliteNumber currentBasePrn)
        {
            double Interval = rovReceiverInfo.ObsInfo.Interval;

            if (Interval == 0)
            {
                MinArcGap = 31.1;
            }
            else
            {
                MinArcGap = Interval + 1.1;
            }


            this.CurrentBasePrn = currentBasePrn;

            //如何模糊度子集维数小于4,则该历元所有模糊度采用实数解,参考论文
            //如果基准星发生变化,用于存储固定模糊度的字典应全部清空
            if (currentBasePrn != LastBasePrn || rovReceiverInfo[currentBasePrn].IsUnstable == true || refReceeiverInfo[currentBasePrn].IsUnstable == true)
            {
                DoubleDifferWideLaneAmbiCyclesDic = new SortedDictionary <string, DDWideLineAmbiCycles>();

                FixIonFreeAmbiCyclesInfo = new Vector();
                LastBasePrn = currentBasePrn;
            }
            //存储基准星
            LastBasePrn = currentBasePrn;

            WeightedVector fixIonFreeAmbiCycles = new WeightedVector();

            if (FixIonFreeAmbiCyclesInfo.Count > 0) //对曾经已经固定过的双差模糊度,如果当前双差卫星状态没有发生变化,则直接传递过来。
            {
                for (int i = 0; i < rovReceiverInfo.EnabledPrns.Count; i++)
                {
                    SatelliteNumber item = rovReceiverInfo.EnabledPrns[i];
                    if (item != currentBasePrn)
                    {
                        string paramName = item.ToString() + "-" + CurrentBasePrn + Gnsser.ParamNames.PhaseLengthSuffix;
                        if (FixIonFreeAmbiCyclesInfo.ParamNames.Contains(paramName))
                        {
                            if (rovReceiverInfo[item].IsUnstable == true || rovReceiverInfo[currentBasePrn].IsUnstable == true ||
                                refReceeiverInfo[item].IsUnstable == true || refReceeiverInfo[currentBasePrn].IsUnstable == true)
                            {
                                continue;
                            }
                            else
                            {
                                int index = FixIonFreeAmbiCyclesInfo.ParamNames.IndexOf(paramName);
                                fixIonFreeAmbiCycles.Add(FixIonFreeAmbiCyclesInfo.Data[index], FixIonFreeAmbiCyclesInfo.ParamNames[index]);
                            }
                        }
                    }
                }
            }


            if (!rovReceiverInfo.SatelliteTypes.Contains(SatelliteType.G) || !refReceeiverInfo.SatelliteTypes.Contains(SatelliteType.G))
            {
                FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles;
                if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount)
                {
                    return(fixIonFreeAmbiCycles);
                }
                else
                {
                    return(null);
                }
            }

            Vector fixedIntWideLineAmbiCycles = null;

            if (!tryFixWideLaneAmbguity(rovReceiverInfo, refReceeiverInfo, out fixedIntWideLineAmbiCycles))
            {
                //宽巷固定失败
                FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles;
                if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount)
                {
                    return(fixIonFreeAmbiCycles);
                }
                else
                {
                    return(null);
                }
            }

            //如何模糊度子集维数小于4,则该历元所有模糊度采用实数解
            if (fixedIntWideLineAmbiCycles.Count < minFixedAmbiCount)//1
            {
                FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles;
                if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount)
                {
                    return(fixIonFreeAmbiCycles);
                }
                else
                {
                    return(null);
                }
            }

            //fix narrow-lane ambiguity

            //AR mode: PPP_AR
            // stat = fxi_amb_NL_ROUND(rovReceiverInfo, Adjustment, sat1, sat2, NW, m);

            //AR mode: PPP_AR ILS
            if (!tryFixNarrowLaneAmbiguityByLAMBDA(rovReceiverInfo, refReceeiverInfo, adjustment, fixedIntWideLineAmbiCycles, ref fixIonFreeAmbiCycles))
            {
                //窄巷固定失败
                FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles;
                if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount)
                {
                    return(fixIonFreeAmbiCycles);
                }
                else
                {
                    return(null);
                }
            }
            //存储已经固定成功的模糊度
            if (fixIonFreeAmbiCycles.Count > FixIonFreeAmbiCyclesInfo.Count)
            {
                string ssss = "hahahahaha";
            }
            FixIonFreeAmbiCyclesInfo = fixIonFreeAmbiCycles;

            //for (int i = 0; i < fixIonFreeAmbiCycles.Count; i++)
            //{
            //    var newParam = fixIonFreeAmbiCycles.ParamNames[i];
            //    var newFixedValue = fixIonFreeAmbiCycles.Data[i];
            //    if (!FixIonFreeAmbiCyclesInfo.ParamNames.Contains(newParam))
            //    { FixIonFreeAmbiCyclesInfo.Add(newFixedValue, newParam); }
            //    else
            //    {
            //        int index = FixIonFreeAmbiCyclesInfo.ParamNames.IndexOf(newParam);
            //        double oldFixedValue = FixIonFreeAmbiCyclesInfo.Data[index];
            //        if (oldFixedValue != newFixedValue)
            //        {
            //            FixIonFreeAmbiCyclesInfo[index] = newFixedValue;
            //        }
            //    }
            //}

            if (fixIonFreeAmbiCycles.Count > minFixedAmbiCount)
            {
                return(fixIonFreeAmbiCycles);
            }
            else
            {
                return(null);
            }
        }