00001 #pragma ident "$Id: BasicModel.cpp 2939 2011-10-23 19:55:11Z yanweignss $"
00002
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "BasicModel.hpp"
00034
00035
00036 namespace gpstk
00037 {
00038
00039
00040
00041 int BasicModel::classIndex = 4000000;
00042
00043
00044
00045 int BasicModel::getIndex() const
00046 { return index; }
00047
00048
00049
00050 std::string BasicModel::getClassName() const
00051 { return "BasicModel"; }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 BasicModel::BasicModel( const double& aRx,
00073 const double& bRx,
00074 const double& cRx,
00075 Position::CoordinateSystem s,
00076 GeoidModel *geoid )
00077 {
00078
00079 minElev = 10.0;
00080 pDefaultEphemeris = NULL;
00081 defaultObservable = TypeID::C1;
00082 useTGD = false;
00083 setInitialRxPosition(aRx, bRx, cRx, s, geoid);
00084 setIndex();
00085
00086 }
00087
00088
00089
00090
00091 BasicModel::BasicModel(const Position& RxCoordinates)
00092 {
00093
00094 minElev = 10.0;
00095 pDefaultEphemeris = NULL;
00096 defaultObservable = TypeID::C1;
00097 useTGD = false;
00098 setInitialRxPosition(RxCoordinates);
00099 setIndex();
00100
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 BasicModel::BasicModel( const Position& RxCoordinates,
00117 XvtStore<SatID>& dEphemeris,
00118 const TypeID& dObservable,
00119 const bool& applyTGD )
00120 {
00121
00122 minElev = 10.0;
00123 setInitialRxPosition(RxCoordinates);
00124 setDefaultEphemeris(dEphemeris);
00125 defaultObservable = dObservable;
00126 useTGD = applyTGD;
00127 setIndex();
00128
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 satTypeValueMap& BasicModel::Process( const DayTime& time,
00140 satTypeValueMap& gData )
00141 throw(ProcessingException)
00142 {
00143
00144 try
00145 {
00146
00147 SatIDSet satRejectedSet;
00148
00149
00150 satTypeValueMap::iterator stv;
00151 for( stv = gData.begin();
00152 stv != gData.end();
00153 ++stv )
00154 {
00155
00156 double observable( (*stv).second(defaultObservable) );
00157
00158
00159 CorrectedEphemerisRange cerange;
00160
00161 try
00162 {
00163
00164 cerange.ComputeAtTransmitTime( time,
00165 observable,
00166 rxPos,
00167 (*stv).first,
00168 *(getDefaultEphemeris()) );
00169 }
00170 catch(InvalidRequest& e)
00171 {
00172
00173
00174
00175 satRejectedSet.insert( (*stv).first );
00176
00177 continue;
00178
00179 }
00180
00181
00182 if ( rxPos.elevationGeodetic(cerange.svPosVel) < minElev )
00183 {
00184
00185
00186 satRejectedSet.insert( (*stv).first );
00187
00188 continue;
00189
00190 }
00191
00192
00193 double tempTGD(getTGDCorrections( time,
00194 (*pDefaultEphemeris),
00195 (*stv).first ) );
00196
00197
00198 (*stv).second[TypeID::dtSat] = cerange.svclkbias;
00199
00200
00201 (*stv).second[TypeID::dx] = cerange.cosines[0];
00202 (*stv).second[TypeID::dy] = cerange.cosines[1];
00203 (*stv).second[TypeID::dz] = cerange.cosines[2];
00204
00205 (*stv).second[TypeID::dSatX] = -cerange.cosines[0];
00206 (*stv).second[TypeID::dSatY] = -cerange.cosines[1];
00207 (*stv).second[TypeID::dSatZ] = -cerange.cosines[2];
00208
00209
00210 (*stv).second[TypeID::cdt] = 1.0;
00211
00212
00213 (*stv).second[TypeID::rho] = cerange.rawrange;
00214 (*stv).second[TypeID::rel] = -cerange.relativity;
00215 (*stv).second[TypeID::elevation] = cerange.elevationGeodetic;
00216 (*stv).second[TypeID::azimuth] = cerange.azimuthGeodetic;
00217
00218
00219 (*stv).second[TypeID::satX] = cerange.svPosVel.x[0];
00220 (*stv).second[TypeID::satY] = cerange.svPosVel.x[1];
00221 (*stv).second[TypeID::satZ] = cerange.svPosVel.x[2];
00222
00223
00224 (*stv).second[TypeID::satVX] = cerange.svPosVel.v[0];
00225 (*stv).second[TypeID::satVY] = cerange.svPosVel.v[1];
00226 (*stv).second[TypeID::satVZ] = cerange.svPosVel.v[2];
00227
00228
00229 (*stv).second[TypeID::recX] = rxPos.X();
00230 (*stv).second[TypeID::recY] = rxPos.Y();
00231 (*stv).second[TypeID::recZ] = rxPos.Z();
00232
00233
00234 (*stv).second[TypeID::recVX] = 0.0;
00235 (*stv).second[TypeID::recVY] = 0.0;
00236 (*stv).second[TypeID::recVZ] = 0.0;
00237
00238
00239 if(useTGD)
00240 {
00241
00242 if( (*stv).second.find(TypeID::C1) != (*stv).second.end() )
00243 {
00244 (*stv).second[TypeID::C1] =
00245 (*stv).second[TypeID::C1] - tempTGD;
00246 };
00247 };
00248
00249 (*stv).second[TypeID::instC1] = tempTGD;
00250
00251 }
00252
00253
00254 gData.removeSatID(satRejectedSet);
00255
00256 return gData;
00257
00258 }
00259 catch(Exception& u)
00260 {
00261
00262 ProcessingException e( getClassName() + ":"
00263 + StringUtils::asString( getIndex() ) + ":"
00264 + u.what() );
00265
00266 GPSTK_THROW(e);
00267
00268 }
00269
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279 int BasicModel::setInitialRxPosition( const double& aRx,
00280 const double& bRx,
00281 const double& cRx,
00282 Position::CoordinateSystem s,
00283 GeoidModel *geoid )
00284 {
00285
00286 try
00287 {
00288 Position rxpos(aRx, bRx, cRx, s, geoid);
00289 setInitialRxPosition(rxpos);
00290 return 0;
00291 }
00292 catch(GeometryException& e)
00293 {
00294 return -1;
00295 }
00296
00297 }
00298
00299
00300
00301
00302 int BasicModel::setInitialRxPosition(const Position& RxCoordinates)
00303 {
00304
00305 try
00306 {
00307 rxPos = RxCoordinates;
00308 return 0;
00309 }
00310 catch(GeometryException& e)
00311 {
00312 return -1;
00313 }
00314
00315 }
00316
00317
00318
00319
00320 int BasicModel::setInitialRxPosition()
00321 {
00322 try
00323 {
00324 Position rxpos(0.0, 0.0, 0.0, Position::Cartesian, NULL);
00325 setInitialRxPosition(rxpos);
00326 return 0;
00327 }
00328 catch(GeometryException& e)
00329 {
00330 return -1;
00331 }
00332
00333 }
00334
00335
00336
00337
00338 double BasicModel::getTGDCorrections( DayTime Tr,
00339 const XvtStore<SatID>& Eph,
00340 SatID sat )
00341 throw()
00342 {
00343
00344 try
00345 {
00346 const GPSEphemerisStore& bce =
00347 dynamic_cast<const GPSEphemerisStore&>(Eph);
00348
00349 bce.findEphemeris(sat,Tr);
00350
00351 return ( bce.findEphemeris(sat,Tr).getTgd() * C_GPS_M );
00352 }
00353 catch(...)
00354 {
00355 return 0.0;
00356 }
00357
00358 }
00359
00360
00361
00362 }