Changeset 10256 in ntrip for trunk/BNC/src/PPP/pppFilter.cpp


Ignore:
Timestamp:
Nov 25, 2023, 10:44:51 PM (10 months ago)
Author:
stuerze
Message:

changes regarding PPP

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/PPP/pppFilter.cpp

    r10254 r10256  
    8686  // Status Vector, Variance-Covariance Matrix
    8787  // -----------------------------------------
    88   _xFltOld = _xFlt;
    89   _QFltOld = _QFlt;
    90   setStateVectorAndVarCovMatrix(setNeuNoiseToZero);
     88  ColumnVector    xFltOld = _xFlt;
     89  SymmetricMatrix QFltOld = _QFlt;
     90  setStateVectorAndVarCovMatrix(xFltOld, QFltOld, setNeuNoiseToZero);
    9191
    9292  // Process Satellite Systems separately
     
    167167    for (unsigned ii = 0; ii < obsVector.size(); ii++) {
    168168      t_pppSatObs *obs = obsVector[ii];
     169      char sys = obs->prn().system();
    169170      if (iOutlier == 0) {
    170171        obs->resetOutlier();
     
    184185            AA[iObs][iPar] = par->partial(_epoTime, obs, tLC);
    185186          }
    186           ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
     187          double offGlo = 0;
     188          if (sys == 'R' && tLC != t_lc::MW) {
     189            offGlo = PPP_CLIENT->offGlo();
     190          }
     191          double offGal = 0;
     192          if (sys == 'E' && tLC != t_lc::MW) {
     193            offGal = PPP_CLIENT->offGal();
     194          }
     195          double offBds = 0;
     196          if (sys == 'C' && tLC != t_lc::MW) {
     197            offBds = PPP_CLIENT->offBds();
     198          }
     199          ll[iObs] = obs->obsValue(tLC) - offGlo - offGal - offBds  - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
    187200          PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC));
    188201        }
     
    192205    // Check number of observations
    193206    // ----------------------------
    194     if (!nSat) {
     207    if (nSat < 2) {
    195208      return failure;
    196209    }
     
    201214      for (unsigned ii = 0; ii < obsVector.size(); ii++) {
    202215        t_pppSatObs *obs = obsVector[ii];
     216        char sys = obs->prn().system();
    203217        if (!obs->outlier()) {
    204218          for (unsigned jj = 0; jj < usedLCs; jj++) {
     
    215229              AA[iObs][iPar] = par->partial(_epoTime, obs, tLC);
    216230            }
    217             ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
     231            double offGlo = 0;
     232            if (sys == 'R' && tLC != t_lc::MW) {
     233              offGlo = PPP_CLIENT->offGlo();
     234            }
     235            double offGal = 0;
     236            if (sys == 'E' && tLC != t_lc::MW) {
     237              offGal = PPP_CLIENT->offGal();
     238            }
     239            double offBds = 0;
     240            if (sys == 'C' && tLC != t_lc::MW) {
     241              offBds = PPP_CLIENT->offBds();
     242            }
     243            ll[iObs] = obs->obsValue(tLC) - offGlo - offGal - offBds  - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
    218244            PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC));
    219245          }
     
    269295//        if (par->ambResetCandidate()) {
    270296          resetAmb(obs->prn(), obsVector, maxOutlierLC, &QSav, &xSav);
    271           adjustNoise(t_pppParam::ion, obs->prn(), 0.1, &QSav);
    272297//        }
    273298//        else {
     
    307332                                    const vector<t_pppSatObs*> &obsVector) {
    308333
    309   const double SLIP = 1000.0;
     334  const double SLIP = 20.0;
    310335  string epoTimeStr = string(_epoTime);
    311336  const vector<t_pppParam*> &params = _parlist->params();
     
    316341      for (unsigned iObs = 0; iObs < obsVector.size(); iObs++) {
    317342        const t_pppSatObs *obs = obsVector[iObs];
     343        char sys = obs->prn().system();
    318344
    319345        // Check set Slips and Jump Counters
     
    344370        if (slip) {
    345371          resetAmb(obs->prn(), obsVector, tLC);
    346           adjustNoise(t_pppParam::ion, obs->prn(), 0.1);
    347         }
    348 
    349         // Check Pre-Fit Residuals
    350         // -----------------------
     372        }
     373
     374        // Check Pre-Fit Residuals => switched off, because after a millisecond receiver clock jump, a cycle slip is detected for all satellites
     375        /* -----------------------
     376
    351377        else {
    352378          ColumnVector AA(params.size());
     
    355381            AA[iPar] = par->partial(_epoTime, obs, tLC);
    356382          }
    357 
    358           double ll = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA);
     383          double offGlo = 0;
     384          if (sys == 'R' && tLC != t_lc::MW) {
     385            offGlo = PPP_CLIENT->offGlo();
     386          }
     387          double offGal = 0;
     388          if (sys == 'E' && tLC != t_lc::MW) {
     389            offGal = PPP_CLIENT->offGal();
     390          }
     391          double offBds = 0;
     392          if (sys == 'C' && tLC != t_lc::MW) {
     393            offBds = PPP_CLIENT->offBds();
     394          }
     395          double ll = obs->obsValue(tLC) - offGlo - offGal - offBds  - obs->cmpValue(tLC) - DotProduct(_x0, AA);
    359396          double vv = DotProduct(AA, _xFlt) - ll;
    360397
     
    363400                << obs->prn().toString() << ' ' << setw(8) << setprecision(4) << vv << endl;
    364401            resetAmb(obs->prn(), obsVector, tLC);
    365             adjustNoise(t_pppParam::ion, obs->prn(), 0.1);
    366           }
    367         }
     402          }
     403        }*/
    368404      }
    369405    }
     
    413449      }
    414450      _x0[ind] = par->x0();
    415       return success;
    416     }
    417   }
    418 
    419   return irc;
    420 }
    421 
    422 // Adjust process noise of individual parameters
    423 ////////////////////////////////////////////////////////////////////////////
    424 t_irc t_pppFilter::adjustNoise(t_pppParam::e_type parType, t_prn prn, double noise,
    425                                SymmetricMatrix *QSav) {
    426 
    427   t_irc irc = failure;
    428   vector<t_pppParam*>& params = _parlist->params();
    429   for (unsigned iPar = 0; iPar < params.size(); iPar++) {
    430     t_pppParam *par = params[iPar];
    431     if (par->type() == parType && par->prn() == prn) {
    432       int iOld = par->indexOld();
    433       int iNew = par->indexNew();
    434       LOG << string(_epoTime) << " ADJUSTNOISE " << prn.toString() << endl;
    435       _QFlt[iNew][iNew] = _QFltOld[iOld][iOld] + noise * noise;
    436       if (QSav) {
    437         (*QSav)(iNew + 1, iNew + 1) = _QFlt(iNew + 1, iNew + 1);
    438       }
    439       return success;
    440     }
    441   }
     451      irc = success;
     452    }
     453  }
     454
    442455  return irc;
    443456}
     
    482495//
    483496////////////////////////////////////////////////////////////////////////////
    484 void t_pppFilter::predictCovCrdPart(bool setNeuNoiseToZero) {
     497void t_pppFilter::predictCovCrdPart(const SymmetricMatrix &QFltOld, bool setNeuNoiseToZero) {
    485498
    486499  const vector<t_pppParam*>& params = _parlist->params();
     
    513526    double dt = _epoTime - _firstEpoTime;
    514527    if (dt < OPT->_seedingTime || setNeuNoiseToZero) {
    515       _QFlt.SymSubMatrix(1, 3) = _QFltOld.SymSubMatrix(1, 3);
     528      _QFlt.SymSubMatrix(1, 3) = QFltOld.SymSubMatrix(1, 3);
    516529    }
    517530    else {
    518       _QFlt.SymSubMatrix(1, 3) = _QFltOld.SymSubMatrix(1, 3) + Qxyz;
     531      _QFlt.SymSubMatrix(1, 3) = QFltOld.SymSubMatrix(1, 3) + Qxyz;
    519532    }
    520533  }
     
    523536//
    524537////////////////////////////////////////////////////////////////////////////
    525 void t_pppFilter::setStateVectorAndVarCovMatrix(bool setNeuNoiseToZero) {
     538void t_pppFilter::setStateVectorAndVarCovMatrix(const ColumnVector &xFltOld,
     539                                                const SymmetricMatrix &QFltOld,
     540                                                bool setNeuNoiseToZero) {
    526541
    527542  const vector<t_pppParam*>& params = _parlist->params();
     
    534549  for (unsigned ii = 0; ii < nPar; ii++) {
    535550    t_pppParam *par1 = params[ii];
    536     if (_QFltOld.size() == 0) {
     551    if (QFltOld.size() == 0) {
    537552      par1->resetIndex();
    538553    }
     
    542557      _QFlt[ii][ii] = par1->sigma0() * par1->sigma0(); // new parameter
    543558    } else {
    544       _QFlt[ii][ii] = _QFltOld[iOld][iOld] + par1->noise() * par1->noise();
    545       _xFlt[ii]     = _xFltOld[iOld];
     559      _QFlt[ii][ii] = QFltOld[iOld][iOld] + par1->noise() * par1->noise();
     560      _xFlt[ii]     = xFltOld[iOld];
    546561      for (unsigned jj = 0; jj < ii; jj++) {
    547562        t_pppParam *par2 = params[jj];
    548563        int jOld = par2->indexOld();
    549564        if (jOld >= 0) {
    550           _QFlt[ii][jj] = _QFltOld(iOld + 1, jOld + 1);
    551         }
    552       }
    553     }
    554   }
    555   predictCovCrdPart(setNeuNoiseToZero);
    556 }
    557 
     565          _QFlt[ii][jj] = QFltOld(iOld + 1, jOld + 1);
     566        }
     567      }
     568    }
     569  }
     570  predictCovCrdPart(QFltOld, setNeuNoiseToZero);
     571}
     572
Note: See TracChangeset for help on using the changeset viewer.