예제 #1
0
 /// <summary>
 /// 精 通用单站单频计算,高度可配置构造函数。
 /// </summary>
 /// <param name="receiverInfo">接收信息</param>
 /// <param name="Adjustment">平差</param>
 /// <param name="paramNames">参数名称</param>
 public CommonSingeFreqGnssResult(
     EpochInformation receiverInfo,
     AdjustResultMatrix Adjustment, GnssParamNameBuilder positioner
     )
     : base(receiverInfo, Adjustment, positioner)
 {
 }
예제 #2
0
 /// <summary>
 /// 精 通用单站单频计算,高度可配置构造函数。
 /// </summary>
 /// <param name="receiverInfo">接收信息</param>
 /// <param name="Adjustment">平差</param>
 /// <param name="positioner">定位器</param>
 public DoubleFreqIonoSingleFreqPppGnssResult(
     EpochInformation receiverInfo,
     AdjustResultMatrix Adjustment, GnssParamNameBuilder positioner
     )
     : base(receiverInfo, Adjustment, positioner)
 {
 }
        /// <summary>
        /// 精密单点定位结果构造函数。
        /// </summary>
        /// <param name="receiverInfo">接收信息</param>
        /// <param name="Adjustment">平差</param>
        /// <param name="nameBuilder">参数名称生成器</param>
        public IonoModeledSingleFreqPppResult(
            EpochInformation receiverInfo,
            AdjustResultMatrix Adjustment, GnssParamNameBuilder nameBuilder
            )
            : base(receiverInfo, Adjustment, nameBuilder)
        {
            this.WetTropoFactor = this.ResultMatrix.Corrected.CorrectedValue[Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd)];
            //处理模糊度
            this.AmbiguityDic = new Dictionary <SatelliteNumber, double>();

            int length = receiverInfo.EnabledSatCount * 2 + 5;

            Vector vector = Adjustment.Corrected.CorrectedValue;

            for (int i = 5 + receiverInfo.EnabledSatCount; i < 5 + receiverInfo.EnabledSatCount; i++)
            {
                SatelliteNumber prn = receiverInfo[i - 5 - receiverInfo.EnabledSatCount].Prn;
                //double val = vector[i];
                //double[] AmbiguityItem = new double[1];

                //AmbiguityItem[0] = val;
                ////AmbiguityItem[1] = vector[i + receiverInfo.EnabledSatCount];

                //AmbiguityDic.Add(prn, val);
            }
        }
예제 #4
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="Material">历元信息</param>
 /// <param name="Adjustment">平差信息</param>
 /// <param name="NameBuilder">参数名称</param>
 public SimpleGnssResult(
     TMaterial Material,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder NameBuilder) : base(Adjustment)
 {
     this.Material = Material;
 }
        /// <summary>
        /// 双差网解定位。具有模糊度。
        /// </summary>
        /// <param name="mInfo">历元观测信息</param>
        /// <param name="Adjustment"></param>
        /// <param name="positioner"></param>
        /// <param name="baseSatPrn"></param>
        /// <param name="baseParamCount"></param>
        public NetDoubleDifferPositionResult(
            MultiSiteEpochInfo mInfo,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder positioner,
            SatelliteNumber baseSatPrn,
            int baseParamCount = 5
            )
            : base(mInfo, Adjustment, positioner)
        {
            //设置第一个流动站坐标改正数
            int i        = 0;
            var estmated = this.ResultMatrix.Estimated;

            foreach (var paramName in estmated.ParamNames)
            {
                if (paramName.Contains(Gnsser.ParamNames.Dx))
                {
                    double x = estmated[i];
                    double y = estmated[i + 1];
                    double z = estmated[i + 2];
                    this.XyzCorrection = new XYZ(x, y, z);
                    break;
                }
            }
        }
