/// <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); }
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); }
/// <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; }
/// <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); }
/// <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; } }
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);// }
/// <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)); }
/// <summary> /// 指定卫星的所有钟差序列 /// </summary> /// <param name="prn"></param> /// <returns></returns> public List <AtomicClock> GetClocks(SatelliteNumber prn) { string prnStr = prn.ToString(); return(ClockFile.GetClockItems(prnStr)); }
/// <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)); }
/// <summary> /// 指定卫星的所有钟差序列 /// </summary> /// <param name="prn"></param> /// <returns></returns> public List <SimpleClockBias> GetClocks(SatelliteNumber prn) { string prnStr = prn.ToString(); return(ClockFile.GetClockItems(prnStr)); }
public string GetSiteSatMaker(string siteName, SatelliteNumber prn) { return(siteName + "-" + prn.ToString()); }
/// <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); }
/// <summary> /// 生成卫星编号相关的参数名称 /// </summary> /// <param name="prn"></param> /// <returns></returns> public override string GetParamName(SatelliteNumber prn) { return(prn.ToString() + Gnsser.ParamNames.Iono); }
/// <summary> /// 获取卫星钟参数名称, G01_cDt_s /// </summary> /// <param name="sat"></param> /// <returns></returns> public string GetSatClockParamName(SatelliteNumber sat) { return(sat.ToString() + ParamNames.Divider + ParamNames.SatClkErrDistance); }
/// <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; } }
/// <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); } }