/// <summary> /// 默认采用Lambda算法直接固定。 /// 如果是无电离层组合,则需要分别对待,不能直接固定,需要子类进行实现,//2018.11.06,czs, hmx /// </summary> /// <param name="rawFloatAmbiCycles"></param> /// <returns></returns> protected virtual WeightedVector DoFixAmbiguity(WeightedVector rawFloatAmbiCycles) { //实时固定,采用Lambda算法,按照权逆阵排序,大的在后面,如果失败后,则删除之 var orderedFloatAmbiCycles = rawFloatAmbiCycles.GetCovaOrdered(); return(Gnsser.LambdaAmbiguitySearcher.GetAmbiguity(orderedFloatAmbiCycles, 3.0, 1e-20)); }
/// <summary> /// LAMBDA算法固定窄巷模糊度 /// 当然,还有其他固定方法,比如取整固定 /// </summary> /// <param name="rovReceiverInfo"></param> /// <param name="refReceeiverInfo"></param> /// <param name="adjustment"></param> /// <param name="fixedWindLaneAmbiCycles"></param> /// <param name="fixedIonFreeAmbiCycles"></param> /// <returns></returns> private bool tryFixNarrowLaneAmbiguityByLAMBDA(EpochInformation rovReceiverInfo, EpochInformation refReceeiverInfo, AdjustResultMatrix adjustment, Vector fixedWindLaneAmbiCycles, ref WeightedVector fixedIonFreeAmbiCycles) { List <string> ambiParamNames = fixedWindLaneAmbiCycles.ParamNames; WeightedVector estIonFreeAmbiVector = adjustment.Estimated.GetWeightedVector(ambiParamNames); double f1 = GnssConst.GPS_L1_FREQ; double f2 = GnssConst.GPS_L2_FREQ; IVector narrowLaneAmbiguity = (estIonFreeAmbiVector.Multiply((f1 + f2) / f1)).Minus(fixedWindLaneAmbiCycles.Multiply(f2 / (f1 - f2))); IMatrix narrowLaneAmbiguityCovariance = estIonFreeAmbiVector.InverseWeight.Multiply((f1 + f2) / f1).Multiply((f1 + f2) / f1); WeightedVector floatNLAmbiCycles = new WeightedVector(narrowLaneAmbiguity, narrowLaneAmbiguityCovariance); floatNLAmbiCycles.ParamNames = estIonFreeAmbiVector.ParamNames; //尝试固定模糊度 //按照权逆阵排序,大的在后面,如果失败后,则删除之 var orderedFloatNLAmbiCycles = floatNLAmbiCycles.GetCovaOrdered(); //模糊度直接用lambda算法进行固定,部分模糊度固定策略 double MaxRatioOfLambda = 3.0; var fixedIntNLAmbiCycles = Gnsser.LambdaAmbiguitySearcher.GetAmbiguity(orderedFloatNLAmbiCycles, MaxRatioOfLambda); if (fixedIntNLAmbiCycles.Count < 1) { return(false); } // 关键问题:模糊度固定是否正确?? //允许整数与浮点数的最大偏差,如 浮点数为 0.1 而整数为 1,则认为失败。 double maxDifferOfIntAndFloatAmbi = 0.35; List <string> failedParams = new List <string>(); foreach (var name in fixedIntNLAmbiCycles.ParamNames) { if (Math.Abs(fixedIntNLAmbiCycles[name] - orderedFloatNLAmbiCycles[name]) > maxDifferOfIntAndFloatAmbi) { double tmp = Math.Abs(fixedIntNLAmbiCycles[name] - orderedFloatNLAmbiCycles[name]); failedParams.Add(name); } } fixedIntNLAmbiCycles.Remove(failedParams); if (fixedIntNLAmbiCycles.Count < 1) { return(false); } //根据固定的宽巷和窄巷模糊度确定无电离层模糊度 foreach (var name in fixedIntNLAmbiCycles.ParamNames) { double fixedIntIonFree = fixedIntNLAmbiCycles[name] * f1 / (f1 + f2) + fixedWindLaneAmbiCycles[name] * f1 * f2 / ((f1 - f2) * (f1 + f2)); if (!fixedIonFreeAmbiCycles.ParamNames.Contains(name)) { fixedIonFreeAmbiCycles.Add(fixedIntIonFree, name); } else { int index = fixedIonFreeAmbiCycles.ParamNames.IndexOf(name); double oldFixedValue = fixedIonFreeAmbiCycles.Data[index]; if (oldFixedValue != fixedIntIonFree) { fixedIonFreeAmbiCycles[index] = fixedIntIonFree; } } } return(true); }