예제 #6
0
        /// <summary>
        /// 设置常见的变量。
        /// </summary>
        /// <param name="Adjustment"></param>
        protected override void TrySetCommonParamValues(AdjustResultMatrix Adjustment)
        {
            base.TrySetCommonParamValues(Adjustment);

            Vector estmated = Adjustment.Estimated;

            if (estmated != null)
            {
                //对流层设置
                //if (Adjustment.ParamNames.Contains(Gnsser.ParamNames.Trop))
                //{
                //    epochInfo.NumeralCorrections[Gnsser.ParamNames.Trop] = estmated[Adjustment.GetIndexOf(Gnsser.ParamNames.Trop)];
                //}
                //需要计算的属性
                //接收机钟差
                if (Adjustment.ParamNames.Contains(Gnsser.ParamNames.RcvClkErrDistance))
                {
                    this.RcvClkErrDistance = estmated[Adjustment.GetIndexOf(Gnsser.ParamNames.RcvClkErrDistance)];
                    //log.Debug("取消了接收机钟差改正!");
                    //钟差到改正数,需要转换为相反数 // 2018.06.08, czs, HMX
                    double clkError = this.RcvClkErrDistance / GnssConst.LIGHT_SPEED;
                    if (Math.Abs(clkError) > GnssConst.LIGHT_SPEED)
                    {
                        log.Warn("钟差太大了吧! " + clkError);
                    }
                    this.MaterialObj.Time.Correction = -clkError; //钟差变成改正数
                }
            }
        }
예제 #7
0
 /// <summary>
 /// 追加测站信息
 /// </summary>
 /// <param name="sb"></param>
 /// <param name="Adjustment"></param>
 private void BuildAdjustInfo(StringBuilder sb, AdjustResultMatrix Adjustment)
 {
     sb.AppendLine("--------------  最后历元平差信息  ---------------");
     AppendLine(sb, "观测数量", Adjustment.ObsMatrix.ObsCount);
     AppendLine(sb, "参数数量", Adjustment.ParamCount);
     AppendLine(sb, "单位权中误差", Adjustment.StdDev);
     AppendLine(sb, "参数估值", Adjustment.Estimated);
 }
예제 #8
0
 /// <summary>
 /// 单站GNSS结果
 /// </summary>
 /// <param name="epochInfo"></param>
 /// <param name="adjust"></param>
 /// <param name="nameBuilder"></param>
 public SingleSiteGnssResult(EpochInformation epochInfo, AdjustResultMatrix adjust, GnssParamNameBuilder nameBuilder, bool isTopSpeed = false)
     : base(epochInfo, adjust, nameBuilder, isTopSpeed)
 {
     if (!isTopSpeed)
     {
         this.DilutionOfPrecision = new DilutionOfPrecision(epochInfo);
     }
 }
예제 #9
0
 /// <summary>
 /// 非差轨道确定
 /// </summary>
 /// <param name="epochInfo">历元信息</param>
 /// <param name="Adjustment">平差信息</param>
 /// <param name="ClockEstimationer">钟差估计器</param>
 /// <param name="previousResult">上一历元结果</param>
 public ZeroDifferOrbitResult(
     MultiSiteEpochInfo epochInfo,
     AdjustResultMatrix Adjustment,
     ZeroDifferOrbitParamNameBuilder ClockEstimationer,
     MultiSiteGnssExtentResult previousResult = null)
     : base(epochInfo, Adjustment, ClockEstimationer)
 {
 }
예제 #10
0
 /// <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)
 {
 }
예제 #11
0
 /// <summary>
 /// 精密单点定位结果构造函数。
 /// </summary>
 /// <param name="receiverInfo">接收信息</param>
 /// <param name="Adjustment">平差</param>
 /// <param name="positioner">名称</param>
 /// <param name="baseParamCount">基础参数数量</param>
 public RecursiveIonoFreePppResult(
     EpochInformation receiverInfo,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder positioner,
     int baseParamCount = 5
     )
     : base(receiverInfo, Adjustment, positioner)
 {
 }
