Changeset 3636 in ntrip


Ignore:
Timestamp:
Jan 23, 2012, 3:28:58 PM (12 years ago)
Author:
mervart
Message:
 
Location:
trunk/BNC
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/bncmodel.cpp

    r3540 r3636  
    4949#include "bancroft.h"
    5050#include "bncutils.h"
    51 #include "bncsettings.h"
    5251#include "bnctides.h"
    5352#include "bncantex.h"
     53#include "pppopt.h"
    5454
    5555using namespace std;
     
    138138// Constructor
    139139////////////////////////////////////////////////////////////////////////////
    140 bncModel::bncModel(QByteArray staID) {
    141 
    142   _staID   = staID;
     140bncModel::bncModel(QByteArray staID, const t_pppOpt* opt) {
     141
     142  _staID = staID;
     143  _opt   = opt;
    143144
    144145  connect(this, SIGNAL(newMessage(QByteArray,bool)),
    145146          ((bncApp*)qApp), SLOT(slotMessage(const QByteArray,bool)));
    146147
    147   bncSettings settings;
    148 
    149   // Observation Sigmas
    150   // ------------------
    151   _sigP3 = 5.0;
    152   if (!settings.value("pppSigmaCode").toString().isEmpty()) {
    153     _sigP3 = settings.value("pppSigmaCode").toDouble();
    154   }
    155   _sigL3 = 0.02;
    156   if (!settings.value("pppSigmaPhase").toString().isEmpty()) {
    157     _sigL3 = settings.value("pppSigmaPhase").toDouble();
    158   }
    159 
    160   // Parameter Sigmas
    161   // ----------------
    162   _sigCrd0 = 100.0;
    163   if (!settings.value("pppSigCrd0").toString().isEmpty()) {
    164     _sigCrd0 = settings.value("pppSigCrd0").toDouble();
    165   }
    166   _sigCrdP = 100.0;
    167   if (!settings.value("pppSigCrdP").toString().isEmpty()) {
    168     _sigCrdP = settings.value("pppSigCrdP").toDouble();
    169   }
    170   _sigTrp0 = 0.1;
    171   if (!settings.value("pppSigTrp0").toString().isEmpty()) {
    172     _sigTrp0 = settings.value("pppSigTrp0").toDouble();
    173   }
    174   _sigTrpP = 1e-6;
    175   if (!settings.value("pppSigTrpP").toString().isEmpty()) {
    176     _sigTrpP = settings.value("pppSigTrpP").toDouble();
    177   }
    178   _sigClk0           = 1000.0;
    179   _sigAmb0           = 1000.0;
    180   _sigGalileoOffset0 = 1000.0;
    181   _sigGalileoOffsetP =    0.0;
    182 
    183   // Quick-Start Mode
    184   // ----------------
    185   _quickStart = 0;
    186   if (settings.value("pppRefCrdX").toString() != "" &&
    187       settings.value("pppRefCrdY").toString() != "" &&
    188       settings.value("pppRefCrdZ").toString() != "" &&
    189       !settings.value("pppQuickStart").toString().isEmpty()) {
    190     _quickStart = settings.value("pppQuickStart").toDouble();
    191   }
    192 
    193   // Several options
    194   // ---------------
    195   _usePhase = false;
    196   if ( Qt::CheckState(settings.value("pppUsePhase").toInt()) == Qt::Checked) {
    197     _usePhase = true;
    198   }
    199 
    200   _estTropo = false;
    201   if ( Qt::CheckState(settings.value("pppEstTropo").toInt()) == Qt::Checked) {
    202     _estTropo = true;
    203   }
    204 
    205   _useGalileo = false;
    206   if ( Qt::CheckState(settings.value("pppGalileo").toInt()) == Qt::Checked) {
    207     _useGalileo = true;
    208   }
    209 
    210148  // NMEA Output
    211149  // -----------
    212   QString nmeaFileName = settings.value("nmeaFile").toString();
    213   if (nmeaFileName.isEmpty()) {
     150  if (_opt->nmeaFile.isEmpty()) {
    214151    _nmeaFile   = 0;
    215152    _nmeaStream = 0;
    216153  }
    217154  else {
    218     expandEnvVar(nmeaFileName);
    219     _nmeaFile = new QFile(nmeaFileName);
    220     if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked) {
     155    QString hlpName = _opt->nmeaFile; expandEnvVar(hlpName);
     156    _nmeaFile = new QFile(hlpName);
     157    if (_opt->rnxAppend) {
    221158      _nmeaFile->open(QIODevice::WriteOnly | QIODevice::Append);
    222159    }
     
    231168  // ------------------------
    232169  _antex = 0;
    233   QString antexFileName = settings.value("pppAntex").toString();
    234   if (!antexFileName.isEmpty()) {
     170  if (!_opt->antexFile.isEmpty()) {
    235171    _antex = new bncAntex();
    236     if (_antex->readFile(antexFileName) != success) {
     172    if (_antex->readFile(_opt->antexFile) != success) {
    237173      emit newMessage("wrong ANTEX file", true);
    238174      delete _antex;
    239175      _antex = 0;
    240176    }
    241     else {
    242       _antennaName = settings.value("pppAntenna").toString();
    243     }
    244   }
    245 
    246   // Antenna Eccentricities
    247   // ----------------------
    248   _dN = settings.value("pppRefdN").toDouble();
    249   _dE = settings.value("pppRefdE").toDouble();
    250   _dU = settings.value("pppRefdU").toDouble();
     177  }
    251178
    252179  // Bancroft Coordinates
     
    294221  _params.push_back(new bncParam(bncParam::CRD_Z,  ++nextPar, ""));
    295222  _params.push_back(new bncParam(bncParam::RECCLK, ++nextPar, ""));
    296   if (_estTropo) {
     223  if (_opt->estTropo) {
    297224    _params.push_back(new bncParam(bncParam::TROPO, ++nextPar, ""));
    298225  }
    299   if (_useGalileo) {
     226  if (_opt->useGalileo) {
    300227    _params.push_back(new bncParam(bncParam::GALILEO_OFFSET, ++nextPar, ""));
    301228  }
     
    307234    pp->xx = 0.0;
    308235    if      (pp->isCrd()) {
    309       _QQ(iPar,iPar) = _sigCrd0 * _sigCrd0;
     236      _QQ(iPar,iPar) = _opt->sigCrd0 * _opt->sigCrd0;
    310237    }
    311238    else if (pp->type == bncParam::RECCLK) {
    312       _QQ(iPar,iPar) = _sigClk0 * _sigClk0;
     239      _QQ(iPar,iPar) = _opt->sigClk0 * _opt->sigClk0;
    313240    }
    314241    else if (pp->type == bncParam::TROPO) {
    315       _QQ(iPar,iPar) = _sigTrp0 * _sigTrp0;
     242      _QQ(iPar,iPar) = _opt->sigTrp0 * _opt->sigTrp0;
    316243    }
    317244    else if (pp->type == bncParam::GALILEO_OFFSET) {
    318       _QQ(iPar,iPar) = _sigGalileoOffset0 * _sigGalileoOffset0;
     245      _QQ(iPar,iPar) = _opt->sigGalileoOffset0 * _opt->sigGalileoOffset0;
    319246    }
    320247  }
     
    409336  if (_antex) {
    410337    bool found;
    411     phaseCenter = _antex->pco(_antennaName, satData->eleSat, found);
     338    phaseCenter = _antex->pco(_opt->antennaName, satData->eleSat, found);
    412339    if (!found) {
    413340      emit newMessage("ANTEX: antenna >"
    414                       + _antennaName.toAscii() + "< not found", true);
     341                      + _opt->antennaName.toAscii() + "< not found", true);
    415342    }
    416343  }
    417344
    418345  double antennaOffset = 0.0;
    419   if (_dN != 0.0 || _dE != 0.0 || _dU != 0.0) {
     346  if (_opt->antEccSet()) {
    420347    double cosa = cos(satData->azSat);
    421348    double sina = sin(satData->azSat);
    422349    double cose = cos(satData->eleSat);
    423350    double sine = sin(satData->eleSat);
    424     antennaOffset = -_dN * cosa*cose - _dE * sina*cose - _dU * sine;
     351    antennaOffset = -_opt->antEccNEU[0] * cosa*cose
     352                    -_opt->antEccNEU[1] * sina*cose
     353                    -_opt->antEccNEU[2] * sine;
    425354  }
    426355
     
    478407  if (iPhase == 0) {
    479408
    480     bncSettings settings;
    481    
    482     _maxSolGap = settings.value("pppMaxSolGap").toDouble();
    483    
    484409    bool firstCrd = false;
    485     if (!_lastTimeOK.valid() || (_maxSolGap > 0 && _time - _lastTimeOK > _maxSolGap)) {
     410    if (!_lastTimeOK.valid() || (_opt->maxSolGap > 0 && _time - _lastTimeOK > _opt->maxSolGap)) {
    486411      firstCrd = true;
    487412      _startTime = epoData->tt;
     
    491416    // Use different white noise for Quick-Start mode
    492417    // ----------------------------------------------
    493     double sigCrdP_used   = _sigCrdP;
    494     if ( _quickStart > 0.0 && _quickStart > (epoData->tt - _startTime) ) {
     418    double sigCrdP_used = _opt->sigCrdP;
     419    if ( _opt->quickStart > 0.0 && _opt->quickStart > (epoData->tt - _startTime) ) {
    495420      sigCrdP_used   = 0.0;
    496421    }
     
    505430      if      (pp->type == bncParam::CRD_X) {
    506431        if (firstCrd) {
    507           if (settings.value("pppRefCrdX").toString() != "" &&
    508               settings.value("pppRefCrdY").toString() != "" &&
    509               settings.value("pppRefCrdZ").toString() != "") {
    510             pp->xx = settings.value("pppRefCrdX").toDouble();
     432          if (_opt->refCrdSet()) {
     433            pp->xx = _opt->refCrd[0];
    511434          }
    512435          else {
     
    518441      else if (pp->type == bncParam::CRD_Y) {
    519442        if (firstCrd) {
    520           if (settings.value("pppRefCrdX").toString() != "" &&
    521               settings.value("pppRefCrdY").toString() != "" &&
    522               settings.value("pppRefCrdZ").toString() != "") {
    523             pp->xx = settings.value("pppRefCrdY").toDouble();
     443          if (_opt->refCrdSet()) {
     444            pp->xx = _opt->refCrd[1];
    524445          }
    525446          else {
     
    531452      else if (pp->type == bncParam::CRD_Z) {
    532453        if (firstCrd) {
    533           if (settings.value("pppRefCrdX").toString() != "" &&
    534               settings.value("pppRefCrdY").toString() != "" &&
    535               settings.value("pppRefCrdZ").toString() != "") {
    536             pp->xx = settings.value("pppRefCrdZ").toDouble();
     454          if (_opt->refCrdSet()) {
     455            pp->xx = _opt->refCrd[2];
    537456          }
    538457          else {
     
    550469          _QQ(iPar, jj) = 0.0;
    551470        }
    552         _QQ(iPar,iPar) = _sigClk0 * _sigClk0;
     471        _QQ(iPar,iPar) = _opt->sigClk0 * _opt->sigClk0;
    553472      }
    554473   
     
    556475      // ------------------
    557476      else if (pp->type == bncParam::TROPO) {
    558         _QQ(iPar,iPar) += _sigTrpP * _sigTrpP;
     477        _QQ(iPar,iPar) += _opt->sigTrpP * _opt->sigTrpP;
    559478      }
    560479   
     
    562481      // --------------
    563482      else if (pp->type == bncParam::GALILEO_OFFSET) {
    564         _QQ(iPar,iPar) += _sigGalileoOffsetP * _sigGalileoOffsetP;
     483        _QQ(iPar,iPar) += _opt->sigGalileoOffsetP * _opt->sigGalileoOffsetP;
    565484      }
    566485    }
     
    569488  // Add New Ambiguities if necessary
    570489  // --------------------------------
    571   if (_usePhase) {
     490  if (_opt->usePhase) {
    572491
    573492    // Make a copy of QQ and xx, set parameter indices
     
    627546      bncParam* par = _params[ii-1];
    628547      if (par->index_old == 0) {
    629         _QQ(par->index, par->index) = _sigAmb0 * _sigAmb0;
     548        _QQ(par->index, par->index) = _opt->sigAmb0 * _opt->sigAmb0;
    630549      }
    631550      par->index_old = par->index;
     
    640559  Tracer tracer("bncModel::update");
    641560
    642   bncSettings settings;
    643 
    644561  _log.clear(); 
    645562
    646563  _time = epoData->tt; // current epoch time
    647564
    648   if (settings.value("pppSPP").toString() == "PPP") {
     565  if (_opt->pppMode) {
    649566    _log += "Precise Point Positioning of Epoch "
    650567          + QByteArray(_time.timestr(1).c_str()) +
     
    724641  // NEU Output
    725642  // ----------
    726   double xyzRef[3];
    727 
    728   if (settings.value("pppRefCrdX").toString() != "" &&
    729       settings.value("pppRefCrdY").toString() != "" &&
    730       settings.value("pppRefCrdZ").toString() != "") {
    731 
    732     xyzRef[0] = settings.value("pppRefCrdX").toDouble();
    733     xyzRef[1] = settings.value("pppRefCrdY").toDouble();
    734     xyzRef[2] = settings.value("pppRefCrdZ").toDouble();
    735 
    736     newPos->xnt[0] = x() - xyzRef[0];
    737     newPos->xnt[1] = y() - xyzRef[1];
    738     newPos->xnt[2] = z() - xyzRef[2];
     643  if (_opt->refCrdSet()) {
     644    newPos->xnt[0] = x() - _opt->refCrd[0];
     645    newPos->xnt[1] = y() - _opt->refCrd[1];
     646    newPos->xnt[2] = z() - _opt->refCrd[2];
    739647
    740648    double ellRef[3];
    741     xyz2ell(xyzRef, ellRef);
     649    xyz2ell(_opt->refCrd, ellRef);
    742650    xyz2neu(ellRef, newPos->xnt, &newPos->xnt[3]);
    743651
     
    751659  emit newMessage(QByteArray(strC.str().c_str()), true);
    752660
    753   if (settings.value("pppAverage").toString() == "") {
     661  if (_opt->pppAverage == 0.0) {
    754662    delete newPos;
    755663  }
     
    758666   _posAverage.push_back(newPos);
    759667
    760     // Time Span for Average Computation
    761     // ---------------------------------
    762     double tRangeAverage = settings.value("pppAverage").toDouble() * 60.;
    763     if (tRangeAverage < 0) {
    764       tRangeAverage = 0;
    765     }
    766     if (tRangeAverage > 86400) {
    767       tRangeAverage = 86400;
    768     }
    769 
    770668    // Compute the Mean
    771669    // ----------------
     
    775673    while (it.hasNext()) {
    776674      pppPos* pp = it.next();
    777       if ( (epoData->tt - pp->time) >= tRangeAverage ) {
     675      if ( (epoData->tt - pp->time) >= _opt->pppAverage ) {
    778676        delete pp;
    779677        it.remove();
     
    806704      }
    807705
    808       if (settings.value("pppRefCrdX").toString() != "" &&
    809           settings.value("pppRefCrdY").toString() != "" &&
    810           settings.value("pppRefCrdZ").toString() != "") {
    811        
     706      if (_opt->refCrdSet()) {
    812707        ostringstream strD; strD.setf(ios::fixed);
    813708        strD << _staID.data() << "  AVE-XYZ "
    814709             << epoData->tt.timestr(1) << " "
    815              << setw(13) << setprecision(3) << mean[0] + xyzRef[0] << " +- "
     710             << setw(13) << setprecision(3) << mean[0] + _opt->refCrd[0] << " +- "
    816711             << setw(6)  << setprecision(3) << std[0]   << " "
    817              << setw(14) << setprecision(3) << mean[1] + xyzRef[1] << " +- "
     712             << setw(14) << setprecision(3) << mean[1] + _opt->refCrd[1] << " +- "
    818713             << setw(6)  << setprecision(3) << std[1]   << " "
    819              << setw(14) << setprecision(3) << mean[2] + xyzRef[2] << " +- "
     714             << setw(14) << setprecision(3) << mean[2] + _opt->refCrd[2] << " +- "
    820715             << setw(6)  << setprecision(3) << std[2];
    821716        emit newMessage(QByteArray(strD.str().c_str()), true);
     
    832727        emit newMessage(QByteArray(strE.str().c_str()), true);
    833728
    834         if ( Qt::CheckState(settings.value("pppEstTropo").toInt()) == Qt::Checked) {
     729        if (_opt->estTropo) {
    835730          ostringstream strF; strF.setf(ios::fixed);
    836731          strF << _staID.data() << "  AVE-TRP "
     
    11411036  if (iPhase == 1) {
    11421037    ll(iObs)      = satData->L3 - cmpValue(satData, true);
    1143     double sigL3 = _sigL3;
     1038    double sigL3 = _opt->sigL3;
    11441039    if (satData->system() == 'R') {
    11451040      sigL3 *= GLONASS_WEIGHT_FACTOR;
     
    11591054  else {
    11601055    ll(iObs)      = satData->P3 - cmpValue(satData, false);
    1161     PP(iObs,iObs) = 1.0 / (_sigP3 * _sigP3) / (ellWgtCoef * ellWgtCoef);
     1056    PP(iObs,iObs) = 1.0 / (_opt->sigP3 * _opt->sigP3) / (ellWgtCoef * ellWgtCoef);
    11621057    for (int iPar = 1; iPar <= _params.size(); iPar++) {
    11631058      AA(iObs, iPar) = _params[iPar-1]->partial(satData, false);
     
    12521147    // First update using code observations, then phase observations
    12531148    // -------------------------------------------------------------     
    1254     for (int iPhase = 0; iPhase <= (_usePhase ? 1 : 0); iPhase++) {
     1149    for (int iPhase = 0; iPhase <= (_opt->usePhase ? 1 : 0); iPhase++) {
    12551150   
    12561151      // Status Prediction
     
    13151210        }
    13161211
    1317         if (!_usePhase || iPhase == 1) {
     1212        if (!_opt->usePhase || iPhase == 1) {
    13181213          if (_outlierGPS.size() > 0 || _outlierGlo.size() > 0) {
    13191214            _log += "Neglected PRNs: ";
  • trunk/BNC/bncmodel.h

    r3414 r3636  
    3636class t_satData;
    3737class bncAntex;
     38class t_pppOpt;
    3839
    3940class bncParam {
     
    5758 Q_OBJECT
    5859 public:
    59   bncModel(QByteArray staID);
     60  bncModel(QByteArray staID, const t_pppOpt* opt);
    6061  ~bncModel();
    6162  t_irc update(t_epoData* epoData);
     
    135136  };
    136137
     138  const t_pppOpt*       _opt;
    137139  bncTime               _time;
    138140  bncTime               _lastTimeOK;
     
    145147  ColumnVector          _xcBanc;
    146148  ColumnVector          _ellBanc;
    147   bool                  _usePhase;
    148   bool                  _estTropo;
    149   bool                  _useGalileo;
    150149  QByteArray            _log;
    151150  QFile*                _nmeaFile;
     
    154153  QMap<QString, double> _windUpSum;
    155154  QVector<pppPos*>      _posAverage;
    156   double                _quickStart;
    157   double                _maxSolGap;
    158   double                _sigCrd0;
    159   double                _sigCrdP;
    160   double                _sigTrp0;
    161   double                _sigTrpP;
    162   double                _sigGalileoOffset0;
    163   double                _sigGalileoOffsetP;
    164   double                _sigL3;
    165   double                _sigP3;
    166   double                _sigAmb0;
    167   double                _sigClk0;
    168   double                _dN;
    169   double                _dE;
    170   double                _dU;
    171   bncAntex*             _antex;
    172   QString               _antennaName;
    173155  QStringList           _outlierGPS;
    174156  QStringList           _outlierGlo;
     157  bncAntex*             _antex;
    175158};
    176159
  • trunk/BNC/bncpppclient.cpp

    r3635 r3636  
    6666
    6767  _staID = staID;
    68   _model = new bncModel(staID);
     68  _model = new bncModel(staID, _opt);
    6969
    7070  connect(this, SIGNAL(newMessage(QByteArray,bool)),
  • trunk/BNC/pppopt.cpp

    r3635 r3636  
    5050  bncSettings settings;
    5151
    52   sigmaCode    = settingsToDouble("pppSigmaCode",    5.0);
    53   sigmaPhase   = settingsToDouble("pppSigmaPhase",  0.02);
     52  sigP3        = settingsToDouble("pppSigmaCode",    5.0);
     53  sigL3        = settingsToDouble("pppSigmaPhase",  0.02);
    5454  sigCrd0      = settingsToDouble("pppSigCrd0",    100.0);
    5555  sigCrdP      = settingsToDouble("pppSigCrdP",    100.0);
     
    6565  quickStart   = settingsToDouble("pppQuickStart");
    6666  corrSync     = settingsToDouble("pppSync");       
     67  pppAverage   = settingsToDouble("pppAverage") * 60.0;
     68  if (pppAverage < 0.0) {
     69    pppAverage = 0.0;
     70  }
     71  else if (pppAverage > 86400.0) {
     72    pppAverage = 86400.0;
     73  }
    6774
    6875  pppCorrMount = settings.value("pppCorrMount").toString();
     
    8087  if (!refCrdSet()) quickStart = 0.0;
    8188  if (!pppMode)     corrSync   = 0.0;
     89
     90  sigGalileoOffset0 = 1000.0;
     91  sigGalileoOffsetP =    0.0;
     92  sigClk0           = 1000.0;
     93  sigAmb0           = 1000.0;
    8294}
    8395
  • trunk/BNC/pppopt.h

    r3633 r3636  
    3232  t_pppOpt();
    3333  ~t_pppOpt();
    34   bool refCrdSet() {
     34  bool refCrdSet() const {
    3535    return refCrd[0] != 0.0 || refCrd[1] != 0 || refCrd[2] != 0.0;
    3636  }
    37   double  sigmaCode;
    38   double  sigmaPhase;
     37  bool antEccSet() const {
     38    return antEccNEU[0] != 0.0 || antEccNEU[1] != 0.0 || antEccNEU[2] != 0.0;
     39  }
     40  double  sigL3;
     41  double  sigP3;
    3942  double  sigCrd0;
    4043  double  sigCrdP;
     
    4649  double  quickStart;
    4750  double  corrSync;
     51  double  pppAverage;
    4852  QString pppCorrMount;
    4953  QString nmeaFile;
     
    5660  bool    useGlonass;
    5761  bool    useGalileo;
     62  double  sigGalileoOffset0;
     63  double  sigGalileoOffsetP;
     64  double  sigAmb0;
     65  double  sigClk0;
    5866 private:
    5967  double settingsToDouble(const QByteArray& keyName, double defaultValue = 0.0) const;
Note: See TracChangeset for help on using the changeset viewer.