Example #1
0
        public override BaseGnssResult CaculateKalmanFilter(MultiSitePeriodInfo recInfo, BaseGnssResult lastClockEstimationResult = null)
        {
            DifferClockEstimationResult last = null;

            if (lastClockEstimationResult != null)
            {
                last = (DifferClockEstimationResult)lastClockEstimationResult;
            }
            //  ISatWeightProvider SatWeightProvider = new SatElevateAndRangeWeightProvider();

            var matrixBuilder = (IonoFreeEpochDifferClockEstimationMatrixBuilder)MatrixBuilder;

            matrixBuilder.CurrentMaterial = recInfo;
            matrixBuilder.SetPreviousProduct(last);
            matrixBuilder.Build();


            //  this.Adjustment = new KalmanFilter( this.MatrixBuilder);
            this.Adjustment = this.RunAdjuster(BuildAdjustObsMatrix(this.CurrentMaterial));

            if (Adjustment.Estimated == null)
            {
                return(null);
            }

            ////尝试固定模糊度  cuiyang 2015.07
            //int fixFlag = Ppp_AR.Process(recInfo, Adjustment);

            DifferClockEstimationResult result = (DifferClockEstimationResult)BuildResult();

            return(result);
        }
Example #2
0
        /// <summary>
        /// 多历元多站双差
        /// </summary>
        /// <param name="periodMaterial"></param>
        /// <param name="BaseSiteName"></param>
        /// <param name="CurrentBasePrn"></param>
        /// <param name="invFactorOfPhase"></param>
        /// <param name="phaseOnly"></param>
        /// <param name="isDualFreq"></param>
        /// <returns></returns>
        public Matrix BulidDoubleInverseWeightOfObs(MultiSitePeriodInfo periodMaterial,
                                                    string BaseSiteName, SatelliteNumber CurrentBasePrn,
                                                    double invFactorOfPhase, bool phaseOnly, bool isDualFreq = false)
        {
            var SiteCount       = periodMaterial[0].Count;
            var EpochCount      = periodMaterial.Count;
            var EnabledSatCount = periodMaterial.EnabledSatCount;
            int satCount        = EnabledSatCount;
            int epochObsCount   = (satCount - 1);                                 //一个历元对应的参数数量
            int totalObsCount   = (SiteCount - 1) * epochObsCount * (EpochCount); //原始非差观测数,only载波

            if (!phaseOnly)                                                       //包含载波,翻翻
            {
                totalObsCount *= 2;
                epochObsCount *= 2;
            }
            if (isDualFreq)//包含2个频率,翻翻
            {
                totalObsCount *= 2;
                epochObsCount *= 2;
            }
            Matrix result = new Matrix(totalObsCount);

            for (int i = 0; i < EpochCount; i++)
            {
                var epochMaterial = periodMaterial[i];
                var subDiag       = BulidDoubleInverseWeightOfObs(epochMaterial, BaseSiteName, CurrentBasePrn, invFactorOfPhase, phaseOnly, isDualFreq);
                var startRowCol   = epochObsCount * i;
                result.SetSub(subDiag, startRowCol, startRowCol);
            }
            return(result);
        }
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="material"></param>
 public override void Init(MultiSitePeriodInfo material)
 {
     if (material.EnabledPrns.Contains(Prn))
     {
         this.HasCycleSlip = material.HasCycleSlip(Prn);
     }
 }
