Changeset 2648 in ntrip for trunk/BNC/bncmodel.cpp


Ignore:
Timestamp:
Nov 7, 2010, 6:08:24 PM (13 years ago)
Author:
mervart
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/bncmodel.cpp

    r2599 r2648  
    6060const double   MAXRES_PHASE_GPS = 0.10;
    6161const double   MAXRES_PHASE_GLO = 0.05;
    62 const double   sig_crd_0        =  100.0;
    63 const double   sig_crd_p        =  100.0;
     62const double   QUICKSTART       =  120.0;
    6463const double   sig_clk_0        = 1000.0;
    6564const double   sig_trp_0        =    0.10;
     
    137136  _staID   = staID;
    138137
     138  _startTime = QDateTime::currentDateTime();
     139
     140  bncSettings settings;
     141
     142  double sig_crd_0 = 100.0;
     143
     144  if (settings.value("pppOrigin").toString() == "QuickStart - Static" ||
     145      settings.value("pppOrigin").toString() == "QuickStart - Mobile") {
     146    sig_crd_0 = 000.01;
     147  }
     148
    139149  connect(this, SIGNAL(newMessage(QByteArray,bool)),
    140150          ((bncApp*)qApp), SLOT(slotMessage(const QByteArray,bool)));
    141 
    142   bncSettings settings;
    143151
    144152  _static = false;
     
    166174  else {
    167175    _useGlonass = false;
    168   }
    169 
    170   _tRangeAverage = settings.value("pppAverage").toDouble() * 60.;
    171   if (_tRangeAverage < 0) {
    172     _tRangeAverage = 0;
    173   }
    174   if (_tRangeAverage > 86400) {
    175     _tRangeAverage = 86400;
    176176  }
    177177
     
    223223    _nmeaStream->setDevice(_nmeaFile);
    224224  }
    225 //Perlt Anfang
    226   _xyzAverage[0] = 0.0; _xyzAverage[1] = 0.0; _xyzAverage[2] = 0.0;
    227   _xyzAverage[3] = 0.0; _xyzAverage[4] = 0.0; _xyzAverage[5] = 0.0;
    228   _xyzAverageSqr[0] = 0.0; _xyzAverageSqr[1] = 0.0; _xyzAverageSqr[2] = 0.0;
    229   _xyzAverageSqr[3] = 0.0; _xyzAverageSqr[4] = 0.0; _xyzAverageSqr[5] = 0.0;
    230   for (int ii = 0; ii < _posAverage.size(); ++ii) { delete _posAverage[ii]; }
    231   _posAverage.clear();
    232 //Perlt Ende
    233 
    234225}
    235226
     
    239230  delete _nmeaStream;
    240231  delete _nmeaFile;
    241 //Perlt Anfang
    242   for (int ii = 0; ii < _posAverage.size(); ++ii) { delete _posAverage[ii]; }
    243 //Perlt Ende
     232  for (int ii = 0; ii < _posAverage.size(); ++ii) {
     233    delete _posAverage[ii];
     234  }
    244235}
    245236
     
    395386void bncModel::predict(t_epoData* epoData) {
    396387
    397   bool firstCrd = x() == 0.0 && y() == 0.0 && z() == 0.0;
     388  bncSettings settings;
     389
     390  bool firstCrd = false;
     391  if (x() == 0.0 && y() == 0.0 && z() == 0.0) {
     392    firstCrd = true;
     393  }
     394
     395  bool   quickStartInit = false;
     396  double sig_crd_p      = 100.0;
     397
     398  if ( (settings.value("pppOrigin").toString() == "QuickStart - Static" ||
     399        settings.value("pppOrigin").toString() == "QuickStart - Mobile") &&
     400       _startTime.secsTo(QDateTime::currentDateTime()) < QUICKSTART ) {
     401    quickStartInit = true;
     402    sig_crd_p       = 0.0;
     403  }
    398404
    399405  // Predict Parameter values, add white noise
     
    406412    if      (pp->type == bncParam::CRD_X) {
    407413      if (firstCrd || !_static) {
    408         pp->xx = _xcBanc(1);
     414        if (quickStartInit) {
     415          pp->xx = settings.value("pppRefCrdX").toDouble();
     416        }
     417        else {
     418          pp->xx = _xcBanc(1);
     419        }
    409420      }
    410421      _QQ(iPar,iPar) += sig_crd_p * sig_crd_p;
     
    412423    else if (pp->type == bncParam::CRD_Y) {
    413424      if (firstCrd || !_static) {
    414         pp->xx = _xcBanc(2);
     425        if (quickStartInit) {
     426          pp->xx = settings.value("pppRefCrdY").toDouble();
     427        }
     428        else {
     429          pp->xx = _xcBanc(2);
     430        }
    415431      }
    416432      _QQ(iPar,iPar) += sig_crd_p * sig_crd_p;
     
    418434    else if (pp->type == bncParam::CRD_Z) {
    419435      if (firstCrd || !_static) {
    420         pp->xx = _xcBanc(3);
     436        if (quickStartInit) {
     437          pp->xx = settings.value("pppRefCrdZ").toDouble();
     438        }
     439        else {
     440          pp->xx = _xcBanc(3);
     441        }
    421442      }
    422443      _QQ(iPar,iPar) += sig_crd_p * sig_crd_p;
     
    751772  // NEU Output
    752773  // ----------
    753   if (settings.value("pppOrigin").toString() == "X Y Z") {
     774  if (settings.value("pppOrigin").toString() == "Plot - X Y Z" ||
     775      settings.value("pppOrigin").toString() == "QuickStart - Static") {
    754776    double xyzRef[3];
    755777    double ellRef[3];
     
    769791         << setw(8) << setprecision(3) << _neu[2];
    770792  }
    771 //Perlt Anfang
    772 //  strC << endl;
    773 //Perlt Ende
    774793
    775794  emit newMessage(QByteArray(strC.str().c_str()), true);
    776795
    777 //Perlt Anfang
    778   ostringstream strD;
    779   strD.setf(ios::fixed);
    780   ostringstream strE;
    781   strE.setf(ios::fixed);
    782 
    783   if (settings.value("pppOrigin").toString() != "No plot"  && settings.value("pppAverage").toString() != "") {
    784     double xyzRef[3];
    785     if (settings.value("pppOrigin").toString() == "X Y Z") {
    786     xyzRef[0] = settings.value("pppRefCrdX").toDouble();
    787     xyzRef[1] = settings.value("pppRefCrdY").toDouble();
    788     xyzRef[2] = settings.value("pppRefCrdZ").toDouble();
    789     _xyzAverage[3]+=(x()-xyzRef[0]);
    790     _xyzAverage[4]+=(y()-xyzRef[1]);
    791     _xyzAverage[5]+=(z()-xyzRef[2]);
    792     _xyzAverageSqr[3]+=((x()-xyzRef[0])*(x()-xyzRef[0]));
    793     _xyzAverageSqr[4]+=((y()-xyzRef[1])*(y()-xyzRef[1]));
    794     _xyzAverageSqr[5]+=((z()-xyzRef[2])*(z()-xyzRef[2]));
    795     }
    796 
     796  if (settings.value("pppOrigin").toString() != "None"                  &&
     797      settings.value("pppOrigin").toString() != "QuickStart - Mobile"   &&
     798      settings.value("pppOrigin").toString() != "Plot - Start position" &&
     799      settings.value("pppAverage").toString() != "") {
     800
     801    // Remember new position
     802    // ---------------------
    797803    pppPos* newPos = new pppPos;
    798     newPos->time   = epoData->tt;
    799     newPos->xyz[0] = x();
    800     newPos->xyz[1] = y();
    801     newPos->xyz[2] = z();
     804    newPos->time      = epoData->tt;
     805    newPos->xyz[0]    = x();
     806    newPos->xyz[1]    = y();
     807    newPos->xyz[2]    = z();
     808    newPos->xyzRef[0] = settings.value("pppRefCrdX").toDouble();
     809    newPos->xyzRef[1] = settings.value("pppRefCrdY").toDouble();
     810    newPos->xyzRef[2] = settings.value("pppRefCrdZ").toDouble();
     811
    802812    _posAverage.push_back(newPos);
    803813
    804     _xyzAverage[0]+=x();
    805     _xyzAverage[1]+=y();
    806     _xyzAverage[2]+=z();
    807     _xyzAverageSqr[0]+=(x()*x());
    808     _xyzAverageSqr[1]+=(y()*y());
    809     _xyzAverageSqr[2]+=(z()*z());
     814    // Time Span for Average Computation
     815    // ---------------------------------
     816    double tRangeAverage = settings.value("pppAverage").toDouble() * 60.;
     817    if (tRangeAverage < 0) {
     818      tRangeAverage = 0;
     819    }
     820    if (tRangeAverage > 86400) {
     821      tRangeAverage = 86400;
     822    }
     823
     824    // Compute the Mean
     825    // ----------------
     826    double meanX = 0.0;
     827    double meanY = 0.0;
     828    double meanZ = 0.0;
    810829
    811830    QMutableVectorIterator<pppPos*> it(_posAverage);
    812831    while (it.hasNext()) {
    813832      pppPos* pp = it.next();
    814       if ( (epoData->tt - pp->time) >= _tRangeAverage ) {
    815         _xyzAverage[0]-=pp->xyz[0];
    816         _xyzAverage[1]-=pp->xyz[1];
    817         _xyzAverage[2]-=pp->xyz[2];
    818         _xyzAverageSqr[0]-=(pp->xyz[0]*pp->xyz[0]);
    819         _xyzAverageSqr[1]-=(pp->xyz[1]*pp->xyz[1]);
    820         _xyzAverageSqr[2]-=(pp->xyz[2]*pp->xyz[2]);
    821         _xyzAverage[3]-=(pp->xyz[0]-xyzRef[0]);
    822         _xyzAverage[4]-=(pp->xyz[1]-xyzRef[1]);
    823         _xyzAverage[5]-=(pp->xyz[2]-xyzRef[2]);
    824         _xyzAverageSqr[3]-=((pp->xyz[0]-xyzRef[0])*(pp->xyz[0]-xyzRef[0]));
    825         _xyzAverageSqr[4]-=((pp->xyz[1]-xyzRef[1])*(pp->xyz[1]-xyzRef[1]));
    826         _xyzAverageSqr[5]-=((pp->xyz[2]-xyzRef[2])*(pp->xyz[2]-xyzRef[2]));
     833      if ( (epoData->tt - pp->time) >= tRangeAverage ) {
    827834        delete pp;
    828835        it.remove();
    829836      }
    830     }
    831     _xyzAverageN=_posAverage.size();
    832     double AveX;
    833     double AveY;
    834     double AveZ;
    835     double dAveX;
    836     double dAveY;
    837     double dAveZ;
    838     if (_xyzAverageN>1) {
    839       AveX= _xyzAverage[0]/_xyzAverageN;
    840       AveY= _xyzAverage[1]/_xyzAverageN;
    841       AveZ= _xyzAverage[2]/_xyzAverageN;
    842       dAveX= sqrt((_xyzAverageSqr[0]-_xyzAverage[0]*_xyzAverage[0]/(_xyzAverageN))/(_xyzAverageN-1));
    843       dAveY= sqrt((_xyzAverageSqr[1]-_xyzAverage[1]*_xyzAverage[1]/(_xyzAverageN))/(_xyzAverageN-1));
    844       dAveZ= sqrt((_xyzAverageSqr[2]-_xyzAverage[2]*_xyzAverage[2]/(_xyzAverageN))/(_xyzAverageN-1));
    845       strD << _staID.data() << "  AVE-XYZ "
    846            << epoData->tt.timestr(1) << " "
    847            << setw(13) << setprecision(3) << AveX                  << " +- "
    848            << setw(6)  << setprecision(3) << dAveX       << " "
    849            << setw(14) << setprecision(3) << AveY                  << " +- "
    850            << setw(6)  << setprecision(3) << dAveY       << " "
    851            << setw(14) << setprecision(3) << AveZ                  << " +- "
    852            << setw(6)  << setprecision(3) << dAveZ;
    853       emit newMessage(QByteArray(strD.str().c_str()), true);
    854     }
    855     if (settings.value("pppOrigin").toString() == "X Y Z" && settings.value("pppAverage").toString() != "") {
    856       double _xyz[3];
    857       double ellRef[3];
    858       double _dxyz[3];
    859       double _neu[3];
    860       double _dneu[3];
    861       xyz2ell(xyzRef, ellRef);
    862       _xyz[0]= _xyzAverage[3]/_xyzAverageN;
    863       _xyz[1]= _xyzAverage[4]/_xyzAverageN;
    864       _xyz[2]= _xyzAverage[5]/_xyzAverageN;
    865       if (_xyzAverageN>1) {
    866         _dxyz[0]= sqrt((_xyzAverageSqr[3]-_xyzAverage[3]*_xyzAverage[3]/(_xyzAverageN))/(_xyzAverageN-1));
    867         _dxyz[1]= sqrt((_xyzAverageSqr[4]-_xyzAverage[4]*_xyzAverage[4]/(_xyzAverageN))/(_xyzAverageN-1));
    868         _dxyz[2]= sqrt((_xyzAverageSqr[5]-_xyzAverage[5]*_xyzAverage[5]/(_xyzAverageN))/(_xyzAverageN-1));
    869         xyz2neu(ellRef, _xyz, _neu);
    870         xyz2neu(ellRef, _dxyz, _dneu);
    871         _dneu[0]=sqrt(_dneu[0]*_dneu[0]);
    872         _dneu[1]=sqrt(_dneu[1]*_dneu[1]);
    873         _dneu[2]=sqrt(_dneu[2]*_dneu[2]);
    874         strE << _staID.data() << "  AVE-NEU " 
    875            << epoData->tt.timestr(1) << " "
    876            << setw(8)  << setprecision(3) << _neu[0]                << " +- "
    877            << setw(6)  << setprecision(3) << _dneu[0]               << " "
    878            << setw(8)  << setprecision(3) << _neu[1]                << " +- "
    879            << setw(6)  << setprecision(3) << _dneu[1]               << " "
    880            << setw(8)  << setprecision(3) << _neu[2]                << " +- "
    881            << setw(6)  << setprecision(3) << _dneu[2];
    882         emit newMessage(QByteArray(strE.str().c_str()), true);
    883       }
    884     }
    885   }
    886 //Perlt Ende
    887  
     837      else {
     838        meanX += pp->xyz[0] - pp->xyzRef[0];
     839        meanY += pp->xyz[1] - pp->xyzRef[1];
     840        meanZ += pp->xyz[2] - pp->xyzRef[2];
     841      }
     842    }
     843
     844    int nn = _posAverage.size();
     845
     846    meanX /= nn;
     847    meanY /= nn;
     848    meanZ /= nn;
     849
     850    // Compute the Deviation
     851    // ---------------------
     852    double stdX  = 0.0;
     853    double stdY  = 0.0;
     854    double stdZ  = 0.0;
     855    QVectorIterator<pppPos*> it2(_posAverage);
     856    while (it2.hasNext()) {
     857      pppPos* pp = it2.next();
     858      double dX = pp->xyz[0] - pp->xyzRef[0] - meanX;
     859      double dY = pp->xyz[1] - pp->xyzRef[1] - meanY;
     860      double dZ = pp->xyz[2] - pp->xyzRef[2] - meanZ;
     861      stdX += dX * dX;
     862      stdY += dY * dY;
     863      stdZ += dZ * dZ;
     864    }
     865   
     866    stdX = sqrt(stdX / nn);
     867    stdY = sqrt(stdY / nn);
     868    stdZ = sqrt(stdZ / nn);
     869     
     870    ostringstream strD; strD.setf(ios::fixed);
     871    strD << _staID.data() << "  AVE-XYZ "
     872         << epoData->tt.timestr(1) << " "
     873         << setw(13) << setprecision(3) << meanX  << " +- "
     874         << setw(6)  << setprecision(3) << stdX   << " "
     875         << setw(14) << setprecision(3) << meanY  << " +- "
     876         << setw(6)  << setprecision(3) << stdY   << " "
     877         << setw(14) << setprecision(3) << meanZ  << " +- "
     878         << setw(6)  << setprecision(3) << stdZ;
     879    emit newMessage(QByteArray(strD.str().c_str()), true);
     880  }
    888881
    889882  // NMEA Output
     
    10581051}
    10591052
    1060 
    10611053////
    10621054//////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.