예제 #12
0
        /// <summary>
        /// 非差轨道确定
        /// </summary>
        /// <param name="Material">历元信息</param>
        /// <param name="ResultMatrix">平差信息</param>
        /// <param name="ParamNameBuilder">钟差估计器</param>
        /// <param name="previousResult">上一历元结果</param>
        public RangeOrbitResult(
            MultiSiteEpochInfo Material,
            AdjustResultMatrix ResultMatrix,
            RangeOrbitParamNameBuilder ParamNameBuilder,
            RangeOrbitResult previousResult = null)
            : base(Material, ResultMatrix, ParamNameBuilder)
        {
            //测站接收机钟差改正
            foreach (var site in Material)
            {
                var clkName = ParamNameBuilder.GetReceiverClockParamName(site.SiteName);
                var val     = ResultMatrix.Estimated.Get(clkName);
                site.Time.Correction = GetTimeCorrectionSeconds(val.Value);
            }

            //提取星历参数,可以用于改正卫星位置,进行迭代计算
            EphemerisResults = new BaseDictionary <SatelliteNumber, EphemerisResult>();
            foreach (var site in Material)
            {
                foreach (var sat in site)
                {
                    var prn = sat.Prn;

                    Ephemeris estimated = new Ephemeris(sat.Ephemeris.Prn, sat.Ephemeris.Time)
                    {
                        XyzDotRms = new XYZ()
                    };
                    var clkName = ParamNameBuilder.GetSatClockParamName(prn);
                    var val     = ResultMatrix.Estimated.Get(clkName);
                    estimated.ClockBias    = GetTimeCorrectionSeconds(val.Value);
                    estimated.ClockBiasRms = val.Rms / GnssConst.LIGHT_SPEED;

                    var names = ParamNameBuilder.GetSatDxyz(prn);
                    foreach (var item in names)
                    {
                        val = ResultMatrix.Estimated.Get(item);
                        if (item.Contains(Gnsser.ParamNames.Dx))
                        {
                            estimated.XYZ.X       = val.Value;
                            estimated.XyzDotRms.X = val.Rms;
                        }
                        if (item.Contains(Gnsser.ParamNames.Dy))
                        {
                            estimated.XYZ.Y       = val.Value;
                            estimated.XyzDotRms.Y = val.Rms;
                        }
                        if (item.Contains(Gnsser.ParamNames.Dz))
                        {
                            estimated.XYZ.Z       = val.Value;
                            estimated.XyzDotRms.Z = val.Rms;
                        }
                    }

                    EphemerisResults[prn] = new EphemerisResult((Ephemeris)sat.Ephemeris, estimated);
                }
            }
        }
예제 #13
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;
 }
예제 #14
0
 /// <summary>
 /// 精密单点定位结果构造函数。
 /// </summary>
 /// <param name="receiverInfo">接收信息</param>
 /// <param name="Adjustment">平差</param>
 /// <param name="paramNames">参数名称</param>
 public UncombinedPppResult(
     EpochInformation receiverInfo,
     AdjustResultMatrix Adjustment, GnssParamNameBuilder positioner
     )
     : base(receiverInfo, Adjustment, positioner)
 {
     this.WetTropoFactor = this.ResultMatrix.Corrected.CorrectedValue[Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd)];
     //处理模糊度
 }
예제 #15
0
파일: Ppp_AR.cs 프로젝트: yxw027/GNSSer
        private WeightedVector fix_sol(EpochInformation receiverInfo, AdjustResultMatrix adjustment, int[] satN1, int[] satN2, double[] NC, int n, ref double factor0)
        {
            int i, j, k;

            double[] v = new double[n];          //m * 1

            int nx = adjustment.Estimated.Count; //参数个数  n*1

            double[][] H = new double[nx][]; for (i = 0; i < nx; i++)
            {
                H[i] = new double[n];                                                        //n * m
            }
            double[][] R = new double[n][]; for (i = 0; i < n; i++)
            {
                R[i] = new double[n];                                                       //m * m
            }
            SatelliteNumber sat1 = new SatelliteNumber();
            SatelliteNumber sat2 = new SatelliteNumber();


            //constraints to fixed ambiguities
            for (i = 0; i < n; i++)
            {
                sat1.PRN           = satN1[i];
                sat1.SatelliteType = SatelliteType.G;
                sat2.PRN           = satN2[i];
                sat2.SatelliteType = SatelliteType.G;

                j = receiverInfo.EnabledPrns.IndexOf(sat1); //模糊度参数的索引
                k = receiverInfo.EnabledPrns.IndexOf(sat2); //模糊度参数的索引

                v[i] = NC[i] - (adjustment.Estimated.OneDimArray[j + 5] - adjustment.Estimated.OneDimArray[k + 5]);
                // v[time] = NC[time] - (adjustment.Estimated[j + 5] - adjustment.Estimated[k + 5]);
                H[j + 5][i] = 1.0;
                H[k + 5][i] = -1.0;
                R[i][i]     = CONST_AMB * CONST_AMB;
            }


            //update states with constraints
            WeightedVector Estimated = filter(adjustment.Estimated.OneDimArray, adjustment.Estimated.InverseWeight.Array, H, v, R, ref factor0);


            //set flags
            for (i = 0; i < n; i++)
            {
                sat1.PRN           = satN1[i];
                sat1.SatelliteType = SatelliteType.G;
                sat2.PRN           = satN2[i];
                sat2.SatelliteType = SatelliteType.G;

                ambc[sat1].flags[sat2] = 1;
                ambc[sat2].flags[sat1] = 1;
            }

            return(Estimated);
        }
