Ignore:
Timestamp:
Oct 22, 2026, 11:10:34 AM (10 hours ago)
Author:
stuerze
Message:

clock combination: some updates regarding attitude correction

File:
1 edited

Legend:

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

    r11107 r11110  
    16981698        continue;
    16991699      }
    1700       QString glonassYawLog = _antex->takeGlonassYawLog();
    1701       if (!glonassYawLog.isEmpty()) {
    1702         emit newMessage(("bncComb: " + glonassYawLog.trimmed()).toLatin1(), false);
    1703       }
    1704       QString gpsYawLog = _antex->takeGpsYawLog();
    1705       if (!gpsYawLog.isEmpty()) {
    1706         emit newMessage(("bncComb: " + gpsYawLog.trimmed()).toLatin1(), false);
    1707       }
    1708       QString onYawLog = _antex->takeOnYawLog();
    1709       if (!onYawLog.isEmpty()) {
    1710         emit newMessage(("bncComb: " + onYawLog.trimmed()).toLatin1(), false);
     1700      // transitions of the output attitude only, not of the AC attitudes
     1701      // used for the clock consistency (state keys "<AC>:att")
     1702      QStringList yawLogs = (_antex->takeGlonassYawLog() + _antex->takeGpsYawLog() +
     1703                             _antex->takeOnYawLog()).split('\n', Qt::SkipEmptyParts);
     1704      for (const QString& line : yawLogs) {
     1705        if (!line.contains(":att:")) {
     1706          emit newMessage(("bncComb: " + line.trimmed()).toLatin1(), false);
     1707        }
    17111708      }
    17121709    }
    … …  
    18851882    double dC_att = 0.0;
    18861883    if (corr->_attYawValid && masterCorr[prn]->_attYawValid) {
    1887       double dPsi = remainder(corr->_attYaw - masterCorr[prn]->_attYaw, 2.0 * M_PI);
     1884      // unwrapped over time: a turn in opposite directions accumulates a
     1885      // full cycle of wind-up, which stays in the clock (reset after 30 min);
     1886      // sign confirmed with the clocks of an AC turning opposite to the master;
     1887      // a yaw rotation +dpsi (right-handed about the antenna boresight) shifts
     1888      // the carrier phase by -dpsi/2pi cycles; an AC modelling its yaw larger by
     1889      // dpsi gets its clock (IGS sense) smaller by lambda_IF * dpsi / 2pi:
     1890      // dClk_AC - dClk_master = lambda_IF * (psi_master - psi_AC) / 2pi.
     1891      // Chen et al. (2022, EPS 74:142, Eq. 4) give the opposite
     1892      // sign, but did not apply the correction (no attitude products).
     1893      double  dPsi = remainder(masterCorr[prn]->_attYaw - corr->_attYaw, 2.0 * M_PI);
     1894      QString key  = corr->_acName + ' ' + masterCorr[prn]->_acName + ' ' + prn;
     1895      if (_dPsiLast.contains(key) && corr->_time - _dPsiLast[key].second <= 1800.0) {
     1896        double last = _dPsiLast[key].first;
     1897        dPsi = last + remainder(dPsi - last, 2.0 * M_PI);
     1898      }
     1899      _dPsiLast[key] = QPair<double, bncTime>(dPsi, corr->_time);
    18881900      dC_att = corr->_lambdaIF * dPsi / (2.0 * M_PI);
    1889       if (fabs(dC_att) > 1.e-6) fprintf(stderr, "DCATT %s %s %s %s %.4f %.2f\n", corr->_time.timestr().c_str(), corr->_acName.toLatin1().data(), masterCorr[prn]->_acName.toLatin1().data(), prn.toLatin1().data(), dC_att, dPsi*180/M_PI);
     1901      if (getenv("DCATT") && prn.startsWith(getenv("DCATT"))) fprintf(stderr, "DCATT %s %s %s %s %.4f %.2f %.2f %.2f\n", corr->_time.timestr().c_str(), corr->_acName.toLatin1().data(), masterCorr[prn]->_acName.toLatin1().data(), prn.toLatin1().data(), dC_att, dPsi*180/M_PI, corr->_attYaw*180/M_PI, masterCorr[prn]->_attYaw*180/M_PI); // TEMPORARY
    18901902    }
    18911903    double dC_apriori_corr = dC_orb + dC_att;
Note: See TracChangeset for help on using the changeset viewer.