Changeset 11085 in ntrip


Ignore:
Timestamp:
Oct 14, 2026, 11:47:57 AM (73 minutes ago)
Author:
stuerze
Message:

yaw angle information added to ssrQC

Location:
trunk/BNC
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/CHANGELOG.md

    r11084 r11085  
    22## 2.13.8 (2026-10-??)
    33- ADDED: epoch/velocity fields to PPP coordinates file to allow BNC to propagate the reference coordinates related to a dedicated reference epoch to the current processing epoch internally; coordinates can also be given as latitude/longitude/height
    4 - ADDED: **SSR QC** of decoded Broadcast Correction streams (options 'QC Directory', 'QC Streams', 'QC Reference', 'QC Interval'; example configuration '31_SsrQC.bnc'). One daily report file per stream with epochs, declared and actual update intervals, gaps, latency, completeness w.r.t. healthy broadcast ephemerides, IOD matching, code and phase bias signals, missing code biases of the reference signals, clock jumps and largest orbit corrections
     4- ADDED: **SSR QC** of decoded Broadcast Correction streams (options 'QC Directory', 'QC Streams', 'QC Reference', 'QC Interval'; example configuration '31_SsrQC.bnc'). One daily report file per stream with epochs, declared and actual update intervals, gaps, latency, completeness w.r.t. healthy broadcast ephemerides, IOD matching, code and phase bias signals, yaw angle availability, missing code biases of the reference signals, clock jumps and largest orbit corrections
    55- ADDED: Stream comparison in the SSR QC: orbits (radial, along, cross), clocks referred to the reference signals and signal-in-space differences (SIS = radial - clock) of each stream compared with the consensus of the other ACs (one vote per AC, own AC left out, combination products not voting) or with a selected stream (e.g. 'INTERNAL'), as RMS and standard deviation per satellite and system
    66- ADDED: SIS (radial - clock, satellite-specific clock offset included) per epoch and SISRMS/SISSig per satellite and system in the SP3 comparison
  • trunk/BNC/src/bnchelp.html

    r11083 r11085  
    51325132      (see section 'Combination'),</li>
    51335133    <li>the phase bias signals provided,</li>
     5134    <li>the availability of the satellite yaw angle with the phase biases: 'not provided', or the number of
     5135      satellites and the percentage of phase bias records with yaw angle, listing satellites without or only partly
     5136      with yaw angle. New RTCM-SSR signals the yaw angle with the Yaw Information Indicator; old RTCM-SSR and
     5137      IGS-SSR always carry the field, a provider without attitude information sends zeros, which is counted as not
     5138      provided. Without a yaw angle from the stream, a PPP or combination user depends on its own attitude model
     5139      (see section 'Combination'), which may differ from the provider's attitude during eclipse seasons and noon/midnight
     5140      turns,</li>
    51345141    <li>clock jumps, i.e. clock changes between consecutive epochs (same IOD) beyond the clock rate of more than
    51355142      0.5 m,</li>
  • trunk/BNC/src/ssrQc.cpp

    r11081 r11085  
    182182           << "Checks: epochs and update intervals, gaps (interval > 2 x max(declared, median)), latency,"
    183183           << " completeness w.r.t. healthy broadcast ephemerides," << endl
    184            << "IOD matching, code and phase bias signals, code biases of the reference signals, clock jumps > "
     184           << "IOD matching, code and phase bias signals, yaw angle, code biases of the reference signals, clock jumps > "
    185185           << MAX_CLK_JUMP << " m, largest orbit corrections" << endl;
    186186    }
    … …  
    416416      _phaseSignals[staSys].insert(QString::fromStdString(frqBias._rnxType2ch));
    417417    }
     418    // Yaw angle: new RTCM-SSR has an indicator, old RTCM-SSR and IGS-SSR always
     419    // carry the field, providers without attitude information send zeros
     420    t_satStat& stat = _satStat[QString::fromStdString(bias._staID) + ' ' +
     421                               QString::fromStdString(bias._prn.toString())];
     422    stat.numPB++;
     423    bool yawProvided = (bias._ssrFormat == ssrRtcmNew) ? (bias._satYawInfoInd != 0)
     424                                                       : (bias._yaw != 0.0 || bias._yawRate != 0.0);
     425    if (yawProvided) {
     426      stat.numYaw++;
     427    }
    418428  }
    419429}
    … …  
    707717    if (final) {
    708718      endTime = _staLast.value(staID, _lastTime);
     719      if (endTime < _intervalStart) { // stream without data in the last interval
     720        endTime = _lastTime;
     721      }
    709722    }
    710723    out << endl << "=== SSR QC " << staID.toStdString() << ' '
    … …  
    746759    for (char sys : systems) {
    747760      QMap<QString, unsigned> missOrb, missClk, missCB, missPB, iodUnknown, unhealthy, noEph,
    748                               jumps, missRef;
     761                              jumps, missRef, noYaw, yawPartly;
     762      unsigned numPB = 0, numYaw = 0, yawSats = 0;
    749763      double maxRadial = 0.0, maxAlongCross = 0.0;
    750764      QString maxRadialPrn, maxAlongCrossPrn;
    … …  
    792806        if (stat.refBiasOK) {
    793807          biasIF.push_back(stat.biasIF);
     808        }
     809        if (stat.numPB) {
     810          numPB  += stat.numPB;
     811          numYaw += stat.numYaw;
     812          if (stat.numYaw) {
     813            yawSats++;
     814            if (stat.numYaw < stat.numPB) {
     815              yawPartly[prn] = stat.numPB - stat.numYaw;
     816            }
     817          }
     818          else {
     819            noYaw[prn] = 0;
     820          }
    794821        }
    795822      }
    … …  
    843870        lines << "phase bias signals: " + sigs.join(" ");
    844871      }
     872      if (numPB) {
     873        if (numYaw == 0) {
     874          lines << "yaw angle: not provided";
     875        }
     876        else {
     877          lines << QString("yaw angle: provided for %1 of %2 satellites (%3 % of the phase bias records)")
     878                   .arg(yawSats).arg(yawSats + noYaw.size()).arg(100.0 * numYaw / numPB, 0, 'f', 1);
     879          addSats("phase biases without yaw angle", noYaw);
     880          addSats("phase biases partly without yaw angle (records)", yawPartly);
     881        }
     882      }
    845883      addSats(QString("clock jumps > %1 m").arg(MAX_CLK_JUMP), jumps);
    846884      if (!maxRadialPrn.isEmpty()) {
  • trunk/BNC/src/ssrQc.h

    r11081 r11085  
    6666    bool          refBiasOK = false;
    6767    double        biasIF = 0.0;  // ionosphere-free combination of the reference biases [m]
     68    unsigned      numPB  = 0;    // phase bias records
     69    unsigned      numYaw = 0;    // phase bias records with yaw angle
    6870  };
    6971
Note: See TracChangeset for help on using the changeset viewer.