예제 #16
0
 /// <summary>
 /// 单站单历元GNSS计算预留测试类
 /// </summary>
 /// <param name="receiverInfo">接收信息</param>
 /// <param name="Adjustment">平差</param>
 /// <param name="positioner">定位器</param>
 /// <param name="baseParamCount">基础参数数量</param>
 public SingeSiteGnssExtentResult(
     EpochInformation receiverInfo,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder positioner,
     int baseParamCount = 5
     )
     : base(receiverInfo, Adjustment, positioner)
 {
 }
예제 #17
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;
 }
예제 #18
0
        /// <summary>
        /// 滤波
        /// </summary>
        /// <param name="newVal"></param>
        /// <returns></returns>
        public RmsedNumeral Filter(RmsedNumeral newVal)
        {
            var builder = new OneDimAdjustMatrixBuilder(newVal, PrevAdjustment);
            var sp      = new SimpleKalmanFilter();
            var a       = sp.Run(builder);
            var est     = a.Estimated;

            this.PrevAdjustment = a;//update
            return(new RmsedNumeral(est[0], est.GetRmsVector()[0]));
        }
 /// <summary>
 /// 双差网解定位。具有模糊度。
 /// </summary>
 /// <param name="mInfo">历元观测信息</param>
 /// <param name="Adjustment"></param>
 /// <param name="positioner"></param>
 /// <param name="baseSatPrn"></param>
 /// <param name="baseParamCount"></param>
 public RecursiveNetDoubleDifferPositionResult(
     MultiSiteEpochInfo mInfo,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder positioner,
     SatelliteNumber baseSatPrn,
     int baseParamCount = 5
     )
     : base(mInfo, Adjustment, positioner)
 {
 }
예제 #20
0
        /// <summary>
        /// 水平Kalman滤波
        /// </summary>
        /// <param name="val"></param>
        /// <returns></returns>
        private double DoLevelKalmanFilter(double val)
        {
            var builder = new OneDimAdjustMatrixBuilder(val, Adjustment);
            var sp      = new SimpleKalmanFilter();

            Adjustment = sp.Run(builder);
            var smoothData = Adjustment.Estimated[0];

            return(smoothData);
        }
 /// <summary>
 /// 简易近距离单历元载波相位双差
 /// </summary>
 /// <param name="material"></param>
 /// <param name="Adjustment"></param>
 /// <param name="positioner"></param>
 /// <param name="baseSatPrn"></param>
 public EpochDoubleDifferPositionResult(
     MultiSiteEpochInfo material,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder positioner,
     SatelliteNumber baseSatPrn
     )
     : base(material, Adjustment, positioner)
 {
     this.BasePrn = baseSatPrn;
     this.Option  = positioner.Option;
 }
예제 #22
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());
        }
예제 #23
0
 /// <summary>
 /// GNSS结果构造函数
 /// </summary>
 /// <param name="epochInfo">历元信息</param>
 /// <param name="Adjustment">平差信息</param>
 /// <param name="NameBuilder">参数生成器</param>
 public BaseGnssResult(
     TMaterial epochInfo,
     AdjustResultMatrix Adjustment,
     GnssParamNameBuilder NameBuilder, bool isTopSpeed = false)
     : base(epochInfo, Adjustment, NameBuilder)
 {
     this.Name        = epochInfo.Name;
     this.MaterialObj = epochInfo;
     if (!isTopSpeed)
     {
         TrySetCommonParamValues(Adjustment);
     }
 }