Example #4
0
        /// <summary>
        /// 滤波算法。
        /// </summary>
        /// <param name="epochInfos"></param>
        /// <param name="lastResult"></param>
        /// <returns></returns>
        public override BaseGnssResult CaculateKalmanFilter(MultiSitePeriodInfo epochInfos, BaseGnssResult lastResult = null)
        {
            var result = base.CaculateKalmanFilter(epochInfos, lastResult) as PeriodDoubleDifferPositionResult;


            //模糊度固定解
            //if (Option.IsFixingAmbiguity && result.EstimatedXyzRms.Norm < 0.01)
            //{
            //    Vector fixedIntAmbiCycles = null;
            //    if (!TryFixeAmbiguites(result, out fixedIntAmbiCycles))
            //    {
            //        return result;
            //    }

            //    //固定成功,则将浮点解作为虚拟观测值,整数解作为约束进行条件平差
            //    //保存到结果,用于输出
            //    result.FixedIntAmbiguities = fixedIntAmbiCycles;
            //    var lastDdResult = lastResult as PeriodDoubleDifferPositionResult;
            //    if (lastDdResult == null)
            //    {
            //        return result;
            //    }
            //    //恢复模糊度为米,计算固定解
            //    var fixedAmbiMeters = ConvertCycleAmbiguityToMeter(fixedIntAmbiCycles);
            //    var prevFixedAmbiMeters = ConvertCycleAmbiguityToMeter(lastDdResult.FixedIntAmbiguities);
            //    WeightedVector NewEstimated = Adjustment.SolveAmbiFixedResult(fixedAmbiMeters, prevFixedAmbiMeters);

            //    result.ResultMatrix.Estimated = NewEstimated;
            //}

            //this.CurrentProduct = result;

            return(result);
        }
 /// <summary>
 /// 钟差估计构造函数
 /// </summary>
 /// <param name="epochInfo">历元信息</param>
 /// <param name="Adjustment">平差信息</param>
 /// <param name="ClockEstimationer">钟差估计器</param>
 /// <param name="previousResult">上一历元结果</param>
 public DifferClockEstimationResult(
     MultiSitePeriodInfo epochInfo,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder DifferenceClockEstimationer,
     DifferClockEstimationResult previousResult = null)
     : base(epochInfo, Adjustment, DifferenceClockEstimationer)
 {
 }
Example #6
0
 /// <summary>
 /// 双差差分定位结果。具有模糊度。
 /// </summary>
 /// <param name="Adjustment"></param>
 /// <param name="BasePrn"></param>
 /// <param name="DifferPositionOption"></param>
 /// <param name="PeriodDifferInfo"></param>
 /// <param name="nameBuilder"></param>
 public PeriodDoubleDifferPositionResult(
     MultiSitePeriodInfo PeriodDifferInfo,
     AdjustResultMatrix Adjustment,
     SatelliteNumber BasePrn,
     GnssProcessOption DifferPositionOption, GnssParamNameBuilder nameBuilder)
     : base(PeriodDifferInfo, Adjustment, BasePrn, nameBuilder)
 {
     this.Option = DifferPositionOption;
 }
Example #7
0
 /// <summary>
 /// 以观测信息进行初始化
 /// </summary>
 /// <param name="Adjustment">平差</param>
 /// <param name="BasePrn">基准星</param>
 /// <param name="PeriodDifferInfo">区间差分信息</param>
 /// <param name="lastPppResult">最后结果</param>
 public TwoSitePeriodDifferPositionResult(
     MultiSitePeriodInfo PeriodDifferInfo,
     AdjustResultMatrix Adjustment,
     SatelliteNumber BasePrn,
     GnssParamNameBuilder nameBuilder)
     : base(PeriodDifferInfo, Adjustment, nameBuilder)
 {
     this.BasePrn = BasePrn;
 }
Example #8
0
        void pp_ProgressIncreased(BaseGnssResult e, MultiSitePeriodInfo sender)
        {
            BaseGnssResult result = e as BaseGnssResult;

            if (result == null)
            {
                return;
            }
            _results.Add(result);
            ShowCurrent(result);
        }
Example #9
0
        public override BaseGnssResult CaculateIndependent(MultiSitePeriodInfo epochInfos)
        {
            if (!this.MatrixBuilder.IsAdjustable)
            {
                log.Warn("不适合平差!" + MatrixBuilder.Message); return(null);
            }

            this.Adjustment = this.RunAdjuster(BuildAdjustObsMatrix(this.CurrentMaterial));
            AdjustResultMatrix lastFloat = this.Adjustment;

            return(BuildResult());
        }
