Changeset 2648 in ntrip for trunk/BNC/bncmodel.cpp
- Timestamp:
- Nov 7, 2010, 6:08:24 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/bncmodel.cpp
r2599 r2648 60 60 const double MAXRES_PHASE_GPS = 0.10; 61 61 const double MAXRES_PHASE_GLO = 0.05; 62 const double sig_crd_0 = 100.0; 63 const double sig_crd_p = 100.0; 62 const double QUICKSTART = 120.0; 64 63 const double sig_clk_0 = 1000.0; 65 64 const double sig_trp_0 = 0.10; … … 137 136 _staID = staID; 138 137 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 139 149 connect(this, SIGNAL(newMessage(QByteArray,bool)), 140 150 ((bncApp*)qApp), SLOT(slotMessage(const QByteArray,bool))); 141 142 bncSettings settings;143 151 144 152 _static = false; … … 166 174 else { 167 175 _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;176 176 } 177 177 … … 223 223 _nmeaStream->setDevice(_nmeaFile); 224 224 } 225 //Perlt Anfang226 _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 Ende233 234 225 } 235 226 … … 239 230 delete _nmeaStream; 240 231 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 } 244 235 } 245 236 … … 395 386 void bncModel::predict(t_epoData* epoData) { 396 387 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 } 398 404 399 405 // Predict Parameter values, add white noise … … 406 412 if (pp->type == bncParam::CRD_X) { 407 413 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 } 409 420 } 410 421 _QQ(iPar,iPar) += sig_crd_p * sig_crd_p; … … 412 423 else if (pp->type == bncParam::CRD_Y) { 413 424 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 } 415 431 } 416 432 _QQ(iPar,iPar) += sig_crd_p * sig_crd_p; … … 418 434 else if (pp->type == bncParam::CRD_Z) { 419 435 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 } 421 442 } 422 443 _QQ(iPar,iPar) += sig_crd_p * sig_crd_p; … … 751 772 // NEU Output 752 773 // ---------- 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") { 754 776 double xyzRef[3]; 755 777 double ellRef[3]; … … 769 791 << setw(8) << setprecision(3) << _neu[2]; 770 792 } 771 //Perlt Anfang772 // strC << endl;773 //Perlt Ende774 793 775 794 emit newMessage(QByteArray(strC.str().c_str()), true); 776 795 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 // --------------------- 797 803 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 802 812 _posAverage.push_back(newPos); 803 813 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; 810 829 811 830 QMutableVectorIterator<pppPos*> it(_posAverage); 812 831 while (it.hasNext()) { 813 832 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 ) { 827 834 delete pp; 828 835 it.remove(); 829 836 } 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 } 888 881 889 882 // NMEA Output … … 1058 1051 } 1059 1052 1060 1061 1053 //// 1062 1054 //////////////////////////////////////////////////////////////////////////////
Note:
See TracChangeset
for help on using the changeset viewer.