예제 #24
0
        /// <summary>
        /// 滤波。默认期望为常数。
        /// </summary>
        /// <param name="rawValue"></param>
        /// <returns></returns>
        protected double Filter(double rawValue)
        {
            AdjustResultMatrix prev = CurrentAdjustment;

            var builder = new OneDimAdjustMatrixBuilder(rawValue, prev);
            var sp      = new SimpleKalmanFilter();
            var ad      = sp.Run(builder);

            CurrentAdjustment = ad;
            var smoothData = ad.Estimated[0];

            return(smoothData);
        }
예제 #25
0
        /// <summary>
        /// 双差网解定位构造函数
        /// </summary>
        /// <param name="epochInfo">历元信息</param>
        /// <param name="Adjustment">平差信息</param>
        /// <param name="ClockEstimationer">钟差估计器</param>
        /// <param name="previousResult">上一历元结果</param>
        public MultiSiteGnssExtentResult(
            MultiSiteEpochInfo epochInfo,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder ClockEstimationer,
            MultiSiteGnssExtentResult previousResult = null)
            : base(epochInfo, Adjustment, ClockEstimationer)
        {
            Vector vector = Adjustment.Corrected.CorrectedValue;

            //update
            foreach (var epoch in epochInfo)
            {
                var key = NameBuilder.GetSiteWetTropZpdName(epoch);
                epoch.NumeralCorrections[Gnsser.ParamNames.WetTropZpd] = vector[Adjustment.GetIndexOf(key)];
            }
        }
예제 #26
0
파일: Ppp_AR.cs 프로젝트: yxw027/GNSSer
        /// <summary>
        /// 精密单点定位结果构造函数。
        /// </summary>
        /// <param name="receiverInfo">接收信息</param>
        /// <param name="Adjustment">平差</param>
        /// <param name="paramNames">参数名称</param>
        public int Process(EpochInformation receiverInfo, AdjustResultMatrix Adjustment)
        {
            int m = 0, stat = 0;
            int n = receiverInfo.EnabledPrns.Count;

            int[] NW   = new int[n * n];
            int[] sat1 = new int[n * n];
            int[] sat2 = new int[n * n];


            //average LC
            ComputeAverage_LC(receiverInfo);

            //fix wide-lane ambiguity
            for (int i = 0; i < n - 1; i++)
            {
                for (int j = i + 1; j < n; j++)
                {
                    //test already fixed
                    if (ambc[receiverInfo[i].Prn].flags[receiverInfo[j].Prn] != 0 &&
                        ambc[receiverInfo[j].Prn].flags[receiverInfo[i].Prn] != 0)
                    {
                        continue;
                    }


                    sat1[m] = receiverInfo[i].Prn.PRN;  //只考虑GPS的固定
                    sat2[m] = receiverInfo[j].Prn.PRN;

                    if (fix_amb_WL(receiverInfo, sat1[m], sat2[m], ref NW[m]) == 1)
                    {
                        m++;
                    }
                }
            }


            //fix narrow-lane ambiguity
            //AR mode: PPP_AR (目前实现的)
            stat = fxi_amb_NL_ROUND(receiverInfo, Adjustment, sat1, sat2, NW, m);
            //AR mode: PPP_AR ILS



            return(stat);
        }
