/// <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));
        }
Exemple #2
0
        /// <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);
        }