Changeset 10694 in ntrip
- Timestamp:
- Jul 15, 2025, 4:38:52 PM (6 weeks ago)
- Location:
- trunk/BNC/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/RTCM3Decoder.cpp
r10692 r10694 2085 2085 _gloBiasInfo.set(gloBiasInfo); 2086 2086 } 2087 2088 2087 return true; 2089 2088 } -
trunk/BNC/src/bnchelp.html
r10693 r10694 4604 4604 satellite Antenna Phase Centers (APC). It is so far only the satellite clock corrections, which are combined by BNC 4605 4605 while orbit corrections in the combination product are just taken over from one of the incoming 4606 Broadcast Correction streams. Combining only clock corrections using a fixed orbit reference imposes the potential 4607 to introduce some analysis inconsistencies. We will therefore consider improvements on this approach. 4608 </p> 4606 Broadcast Correction streams. Combining only clock corrections using a fixed orbit reference (which means the individual orbit of 4607 an incoming AC = Master orbit) imposes the potential to introduce analysis inconsistencies. Hence, some a priori corrections dC 4608 are applied before clock combination, to compensate for the inconsistency between MasterAC and other orbits. 4609 This should include corrections for inconsistent frames, attitude mode and phase center offset: 4610 </p> 4611 <pre> 4612 dC = dC_frame + dC_att + dC_pco [m] 4613 </pre> 4614 But because at present, no PCO information is available via SSR, we consider only 4615 <pre> 4616 dC_frame = Orb_AC * (Orb_AC - Orb_MasterAC) / Range_sat 4617 </pre> 4618 <pre> 4619 dC_att = (yawAngle_AC - yawAngle_MasterAC) / (2*PI) * wavelength(IF) 4620 </pre> 4621 4609 4622 <p> 4610 4623 The 'Combine Corrections' functionality may be of interrest because: -
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.