Changeset 10665 in ntrip


Ignore:
Timestamp:
Jun 4, 2025, 11:58:08 AM (2 weeks ago)
Author:
stuerze
Message:

radial correction added in combination approach

Location:
trunk/BNC/src/combination
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/combination/bnccomb.cpp

    r10619 r10665  
    976976  // Check Satellite Positions for Outliers
    977977  // --------------------------------------
    978   if (checkOrbits(epoTime, sys, out) != success) {
     978  if (checkOrbits(epoTime, sys, out, resCorr) != success) {
    979979    return failure;
    980980  }
     
    12291229    ++iObs;
    12301230
    1231     if (corr->_acName == _masterOrbitAC[sys] && resCorr.find(prn) == resCorr.end()) {
    1232       resCorr[prn] = new cmbCorr(*corr);
    1233     }
    1234 
    12351231    for (int iPar = 1; iPar <= _params[sys].size(); iPar++) {
    12361232      cmbParam* pp = _params[sys][iPar-1];
    12371233      AA(iObs, iPar) = pp->partial(sys, corr->_acName, prn);
    12381234    }
    1239 
    1240     ll(iObs) = (corr->_clkCorr._dClk * t_CST::c - corr->_satCodeBiasIF) - DotProduct(AA.Row(iObs), x0);
     1235    // Consistency correction to keep the combined clock consistent to MeanOrb
     1236    // -----------------------------------------------------------------------
     1237    double dC_radial = (corr->_diffRao.t() * resCorr[prn]->_orbCorr._xr).AsScalar()
     1238                     / (resCorr[prn]->_orbCorr._xr).norm_Frobenius();
     1239
     1240    ll(iObs) = (corr->_clkCorr._dClk * t_CST::c - corr->_satCodeBiasIF + dC_radial) - DotProduct(AA.Row(iObs), x0);
    12411241
    12421242    PP(iObs, iObs) *= 1.0 / (corr->_weightFactor * corr->_weightFactor);
     
    12881288  // Check Satellite Positions for Outliers
    12891289  // --------------------------------------
    1290   if (checkOrbits(epoTime, sys, out) != success) {
     1290  if (checkOrbits(epoTime, sys, out, resCorr) != success) {
    12911291    return failure;
    12921292  }
     
    12951295  // ----------------------
    12961296  while (_running) {
    1297 
    1298     // Remove Satellites that are not in Master
    1299     // ----------------------------------------
    1300     QMutableVectorIterator<cmbCorr*> it(corrs(sys));
    1301     while (it.hasNext()) {
    1302       cmbCorr* corr    = it.next();
    1303       QString  prnStr  = corr->_prn;
    1304       bool foundMaster = false;
    1305       QVectorIterator<cmbCorr*> itHlp(corrs(sys));
    1306       while (itHlp.hasNext()) {
    1307         cmbCorr* corrHlp = itHlp.next();
    1308         QString  prnHlp  = corrHlp->_prn;
    1309         QString  ACHlp   = corrHlp->_acName;
    1310         if (ACHlp == _masterOrbitAC[sys] && prnStr == prnHlp) {
    1311           foundMaster = true;
    1312           break;
    1313         }
    1314       }
    1315       if (!foundMaster) {
    1316         delete corr;
    1317         it.remove();
    1318       }
    1319     }
    1320 
    13211297    // Count Number of Observations per Satellite and per AC
    13221298    // -----------------------------------------------------
     
    14361412// Check Satellite Positions for Outliers
    14371413////////////////////////////////////////////////////////////////////////////
    1438 t_irc bncComb::checkOrbits(bncTime epoTime, char sys, QTextStream& out) {
     1414t_irc bncComb::checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr) {
    14391415
    14401416  // Switch to last ephemeris (if possible)
     
    15101486      }
    15111487      corr->_diffRao = corr->_orbCorr._xr - meanRao[prn].Rows(1,3);
     1488
    15121489      if (maxDiff.find(prn) == maxDiff.end()) {
    15131490        maxDiff[prn] = corr;
     
    15231500
    15241501    if (_ACs.size() == 1) {
     1502      QVectorIterator<cmbCorr*> it(corrs(sys));
     1503      while (it.hasNext()) {
     1504        cmbCorr* corr = it.next();
     1505        QString  prn  = corr->_prn;
     1506        if (corr->_acName == _masterOrbitAC[sys] &&
     1507            resCorr.find(prn) == resCorr.end()) {
     1508          resCorr[prn] = new cmbCorr(*corr);
     1509        }
     1510      }
     1511      // Remove satellites that are not in masterOrbit
     1512      // and compute differences wrt. masterOrbit
     1513      // ----------------------------------------------
     1514      QMutableVectorIterator<cmbCorr*> im(corrs(sys));
     1515      while (im.hasNext()) {
     1516        cmbCorr* corr = im.next();
     1517        QString  prn  = corr->_prn;
     1518        if (resCorr.find(prn) == resCorr.end()) {
     1519          delete corr;
     1520          im.remove();
     1521        }
     1522        else {
     1523          corr->_diffRao = resCorr[prn]->_orbCorr._xr - corr->_orbCorr._xr;
     1524        }
     1525      }
    15251526      break;
    15261527    }
     
    15391540      else if (corr == maxDiff[prn]) {
    15401541        double norm = corr->_diffRao.NormFrobenius();
    1541         if (norm > (_MAX_DISPLACEMENT)) {
     1542        double facSys = 1.0;
     1543        if (sys == 'C' && prn.mid(1,2).toInt() <= 16) { // BDS-2
     1544          facSys *= 5.0;
     1545        }
     1546        if (norm > (_MAX_DISPLACEMENT * facSys)) {
    15421547          out << epoTime.datestr().c_str()    << " "
    15431548              << epoTime.timestr().c_str()    << " "
     
    15531558      }
    15541559    }
    1555 
     1560    // Set master orbit
     1561    // -----------------------------------------
    15561562    if (!removed) {
     1563      QVectorIterator<cmbCorr*> it(corrs(sys));
     1564      while (it.hasNext()) {
     1565        cmbCorr* corr = it.next();
     1566        QString  prn  = corr->_prn;
     1567        if (corr->_acName == _masterOrbitAC[sys] &&
     1568            resCorr.find(prn) == resCorr.end()) {
     1569          resCorr[prn] = new cmbCorr(*corr);
     1570        }
     1571      }
     1572      // Remove satellites that are not in masterOrbit
     1573      // and compute differences wrt. masterOrbit
     1574      // ----------------------------------------------
     1575      QMutableVectorIterator<cmbCorr*> im(corrs(sys));
     1576      while (im.hasNext()) {
     1577        cmbCorr* corr = im.next();
     1578        QString  prn  = corr->_prn;
     1579        if (resCorr.find(prn) == resCorr.end()) {
     1580          delete corr;
     1581          im.remove();
     1582        }
     1583        else {
     1584          corr->_diffRao = resCorr[prn]->_orbCorr._xr - corr->_orbCorr._xr;
     1585        }
     1586      }
    15571587      break;
    15581588    }
  • trunk/BNC/src/combination/bnccomb.h

    r10619 r10665  
    244244  void  printResults(bncTime epoTime, QTextStream& out, const QMap<QString, cmbCorr*>& resCorr);
    245245  void  switchToLastEph(t_eph* lastEph, cmbCorr* corr);
    246   t_irc checkOrbits(bncTime epoTime, char sys, QTextStream& out);
     246  t_irc checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr);
    247247  bool excludeSat(const t_prn& prn, const QStringList excludeSats) const;
    248248  QVector<cmbCorr*>& corrs(char sys) {return _buffer[sys].corrs;}
Note: See TracChangeset for help on using the changeset viewer.