Changeset 2080 in ntrip for trunk/BNC


Ignore:
Timestamp:
Dec 5, 2009, 3:01:36 PM (15 years ago)
Author:
mervart
Message:

* empty log message *

Location:
trunk/BNC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/bncmodel.cpp

    r2079 r2080  
    5656const double   sig_crd_p =  100.0;
    5757const double   sig_clk_0 = 1000.0;
     58const double   sig_amb_0 =  100.0;
    5859
    5960// Constructor
    6061////////////////////////////////////////////////////////////////////////////
    61 bncParam::bncParam(bncParam::parType typeIn, int indexIn) {
    62   type  = typeIn;
    63   index = indexIn;
    64   x0    = 0.0;
    65   xx    = 0.0;
     62bncParam::bncParam(bncParam::parType typeIn, int indexIn,
     63                   const QString& prnIn) {
     64  type      = typeIn;
     65  index     = indexIn;
     66  prn       = prnIn;
     67  index_old = 0;
     68  x0        = 0.0;
     69  xx        = 0.0;
    6670}
    6771
     
    7377// Partial
    7478////////////////////////////////////////////////////////////////////////////
    75 double bncParam::partialP3(t_satData* satData) {
     79double bncParam::partial(t_satData* satData, const QString& prnIn) {
    7680  if      (type == CRD_X) {
    7781    return (x0 - satData->xx(1)) / satData->rho;
     
    8690    return 1.0;
    8791  }
     92  else if (type == AMB_L3) {
     93    if (prnIn == prn) {
     94      return 1.0;
     95    }
     96    else {
     97      return 0.0;
     98    }
     99  }
    88100  return 0.0;
    89101}
     
    93105bncModel::bncModel() {
    94106  _xcBanc.ReSize(4); _xcBanc = 0.0;
    95   _params.push_back(new bncParam(bncParam::CRD_X,  1));
    96   _params.push_back(new bncParam(bncParam::CRD_Y,  2));
    97   _params.push_back(new bncParam(bncParam::CRD_Z,  3));
    98   _params.push_back(new bncParam(bncParam::RECCLK, 4));
     107  _params.push_back(new bncParam(bncParam::CRD_X,  1, ""));
     108  _params.push_back(new bncParam(bncParam::CRD_Y,  2, ""));
     109  _params.push_back(new bncParam(bncParam::CRD_Z,  3, ""));
     110  _params.push_back(new bncParam(bncParam::RECCLK, 4, ""));
    99111  _ellBanc.ReSize(3);
    100112
     
    184196// Computed Value
    185197////////////////////////////////////////////////////////////////////////////
    186 double bncModel::cmpValueP3(t_satData* satData) {
     198double bncModel::cmpValue(t_satData* satData) {
    187199
    188200  ColumnVector xRec(3);
     
    240252// Prediction Step of the Filter
    241253////////////////////////////////////////////////////////////////////////////
    242 void bncModel::predict() {
     254void bncModel::predict(t_epoData* epoData) {
     255
     256  // Make a copy of QQ and xx, set parameter indices
     257  // -----------------------------------------------
     258  SymmetricMatrix QQ_old = _QQ;
     259  ColumnVector    xx_old = _xx;
     260
     261  for (int iPar = 1; iPar <= _params.size(); iPar++) {
     262    _params[iPar-1]->index_old = _params[iPar-1]->index;
     263    _params[iPar-1]->index     = 0;
     264  }
     265
     266  // Remove Ambiguity Parameters without observations
     267  // ------------------------------------------------
     268  int iPar = 0;
     269  QMutableVectorIterator<bncParam*> it(_params);
     270  while (it.hasNext()) {
     271    bncParam* par = it.next();
     272    bool removed = false;
     273    if (par->type == bncParam::AMB_L3) {
     274      if (epoData->satData.find(par->prn) == epoData->satData.end()) {
     275        removed = true;
     276        delete par;
     277        it.remove();
     278      }
     279    }
     280    if (! removed) {
     281      ++iPar;
     282      par->index = iPar;
     283    }
     284  }
     285
     286  // Add new ambiguity parameters
     287  // ----------------------------
     288  QMapIterator<QString, t_satData*> itObs(epoData->satData);
     289  while (itObs.hasNext()) {
     290    itObs.next();
     291    QString    prn     = itObs.key();
     292    bool found = false;
     293    for (int iPar = 1; iPar <= _params.size(); iPar++) {
     294      if (_params[iPar-1]->type == bncParam::AMB_L3 &&
     295          _params[iPar-1]->prn == prn) {
     296        found = true;
     297        break;
     298      }
     299    }
     300    if (!found) {
     301      bncParam* par = new bncParam(bncParam::AMB_L3, _params.size()+1, prn);
     302      _params.push_back(par);
     303    }
     304  }
     305
     306  int nPar = _params.size();
     307  _xx.ReSize(nPar); _xx = 0.0;
     308  _QQ.ReSize(nPar); _QQ = 0.0;
     309  for (int i1 = 1; i1 <= nPar; i1++) {
     310    bncParam* p1 = _params[i1-1];
     311    if (p1->index_old != 0) {
     312      _xx(p1->index)            = xx_old(p1->index_old);
     313      _QQ(p1->index, p1->index) = QQ_old(p1->index_old, p1->index_old);
     314      for (int i2 = 1; i2 <= nPar; i2++) {
     315        bncParam* p2 = _params[i2-1];
     316        if (p2->index_old != 0) {
     317          _QQ(p1->index, p2->index) = QQ_old(p1->index_old, p2->index_old);
     318        }
     319      }
     320    }
     321  }
     322
     323  for (int ii = 1; ii <= nPar; ii++) {
     324    bncParam* par = _params[ii-1];
     325    if (par->index_old == 0) {
     326      _QQ(par->index, par->index) = sig_amb_0 * sig_amb_0;
     327    }
     328    par->index_old = par->index;
     329  }
    243330
    244331  // Coordinates
     
    274361  _QQ(4,4) = sig_clk_0 * sig_clk_0;
    275362
     363  // Ambiguities
     364  // -----------
     365  for (int iPar = 1; iPar <= _params.size(); iPar++) {
     366    if (_params[iPar-1]->type == bncParam::AMB_L3) {
     367      _params[iPar-1]->x0 += _params[iPar-1]->xx;
     368    }
     369  }
     370
    276371  // Nullify the Solution Vector
    277372  // ---------------------------
     
    290385  }
    291386
    292   predict();
     387  predict(epoData);
    293388
    294389  unsigned nPar = _params.size();
    295   unsigned nObs = epoData->size();
     390  unsigned nObs = 2 * epoData->size();
    296391
    297392  // Create First-Design Matrix
     
    307402    QString    prn     = itObs.key();
    308403    t_satData* satData = itObs.value();
    309     ll(iObs) = satData->P3 - cmpValueP3(satData);
    310 
     404
     405    double rhoCmp = cmpValue(satData);
     406
     407    ll(iObs) = satData->P3 - rhoCmp;
    311408    for (int iPar = 1; iPar <= _params.size(); iPar++) {
    312       AA(iObs, iPar) = _params[iPar-1]->partialP3(satData);
     409      AA(iObs, iPar) = _params[iPar-1]->partial(satData, "");
     410    }
     411
     412    ++iObs;
     413    ll(iObs) = satData->L3 - rhoCmp;
     414    for (int iPar = 1; iPar <= _params.size(); iPar++) {
     415      if (_params[iPar-1]->type == bncParam::AMB_L3 &&
     416          _params[iPar-1]->prn  == prn) {
     417        ll(iObs) -= _params[iPar-1]->x0;
     418      }
     419      AA(iObs, iPar) = _params[iPar-1]->partial(satData, prn);
    313420    }
    314421  }
  • trunk/BNC/bncmodel.h

    r2076 r2080  
    3737 public:
    3838  enum parType {CRD_X, CRD_Y, CRD_Z, RECCLK, TROPO, AMB_L3};
    39   bncParam(parType typeIn, int indexIn);
     39  bncParam(parType typeIn, int indexIn, const QString& prn);
    4040  ~bncParam();
    41   double partialP3(t_satData* satData);
     41  double partial(t_satData* satData, const QString& prnIn);
    4242  bool isCrd() const {
    4343    return (type == CRD_X || type == CRD_Y || type == CRD_Z);
     
    4949  double   x0;
    5050  int      index;
     51  int      index_old;
     52  QString  prn;
    5153};
    5254
     
    6365 
    6466 private:
    65   double cmpValueP3(t_satData* satData);
     67  double cmpValue(t_satData* satData);
    6668  double delay_saast(double Ele);
    67   void   predict();
     69  void   predict(t_epoData* epoData);
    6870
    6971  QVector<bncParam*> _params;
Note: See TracChangeset for help on using the changeset viewer.