예제 #27
0
        /// <summary>
        /// 运行计算器
        /// </summary>
        /// <param name="obsMatrix"></param>
        /// <returns></returns>
        protected virtual AdjustResultMatrix RunAdjuster(AdjustObsMatrix obsMatrix)
        {
            AdjustResultMatrix result = null;

            if (this.Option.IsAdjustEnabled)
            {
                result = this.MatrixAdjuster.Run(obsMatrix);
            }
            else
            {
                result = new AdjustResultMatrix()
                {
                    ObsMatrix = obsMatrix
                };
            }
            return(result);
        }
        /// <summary>
        /// 双差差分定位结果。具有模糊度。
        /// </summary>
        /// <param name="epochInfo">历元观测信息</param>
        /// <param name="PointPositionType">单点定位类型</param>
        public EpochDouFreDoubleDifferPositionResult(
            MultiSiteEpochInfo receiverInfo,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder positioner,
            SatelliteNumber baseSatPrn,
            int baseParamCount = 5
            )
            : base(receiverInfo, Adjustment, positioner)
        {
            this.BasePrn = baseSatPrn;
            int index = Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd);

            if (index != -1)
            {
                this.WetTropoFactor = this.ResultMatrix.Corrected.CorrectedValue[Adjustment.GetIndexOf(Gnsser.ParamNames.WetTropZpd)];
            }
            else
            {
                this.WetTropoFactor = 0.0;
            }
            //处理模糊度
            this.AmbiguityDic = new Dictionary <SatNumberAndFrequence, double>();

            Vector vector = Adjustment.Corrected.CorrectedValue;

            int satIndex = 0;

            foreach (var item in receiverInfo.EnabledPrns)
            {
                if (item != BasePrn)
                {
                    Frequence             FrequenceA = Frequence.GetFrequence(this.BasePrn, SatObsDataType.PhaseRangeA, receiverInfo.ReceiverTime);
                    Frequence             FrequenceB = Frequence.GetFrequence(this.BasePrn, SatObsDataType.PhaseRangeB, receiverInfo.ReceiverTime);
                    SatNumberAndFrequence satA       = new SatNumberAndFrequence();
                    satA.SatNumber = item; satA.Frequence = FrequenceA;
                    SatNumberAndFrequence satB = new SatNumberAndFrequence();
                    satB.SatNumber = item; satB.Frequence = FrequenceB;
                    double val = vector[satIndex];
                    AmbiguityDic.Add(satA, val);
                    AmbiguityDic.Add(satB, val);
                    satIndex++;
                }
            }
        }
예제 #29
0
        /// <summary>
        /// 参数估计
        /// </summary>
        /// <returns></returns>
        public PlainXyConvertParam Estimate()
        {
            var obsVector = new Vector(ObsCount);

            //构建观测向量
            for (int i = 0; i < CoordCount; i++)
            {
                int index = 2 * i;
                var oldXy = OldOrTobeConvertingXys[i];
                var newXy = NewOrTargedXys[i];
                obsVector[index + 0] = newXy.X - oldXy.X;
                obsVector[index + 1] = newXy.Y - oldXy.Y;
            }
            //构建系数阵
            Matrix coeffOfParam = new Matrix(ObsCount, 4);

            for (int i = 0; i < CoordCount; i++)
            {
                int index = 2 * i;
                var oldXy = OldOrTobeConvertingXys[i];
                //尺度因子,
                coeffOfParam[index + 0, 0] = 1;
                coeffOfParam[index + 1, 1] = 1;
                //转换参数,弧度
                coeffOfParam[index + 0, 2] = oldXy.X;
                coeffOfParam[index + 0, 3] = oldXy.Y;
                coeffOfParam[index + 1, 2] = oldXy.Y;
                coeffOfParam[index + 1, 3] = -oldXy.X;
            }


            AdjustObsMatrix obsMatrix = new AdjustObsMatrix();

            obsMatrix.SetCoefficient(coeffOfParam).SetObservation(obsVector);
            var adjuster = new ParamAdjuster();

            this.ResultMatrix = adjuster.Run(obsMatrix);
            var ested = ResultMatrix.Estimated;

            var result = new PlainXyConvertParam(new XY(ested[0], ested[1]), ested[2] * 1e6, ested[3] * CoordConsts.RadToSecMultiplier);

            return(result);
        }
예제 #30
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="epochInfos"></param>
        /// <param name="Adjustment"></param>
        /// <param name="nameBuilder"></param>
        public AbstractClockEstimationResult(
            MultiSiteEpochInfo epochInfos,
            AdjustResultMatrix Adjustment,
            GnssParamNameBuilder nameBuilder) : base(epochInfos, Adjustment, nameBuilder)
        {
            Vector corrected = Adjustment.Corrected.CorrectedValue;


            //update

            this.DeltaTimeDistances = new Dictionary <string, double>();
            foreach (var epoch in epochInfos)
            {
                var key = NameBuilder.GetReceiverClockParamName(epoch);
                var val = corrected[Adjustment.GetIndexOf(key)];
                epoch.NumeralCorrections[Gnsser.ParamNames.cDt] = val;
                this.DeltaTimeDistances.Add(epoch.Name, val);
                epoch.Time.Correction = val / GnssConst.LIGHT_SPEED;
            }
        }