/* Method to set an a priori position of receiver using Bancroft's * method. Intended to be used with GNSS data structures. * * @param time DayTime object for this epoch * @param data satTypeValueMap data structure holding * the data. * * @return * 0 if OK * -1 if problems arose */ int ModeledPR::Prepare( const DayTime& time, const satTypeValueMap& data ) { int i; std::vector<SatID> vSat; std::vector<double> vPR; Vector<SatID> Satellite( data.getVectorOfSatID() ); Vector<double> Pseudorange( data.getVectorOfTypeID( getDefaultObservable() ) ); // Convert from gpstk::Vector to std::vector for (i = 0; i < (int)Satellite.size(); i++) { vSat.push_back(Satellite[i]); } for (i = 0; i < (int)Pseudorange.size(); i++) { vPR.push_back(Pseudorange[i]); } return Prepare(time, vSat, vPR, (*(getDefaultEphemeris())) ); } // End of method 'ModeledPR::Prepare()'
/* Returns a satTypeValueMap object, adding the new data generated when * calling a modeling object. * * @param time Epoch. * @param gData Data object holding the data. */ satTypeValueMap& BasicModel::Process( const DayTime& time, satTypeValueMap& gData ) throw(ProcessingException) { try { SatIDSet satRejectedSet; // Loop through all the satellites satTypeValueMap::iterator stv; for( stv = gData.begin(); stv != gData.end(); ++stv ) { // Scalar to hold temporal value double observable( (*stv).second(defaultObservable) ); // A lot of the work is done by a CorrectedEphemerisRange object CorrectedEphemerisRange cerange; try { // Compute most of the parameters cerange.ComputeAtTransmitTime( time, observable, rxPos, (*stv).first, *(getDefaultEphemeris()) ); } catch(InvalidRequest& e) { // If some problem appears, then schedule this satellite // for removal satRejectedSet.insert( (*stv).first ); continue; // Skip this SV if problems arise } // Let's test if satellite has enough elevation over horizon if ( rxPos.elevationGeodetic(cerange.svPosVel) < minElev ) { // Mark this satellite if it doesn't have enough elevation satRejectedSet.insert( (*stv).first ); continue; } // Computing Total Group Delay (TGD - meters), if possible double tempTGD(getTGDCorrections( time, (*pDefaultEphemeris), (*stv).first ) ); // Now we have to add the new values to the data structure (*stv).second[TypeID::dtSat] = cerange.svclkbias; // Now, lets insert the geometry matrix (*stv).second[TypeID::dx] = cerange.cosines[0]; (*stv).second[TypeID::dy] = cerange.cosines[1]; (*stv).second[TypeID::dz] = cerange.cosines[2]; // When using pseudorange method, this is 1.0 (*stv).second[TypeID::cdt] = 1.0; // Now we have to add the new values to the data structure (*stv).second[TypeID::rho] = cerange.rawrange; (*stv).second[TypeID::rel] = -cerange.relativity; (*stv).second[TypeID::elevation] = cerange.elevationGeodetic; (*stv).second[TypeID::azimuth] = cerange.azimuthGeodetic; // Let's insert satellite position at transmission time (*stv).second[TypeID::satX] = cerange.svPosVel.x[0]; (*stv).second[TypeID::satY] = cerange.svPosVel.x[1]; (*stv).second[TypeID::satZ] = cerange.svPosVel.x[2]; // Let's insert satellite velocity at transmission time (*stv).second[TypeID::satVX] = cerange.svPosVel.v[0]; (*stv).second[TypeID::satVY] = cerange.svPosVel.v[1]; (*stv).second[TypeID::satVZ] = cerange.svPosVel.v[2]; // Apply correction to C1 observable, if appropriate if(useTGD) { // Look for C1 if( (*stv).second.find(TypeID::C1) != (*stv).second.end() ) { (*stv).second[TypeID::C1] = (*stv).second[TypeID::C1] - tempTGD; }; }; (*stv).second[TypeID::instC1] = tempTGD; } // End of loop for(stv = gData.begin()... // Remove satellites with missing data gData.removeSatID(satRejectedSet); return gData; } // End of try... catch(Exception& u) { // Throw an exception if something unexpected happens ProcessingException e( getClassName() + ":" + StringUtils::asString( getIndex() ) + ":" + u.what() ); GPSTK_THROW(e); } } // End of method 'BasicModel::Process()'