Changeset 10694 in ntrip for trunk/BNC/src/combination
- Timestamp:
- Jul 15, 2025, 4:38:52 PM (3 weeks ago)
- Location:
- trunk/BNC/src/combination
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/combination/bnccomb.cpp
r10669 r10694 219 219 connect(BNC_CORE, SIGNAL(newClkCorrections(QList<t_clkCorr>)), this, SLOT(slotNewClkCorrections(QList<t_clkCorr>))); 220 220 connect(BNC_CORE, SIGNAL(newCodeBiases(QList<t_satCodeBias>)), this, SLOT(slotNewCodeBiases(QList<t_satCodeBias>))); 221 connect(BNC_CORE, SIGNAL(newPhaseBiases(QList<t_satPhaseBias>)), this, SLOT(slotNewPhaseBiases(QList<t_satPhaseBias>))); 221 222 222 223 // Combination Method … … 479 480 storage[satCodeBias._prn] = satCodeBias; 480 481 } 481 482 } 482 return; 483 } 484 485 // Remember Satellite Phase Biases 486 //////////////////////////////////////////////////////////////////////////// 487 void bncComb::slotNewPhaseBiases(QList<t_satPhaseBias> satPhaseBiases) { 488 QMutexLocker locker(&_mutex); 489 490 for (int ii = 0; ii < satPhaseBiases.size(); ii++) { 491 t_satPhaseBias& satPhaseBias = satPhaseBiases[ii]; 492 QString staID(satPhaseBias._staID.c_str()); 493 char sys = satPhaseBias._prn.system(); 494 495 if (!_cmbSysPrn.contains(sys)){ 496 continue; 497 } 498 499 // Find/Check the AC Name 500 // ---------------------- 501 QString acName; 502 QStringList excludeSats; 503 QListIterator<cmbAC*> icAC(_ACs); 504 while (icAC.hasNext()) { 505 cmbAC* AC = icAC.next(); 506 if (AC->mountPoint == staID) { 507 acName = AC->name; 508 excludeSats = AC->excludeSats; 509 break; 510 } 511 } 512 if (acName.isEmpty() || excludeSat(satPhaseBias._prn, excludeSats)) { 513 continue; 514 } 515 516 // Store the correction 517 // -------------------- 518 QMap<t_prn, t_satPhaseBias>& storage = _satPhaseBiases[acName]; 519 storage[satPhaseBias._prn] = satPhaseBias; 520 } 521 return; 522 } 523 483 524 484 525 // Process clock corrections … … 783 824 } 784 825 } 785 if (codeBiasesRefSig.size() == 2) { 786 map<t_frequency::type, double> codeCoeff; 787 double channel = double(_newCorr->_eph->slotNum()); 788 cmbRefSig::coeff(sys, cmbRefSig::cIF, channel, codeCoeff); 789 map<t_frequency::type, double>::const_iterator it; 790 for (it = codeCoeff.begin(); it != codeCoeff.end(); it++) { 791 t_frequency::type frqType = it->first; 792 _newCorr->_satCodeBiasIF += it->second * codeBiasesRefSig[frqType]; 793 } 826 map<t_frequency::type, double> codeCoeff; 827 double channel = double(_newCorr->_eph->slotNum()); 828 cmbRefSig::coeff(sys, cmbRefSig::cIF, channel, codeCoeff); 829 map<t_frequency::type, double>::const_iterator it; 830 for (it = codeCoeff.begin(); it != codeCoeff.end(); it++) { 831 t_frequency::type frqType = it->first; 832 double codeCoeff = it->second; 833 _newCorr->_satCodeBiasIF += codeCoeff * codeBiasesRefSig[frqType]; 794 834 } 795 835 _newCorr->_satCodeBias._bias.clear(); 836 } 837 } 838 839 // Check satellite phase biases 840 // ---------------------------- 841 if (_satPhaseBiases.contains(acName)) { 842 QMap<t_prn, t_satPhaseBias>& storage = _satPhaseBiases[acName]; 843 if (storage.contains(clkCorr._prn)) { 844 // Yaw angle 845 t_satPhaseBias& pb = storage[clkCorr._prn]; 846 double dt = _newCorr->_time - pb._time; 847 if (pb._updateInt) { 848 dt -= (0.5 * ssrUpdateInt[pb._updateInt]); 849 } 850 _newCorr->_satYawAngle = pb._yaw + pb._yawRate * dt; 851 852 // _lambdaIF 853 map<t_frequency::type, double> codeCoeff; 854 double channel = double(_newCorr->_eph->slotNum()); 855 cmbRefSig::coeff(sys, cmbRefSig::cIF, channel, codeCoeff); 856 map<t_frequency::type, double>::const_iterator it; 857 for (it = codeCoeff.begin(); it != codeCoeff.end(); it++) { 858 t_frequency::type frqType = it->first; 859 double codeCoeff = it->second; 860 _newCorr->_lambdaIF += codeCoeff * t_CST::c / t_CST::freq(frqType, channel); 861 } 796 862 } 797 863 } … … 901 967 } 902 968 903 QMap<QString, cmbCorr*> resCorr;969 QMap<QString, cmbCorr*> masterCorr; 904 970 905 971 // Perform the actual Combination using selected Method … … 908 974 ColumnVector dx; 909 975 if (_method == filter) { 910 irc = processEpoch_filter(epoTime, sys, out, resCorr, dx);976 irc = processEpoch_filter(epoTime, sys, out, masterCorr, dx); 911 977 } 912 978 else { 913 irc = processEpoch_singleEpoch(epoTime, sys, out, resCorr, dx);979 irc = processEpoch_singleEpoch(epoTime, sys, out, masterCorr, dx); 914 980 } 915 981 … … 921 987 pp->xx += dx(iPar); 922 988 if (pp->type == cmbParam::clkSat) { 923 if ( resCorr.find(pp->prn) !=resCorr.end()) {989 if (masterCorr.find(pp->prn) != masterCorr.end()) { 924 990 // set clock result 925 resCorr[pp->prn]->_dClkResult = pp->xx / t_CST::c;991 masterCorr[pp->prn]->_dClkResult = pp->xx / t_CST::c; 926 992 // Add Code Biases from SINEX File 927 993 if (_bsx) { 928 994 map<t_frequency::type, double> codeCoeff; 929 double channel = double( resCorr[pp->prn]->_eph->slotNum());995 double channel = double(masterCorr[pp->prn]->_eph->slotNum()); 930 996 cmbRefSig::coeff(sys, cmbRefSig::cIF, channel, codeCoeff); 931 997 t_frequency::type fType1 = cmbRefSig::toFreq(sys, cmbRefSig::c1); 932 998 t_frequency::type fType2 = cmbRefSig::toFreq(sys, cmbRefSig::c2); 933 _bsx->determineSsrSatCodeBiases(pp->prn.mid(0,3), codeCoeff[fType1], codeCoeff[fType2], resCorr[pp->prn]->_satCodeBias);999 _bsx->determineSsrSatCodeBiases(pp->prn.mid(0,3), codeCoeff[fType1], codeCoeff[fType2], masterCorr[pp->prn]->_satCodeBias); 934 1000 } 935 1001 } … … 945 1011 out.flush(); 946 1012 } 947 printResults(epoTime, out, resCorr);948 dumpResults(epoTime, resCorr);1013 printResults(epoTime, out, masterCorr); 1014 dumpResults(epoTime, masterCorr); 949 1015 } 950 1016 } … … 953 1019 //////////////////////////////////////////////////////////////////////////// 954 1020 t_irc bncComb::processEpoch_filter(bncTime epoTime, char sys, QTextStream& out, 955 QMap<QString, cmbCorr*>& resCorr,1021 QMap<QString, cmbCorr*>& masterCorr, 956 1022 ColumnVector& dx) { 957 1023 … … 976 1042 // Check Satellite Positions for Outliers 977 1043 // -------------------------------------- 978 if (checkOrbits(epoTime, sys, out, resCorr) != success) {1044 if (checkOrbits(epoTime, sys, out, masterCorr) != success) { 979 1045 return failure; 980 1046 } … … 989 1055 DiagonalMatrix PP; 990 1056 991 if (createAmat(sys, AA, ll, PP, x0 , resCorr) != success) {1057 if (createAmat(sys, AA, ll, PP, x0) != success) { 992 1058 return failure; 993 1059 } … … 1045 1111 //////////////////////////////////////////////////////////////////////////// 1046 1112 void bncComb::printResults(bncTime epoTime, QTextStream& out, 1047 const QMap<QString, cmbCorr*>& resCorr) {1048 1049 QMapIterator<QString, cmbCorr*> it( resCorr);1113 const QMap<QString, cmbCorr*>& masterCorr) { 1114 1115 QMapIterator<QString, cmbCorr*> it(masterCorr); 1050 1116 while (it.hasNext()) { 1051 1117 it.next(); … … 1075 1141 // Send results to RTNet Decoder and directly to PPP Client 1076 1142 //////////////////////////////////////////////////////////////////////////// 1077 void bncComb::dumpResults(bncTime epoTime, QMap<QString, cmbCorr*>& resCorr) {1143 void bncComb::dumpResults(bncTime epoTime, QMap<QString, cmbCorr*>& masterCorr) { 1078 1144 1079 1145 QList<t_orbCorr> orbCorrections; 1080 1146 QList<t_clkCorr> clkCorrections; 1081 1147 QList<t_satCodeBias> satCodeBiasList; 1148 QList<t_satPhaseBias> satPhaseBiasList; 1082 1149 1083 1150 unsigned year, month, day, hour, minute; … … 1089 1156 year, month, day, hour, minute, sec); 1090 1157 1091 QMutableMapIterator<QString, cmbCorr*> it( resCorr);1158 QMutableMapIterator<QString, cmbCorr*> it(masterCorr); 1092 1159 while (it.hasNext()) { 1093 1160 it.next(); … … 1154 1221 " Clk 1 %15.4f" 1155 1222 " Vel 3 %15.4f %15.4f %15.4f" 1156 " CoM 3 %15.4f %15.4f %15.4f", 1223 " CoM 3 %15.4f %15.4f %15.4f" 1224 " YawAngle %1.4f", 1157 1225 apc(1), apc(2), apc(3), 1158 1226 xc(4) * t_CST::c, 1159 1227 vv(1), vv(2), vv(3), 1160 com(1), com(2), com(3)); 1228 com(1), com(2), com(3), 1229 corr->_satYawAngle); 1161 1230 outLines += hlp; 1162 1231 hlp.clear(); … … 1179 1248 } 1180 1249 } 1250 1181 1251 outLines += "\n"; 1182 1252 delete corr; … … 1203 1273 // Create First Design Matrix and Vector of Measurements 1204 1274 //////////////////////////////////////////////////////////////////////////// 1205 t_irc bncComb::createAmat(char sys, Matrix& AA, ColumnVector& ll, DiagonalMatrix& PP, 1206 const ColumnVector& x0, QMap<QString, cmbCorr*>& resCorr) { 1275 t_irc bncComb::createAmat(char sys, Matrix& AA, ColumnVector& ll, DiagonalMatrix& PP, const ColumnVector& x0) { 1207 1276 1208 1277 unsigned nPar = _params[sys].size(); … … 1233 1302 AA(iObs, iPar) = pp->partial(sys, corr->_acName, prn); 1234 1303 } 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); 1304 // Consistency corrections to keep the combined clock consistent to masterOrbit 1305 // ---------------------------------------------------------------------------- 1306 double dC_orb = dotproduct(corr->_orbCorr._xr, corr->_diffRao) / corr->_orbCorr._xr.NormFrobenius(); 1307 double dC_att = corr->_diffYaw / (2 * M_PI); 1308 dC_att *= corr->_lambdaIF; 1309 1310 ll(iObs) = (corr->_clkCorr._dClk * t_CST::c - corr->_satCodeBiasIF + dC_orb + dC_att) - DotProduct(AA.Row(iObs), x0); 1241 1311 1242 1312 PP(iObs, iObs) *= 1.0 / (corr->_weightFactor * corr->_weightFactor); … … 1283 1353 //////////////////////////////////////////////////////////////////////////// 1284 1354 t_irc bncComb::processEpoch_singleEpoch(bncTime epoTime, char sys, QTextStream& out, 1285 QMap<QString, cmbCorr*>& resCorr,1355 QMap<QString, cmbCorr*>& masterCorr, 1286 1356 ColumnVector& dx) { 1287 1357 1288 1358 // Check Satellite Positions for Outliers 1289 1359 // -------------------------------------- 1290 if (checkOrbits(epoTime, sys, out, resCorr) != success) {1360 if (checkOrbits(epoTime, sys, out, masterCorr) != success) { 1291 1361 return failure; 1292 1362 } … … 1358 1428 ColumnVector ll; 1359 1429 DiagonalMatrix PP; 1360 if (createAmat(sys, AA, ll, PP, x0 , resCorr) != success) {1430 if (createAmat(sys, AA, ll, PP, x0) != success) { 1361 1431 return failure; 1362 1432 } … … 1412 1482 // Check Satellite Positions for Outliers 1413 1483 //////////////////////////////////////////////////////////////////////////// 1414 t_irc bncComb::checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr) {1484 t_irc bncComb::checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& masterCorr) { 1415 1485 1416 1486 // Switch to last ephemeris (if possible) … … 1505 1575 QString prn = corr->_prn; 1506 1576 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; 1577 masterCorr.find(prn) == masterCorr.end()) { 1578 masterCorr[prn] = new cmbCorr(*corr); 1579 masterCorr[prn]->_diffRao = 0.0; 1580 masterCorr[prn]->_diffYaw = 0.0; 1524 1581 } 1525 1582 } … … 1566 1623 QString prn = corr->_prn; 1567 1624 if (corr->_acName == _masterOrbitAC[sys] && 1568 resCorr.find(prn) ==resCorr.end()) {1569 resCorr[prn] = new cmbCorr(*corr);1625 masterCorr.find(prn) == masterCorr.end()) { 1626 masterCorr[prn] = new cmbCorr(*corr); 1570 1627 } 1571 1628 } … … 1577 1634 cmbCorr* corr = im.next(); 1578 1635 QString prn = corr->_prn; 1579 if ( resCorr.find(prn) ==resCorr.end()) {1636 if (masterCorr.find(prn) == masterCorr.end()) { 1580 1637 delete corr; 1581 1638 im.remove(); 1582 1639 } 1583 1640 else { 1584 corr->_diffRao = resCorr[prn]->_orbCorr._xr - corr->_orbCorr._xr; 1641 corr->_diffRao = corr->_orbCorr._xr - masterCorr[prn]->_orbCorr._xr; 1642 corr->_diffYaw = corr->_satYawAngle - masterCorr[prn]->_satYawAngle; 1585 1643 } 1586 1644 } -
trunk/BNC/src/combination/bnccomb.h
r10665 r10694 12 12 #include <map> 13 13 #include <newmat.h> 14 #include <newmatio.h> 14 15 #include <deque> 15 16 #include "bncephuser.h" … … 46 47 void slotNewClkCorrections(QList<t_clkCorr> clkCorrections); 47 48 void slotNewCodeBiases(QList<t_satCodeBias> satCodeBiases); 49 void slotNewPhaseBiases(QList<t_satPhaseBias> satPhaseBiases); 48 50 49 51 private slots: … … 55 57 void newClkCorrections(QList<t_clkCorr>); 56 58 void newCodeBiases(QList<t_satCodeBias>); 59 void newPhaseBiases(QList<t_satPhaseBias>); 57 60 58 61 private: … … 111 114 _dClkResult = 0.0; 112 115 _satCodeBiasIF = 0.0; 116 _lambdaIF = 0.0; 117 _satYawAngle = 0.0; 113 118 _weightFactor = 1.0; 119 _diffRao.ReSize(3); _diffRao = 0.0; 120 _diffYaw = 0.0; 114 121 } 115 122 ~cmbCorr() { … … 122 129 t_clkCorr _clkCorr; 123 130 t_satCodeBias _satCodeBias; 131 //t_satPhaseBias _satPhaseBias; 124 132 QString _acName; 125 133 double _satCodeBiasIF; 134 double _lambdaIF; 135 double _satYawAngle; 126 136 double _dClkResult; 127 137 ColumnVector _diffRao; 138 double _diffYaw; 128 139 double _weightFactor; 129 140 QString ID() {return _acName + "_" + _prn;} … … 237 248 void processEpoch(bncTime epoTime, const std::vector<t_clkCorr>& clkCorrVec); 238 249 void processSystem(bncTime epoTime, char sys, QTextStream& out); 239 t_irc processEpoch_filter(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr, ColumnVector& dx); 240 t_irc processEpoch_singleEpoch(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr, ColumnVector& dx); 241 t_irc createAmat(char sys, Matrix& AA, ColumnVector& ll, DiagonalMatrix& PP, 242 const ColumnVector& x0, QMap<QString, cmbCorr*>& resCorr); 243 void dumpResults(bncTime epoTime, QMap<QString, cmbCorr*>& resCorr); 244 void printResults(bncTime epoTime, QTextStream& out, const QMap<QString, cmbCorr*>& resCorr); 250 t_irc processEpoch_filter(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& masterCorr, ColumnVector& dx); 251 t_irc processEpoch_singleEpoch(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& masterCorr, ColumnVector& dx); 252 t_irc createAmat(char sys, Matrix& AA, ColumnVector& ll, DiagonalMatrix& PP, const ColumnVector& x0); 253 void dumpResults(bncTime epoTime, QMap<QString, cmbCorr*>& masterCorr); 254 void printResults(bncTime epoTime, QTextStream& out, const QMap<QString, cmbCorr*>& masterCorr); 245 255 void switchToLastEph(t_eph* lastEph, cmbCorr* corr); 246 t_irc checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& resCorr);256 t_irc checkOrbits(bncTime epoTime, char sys, QTextStream& out, QMap<QString, cmbCorr*>& masterCorr); 247 257 bool excludeSat(const t_prn& prn, const QStringList excludeSats) const; 248 258 QVector<cmbCorr*>& corrs(char sys) {return _buffer[sys].corrs;} … … 271 281 QMap<char, QVector<cmbParam*>> _params; 272 282 QMap<QString, QMap<t_prn, t_orbCorr> > _orbCorrections; 273 QMap<QString, QMap<t_prn, t_satCodeBias> > _satCodeBiases; 283 QMap<QString, QMap<t_prn, t_satCodeBias>> _satCodeBiases; 284 QMap<QString, QMap<t_prn, t_satPhaseBias>> _satPhaseBiases; 274 285 QMap<char, unsigned> _cmbSysPrn; 275 286 bncEphUser _ephUser;
Note:
See TracChangeset
for help on using the changeset viewer.