Example #10
0
 public virtual void Init(MultiSitePeriodInfo epochInfo)
 {
     this.Init(epochInfo.First);
 }
Example #11
0
        /// <summary>
        /// Kalmam滤波。
        /// </summary>
        /// <param name="epochInfos">接收信息</param>
        /// <param name="lastResult">上次解算结果(用于 Kalman 滤波),若为null则使用初始值计算</param>
        /// <returns></returns>
        public BaseGnssResult CaculateKalmanFilter2(MultiSitePeriodInfo epochInfos, BaseGnssResult lastResult = null)
        {
            var result = base.CaculateKalmanFilter(epochInfos, lastResult) as PeriodDoubleDifferPositionResult;

            //模糊度固定解
            if (this.IsFixingAmbiguity)
            {
                AmbiguityManager.Regist(result); //用于存储和输出模糊度。

                var floatSolMetter = this.Adjustment.Estimated;
                //尝试固定模糊度
                var fixedIntAmbiCycles = FixePhaseAmbiguity(result);

                //模糊度固定失败,直接返回浮点数结果。
                if (fixedIntAmbiCycles.Count == 0)
                {
                    return(result);
                }

                //固定成功,则将浮点解作为虚拟观测值,整数解作为约束进行条件平差

                //保存到结果,用于输出
                result.FixedParams = fixedIntAmbiCycles;
                //恢复模糊度为米
                var fixedAmbiMeters = ConvertCycleAmbiguityToMeter(fixedIntAmbiCycles);

                //组建条件数的系数阵,
                var coeffOfConstrant = BuildCoeffiientMatrix(floatSolMetter.ParamNames, fixedAmbiMeters.ParamNames);

                //条件平差,观测值为浮点解,上一观测结果作为虚拟观测值,
                var obsVector = floatSolMetter;
                var ca        = new ConditionalAdjustment(obsVector, coeffOfConstrant, (Vector)(fixedAmbiMeters * (-1.0))); //此处B0为加,所以要乘以-1
                ca.Process();

                var fixedDiffer = ca.CorrectedObservation;
                //避免方差太小,但是好像没有什么用处。
                for (int j = 0; j < floatSolMetter.Count; j++)
                {
                    if (fixedDiffer.InverseWeight[j, j] < 1e-6)
                    {
                        fixedDiffer.InverseWeight[j, j] = 1e-6;
                    }
                }


                //更新结果
                //只更新坐标
                //floatSolMetter[Gnsser.ParamNames.DeltaX] = fixedDiffer[Gnsser.ParamNames.DeltaX];
                //floatSolMetter[Gnsser.ParamNames.DeltaY] = fixedDiffer[Gnsser.ParamNames.DeltaY];
                //floatSolMetter[Gnsser.ParamNames.DeltaZ] = fixedDiffer[Gnsser.ParamNames.DeltaZ];
                result.ResultMatrix.Estimated = fixedDiffer;

                //result.Adjustment.Estimated = estimated;

                //from cuiyang to check
                IMatrix B      = coeffOfConstrant;
                IMatrix BT     = B.Transposition;
                IMatrix L      = floatSolMetter;
                IMatrix QL     = floatSolMetter.InverseWeight;
                IMatrix B0     = new VectorMatrix(fixedAmbiMeters * (-1)); //条件方程常数项
                IMatrix W      = B.Multiply(L).Plus(B0);                   // W = BL - B0
                IMatrix BQBT   = B.Multiply(QL).Multiply(BT);
                IMatrix Nadd   = (QL.Multiply(BT)).Multiply(BQBT.GetInverse());
                IMatrix X_new  = L.Minus(Nadd.Multiply(W));
                IMatrix QX_new = QL.Minus(Nadd.Multiply(B).Multiply(QL));
                var     check  = new WeightedVector(X_new, QX_new);
                int     ii     = 0;
                //result.Adjustment.Estimated = new WeightedVector(X_new, QX_new);
            }

            this.SetProduct(result);

            return(result);
        }