ObsRngDev.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38 
44 #include <typeinfo>
45 
46 #include "EphemerisRange.hpp"
47 #include "EngEphemeris.hpp"
48 #include "MiscMath.hpp"
49 #include "GNSSconstants.hpp"
50 #include "TimeString.hpp"
51 #include "ObsRngDev.hpp"
52 
53 namespace gnsstk
54 {
55 
56  bool ObsRngDev::debug=false;
57 
59  const double prange,
60  const SatID& svid,
61  const CommonTime& time,
62  const Position& rxpos,
63  NavLibrary& navLib,
64  EllipsoidModel& em,
65  bool svTime,
66  NavSearchOrder order,
67  SVHealth xmitHealth,
69  : obstime(time), svid(svid), ord(0), wonky(false)
70  {
71  computeOrd(prange, rxpos, navLib, em, svTime, order, xmitHealth, valid);
72  Position gx(rxpos);
73  gx.asGeodetic(&em);
74  NBTropModel nb(gx.getAltitude(),
76  static_cast<YDSTime>(time).doy);
77  computeTrop(nb);
78  }
79 
81  const double prange,
82  const SatID& svid,
83  const CommonTime& time,
84  const Position& rxpos,
85  NavLibrary& navLib,
86  EllipsoidModel& em,
87  const IonoModelStore& ion,
88  CarrierBand band,
89  bool svTime,
90  NavSearchOrder order,
91  SVHealth xmitHealth,
93  : obstime(time), svid(svid), ord(0), wonky(false)
94  {
95  computeOrd(prange, rxpos, navLib, em, svTime, order, xmitHealth, valid);
96  Position gx(rxpos);
97  gx.asGeodetic(&em);
98  NBTropModel nb(gx.getAltitude(),
100  static_cast<YDSTime>(time).doy);
101  computeTrop(nb);
102  iono = ion.getCorrection(time, gx, elevation, azimuth, band);
103  ord -= iono;
104  }
105 
107  const double prange,
108  const SatID& svid,
109  const CommonTime& time,
110  const Position& rxpos,
111  NavLibrary& navLib,
112  EllipsoidModel& em,
113  const TropModel& tm,
114  bool svTime,
115  NavSearchOrder order,
116  SVHealth xmitHealth,
118  : obstime(time), svid(svid), ord(0), wonky(false)
119  {
120  computeOrd(prange, rxpos, navLib, em, svTime, order, xmitHealth, valid);
121  computeTrop(tm);
122  }
123 
125  const double prange,
126  const SatID& svid,
127  const CommonTime& time,
128  const Position& rxpos,
129  NavLibrary& navLib,
130  EllipsoidModel& em,
131  const TropModel& tm,
132  const IonoModelStore& ion,
133  CarrierBand band,
134  bool svTime,
135  NavSearchOrder order,
136  SVHealth xmitHealth,
138  : obstime(time), svid(svid), ord(0), wonky(false)
139  {
140  computeOrd(prange, rxpos, navLib, em, svTime, order, xmitHealth, valid);
141  computeTrop(tm);
142  Position gx(rxpos);
143  gx.asGeodetic(&em);
144  iono = ion.getCorrection(time, gx, elevation, azimuth, band);
145  ord -= iono;
146  }
147 
148 
150  const double prange1,
151  const double prange2,
152  const SatID& svid,
153  const CommonTime& time,
154  const Position& rxpos,
155  NavLibrary& navLib,
156  EllipsoidModel& em,
157  bool svTime,
158  double gamma,
159  NavSearchOrder order,
160  SVHealth xmitHealth,
162  : obstime(time), svid(svid), ord(0), wonky(false)
163  {
164  // for dual-frequency see IS-GPS-200, section 20.3.3.3.3.3
165  double icpr = (prange2 - gamma * prange1)/(1-gamma);
166  iono = prange1 - icpr;
167 
168  computeOrd(icpr, rxpos, navLib, em, svTime, order, xmitHealth, valid);
169  Position gx(rxpos);
170  gx.asGeodetic(&em);
171  NBTropModel nb(gx.getAltitude(),
172  gx.getGeodeticLatitude(),
173  static_cast<YDSTime>(time).doy);
174  computeTrop(nb);
175  }
176 
177 
179  const double prange1,
180  const double prange2,
181  const SatID& svid,
182  const CommonTime& time,
183  const Position& rxpos,
184  NavLibrary& navLib,
185  const EllipsoidModel& em,
186  const TropModel& tm,
187  bool svTime,
188  double gamma,
189  NavSearchOrder order,
190  SVHealth xmitHealth,
192  : obstime(time), svid(svid), ord(0), wonky(false)
193  {
194  // for dual-frequency see IS-GPS-200, section 20.3.3.3.3.3
195  double icpr = (prange2 - gamma * prange1)/(1-gamma);
196  iono = prange1 - icpr;
197 
198  computeOrd(icpr, rxpos, navLib, em, svTime, order, xmitHealth, valid);
199  computeTrop(tm);
200  }
201 
202  // This should be used for obs in GPS (i.e. receiver) time.
204  const double obs,
205  const Position& rxpos,
206  NavLibrary& navLib,
207  const EllipsoidModel& em,
208  NavSearchOrder order,
209  SVHealth xmitHealth,
211  {
213  rho = cer.ComputeAtTransmitTime(obstime,obs, rxpos, svid, navLib, order,
214  xmitHealth, valid);
215  azimuth = cer.azimuth;
216  elevation = cer.elevation;
217  ord = obs - rho;
218  iodc = cer.iodc;
219  health = cer.health;
220 
221  if (debug)
222  {
223  std::ios::fmtflags oldFlags = std::cout.flags();
224  std::cout << *this << std::endl
225  << std::setprecision(3) << std::fixed
226  << " obs=" << obs
227  << ", rho=" << (double)rho
228  << ", obs-rho=" << (double)ord
229  << std::endl
230  << " rx.x=" << rxpos
231  << std::setprecision(4) << std::scientific
232  << ", sv bias=" << cer.svclkbias
233  << ", sv drift=" << cer.svclkdrift
234  << std::endl;
235  std::cout.flags(oldFlags);
236  }
237  }
238 
239 
240 // This should be used for obs tagged in SV time
242  double obs,
243  const Position& rxpos,
244  NavLibrary& navLib,
245  const EllipsoidModel& em,
246  NavSearchOrder order,
247  SVHealth xmitHealth,
249  {
251  rho = cer.ComputeAtTransmitSvTime(obstime, obs, rxpos, svid, navLib,
252  order, xmitHealth, valid);
253  azimuth = cer.azimuth;
254  elevation = cer.elevation;
255  ord = obs - rho;
256  if (debug)
257  {
258  std::ios::fmtflags oldFlags = std::cout.flags();
259  std::cout << *this << std::endl
260  << std::setprecision(3) << std::fixed
261  << " obs=" << obs
262  << ", rho=" << (double)rho
263  << ", obs-rho=" << (double)ord
264  << std::endl
265  << std::setprecision(3)
266  << " sv.x=" << cer.svPosVel.x
267  << ", sv.v=" << cer.svPosVel.v
268  << std::endl
269  << " rx.x=" << rxpos
270  << std::setprecision(4) << std::scientific
271  << ", sv bias=" << cer.svPosVel.clkbias
272  << ", sv drift=" << cer.svPosVel.clkdrift
273  << std::endl;
274  std::cout.flags(oldFlags);
275  }
276  }
277 
279  {
280  trop = tm.correction(elevation);
281  ord -= trop;
282  }
283 
284  std::ostream& operator<<(std::ostream& s, const ObsRngDev& ord)
285  noexcept
286  {
287  std::ios::fmtflags oldFlags = s.flags();
288  s << "t=" << printTime(ord.obstime,"%Y/%03j %02H:%02M:%04.1f")
289  << " prn=" << std::setw(2) << ord.svid.id
290  << std::setprecision(4)
291  << " az=" << std::setw(3) << ord.azimuth
292  << " el=" << std::setw(2) << ord.elevation
293  << std::hex
294  << " h=" << std::setw(1) << ord.health
295  << std::dec << std::setprecision(4)
296  << " ord=" << ord.ord
297  << " ion=" << ord.iono
298  << " trop=" << ord.trop
299  << std::hex
300  << " iodc=" << ord.iodc
301  << " wonky=" << ord.wonky;
302  s.flags(oldFlags);
303  return s;
304  }
305 }
gnsstk::TropModel::correction
virtual double correction(double elevation) const
Definition: TropModel.cpp:53
example3.svid
svid
Definition: example3.py:19
gnsstk::NBTropModel
Definition: NBTropModel.hpp:86
gnsstk::CorrectedEphemerisRange::iodc
vshort iodc
The IODC of the GPS LNAV ephemeris, invalid for other GNSSes.
Definition: EphemerisRange.hpp:281
gnsstk::ObsRngDev::azimuth
vfloat azimuth
SV azimuth.
Definition: ObsRngDev.hpp:395
gnsstk::Position::asGeodetic
Position & asGeodetic() noexcept
Definition: Position.hpp:373
gnsstk::YDSTime
Definition: YDSTime.hpp:58
gnsstk::CarrierBand
CarrierBand
Definition: CarrierBand.hpp:54
gnsstk::ObsRngDev::iodc
vshort iodc
ephemeris IODC
Definition: ObsRngDev.hpp:398
gnsstk::ObsRngDev::debug
static GNSSTK_EXPORT bool debug
Definition: ObsRngDev.hpp:350
gnsstk::CorrectedEphemerisRange::svclkbias
double svclkbias
The satellite clock bias in meters.
Definition: EphemerisRange.hpp:256
gnsstk::ObsRngDev::ObsRngDev
ObsRngDev() noexcept
Definition: ObsRngDev.hpp:82
gnsstk::ObsRngDev::health
vshort health
SV health bitfield.
Definition: ObsRngDev.hpp:397
gnsstk::ObsRngDev::svid
SatID svid
PRN number of observed SV.
Definition: ObsRngDev.hpp:391
gnsstk::SatID
Definition: SatID.hpp:89
gnsstk::Position::getAltitude
double getAltitude() const noexcept
return height above ellipsoid (meters)
Definition: Position.hpp:469
gnsstk::TropModel
Definition: TropModel.hpp:105
gnsstk::Xvt::v
Triple v
satellite velocity in ECEF Cartesian, meters/second
Definition: Xvt.hpp:152
gnsstk::SVHealth
SVHealth
Identify different types of SV health states.
Definition: SVHealth.hpp:52
gnsstk::NavValidityType
NavValidityType
Definition: NavValidityType.hpp:53
GNSSconstants.hpp
gnsstk::NavSearchOrder
NavSearchOrder
Specify the behavior of nav data searches in NavLibrary/NavDataFactory.
Definition: NavSearchOrder.hpp:51
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::ObsRngDev::rho
vdouble rho
expected geometric range
Definition: ObsRngDev.hpp:399
gnsstk::ObsRngDev
Definition: ObsRngDev.hpp:73
MiscMath.hpp
EphemerisRange.hpp
gnsstk::Xvt::x
Triple x
Sat position ECEF Cartesian (X,Y,Z) meters.
Definition: Xvt.hpp:151
gnsstk::ObsRngDev::computeOrd
void computeOrd(double obs, const Position &rxpos, NavLibrary &navLib, const EllipsoidModel &em, bool svTime, NavSearchOrder order, SVHealth xmitHealth, NavValidityType valid)
Definition: ObsRngDev.hpp:353
gnsstk::IonoModelStore
Definition: IonoModelStore.hpp:62
gnsstk::YDSTime::doy
int doy
Definition: YDSTime.hpp:185
gnsstk::NavLibrary
Definition: NavLibrary.hpp:944
gnsstk::ObsRngDev::ord
double ord
difference between expected and observed range
Definition: ObsRngDev.hpp:392
example4.time
time
Definition: example4.py:103
EngEphemeris.hpp
gnsstk::ObsRngDev::computeOrdRx
void computeOrdRx(double obs, const Position &rxpos, NavLibrary &navLib, const EllipsoidModel &em, NavSearchOrder order, SVHealth xmitHealth, NavValidityType valid)
Definition: ObsRngDev.cpp:203
gnsstk::Position::getGeodeticLatitude
double getGeodeticLatitude() const noexcept
return geodetic latitude (deg N)
Definition: Position.hpp:454
ObsRngDev.hpp
gnsstk::CorrectedEphemerisRange::health
vshort health
Definition: EphemerisRange.hpp:284
gnsstk::operator<<
std::ostream & operator<<(std::ostream &s, const ObsEpoch &oe) noexcept
Definition: ObsEpochMap.cpp:54
gnsstk::CommonTime
Definition: CommonTime.hpp:84
gnsstk::Xvt::clkdrift
double clkdrift
satellite clock drift in seconds/second
Definition: Xvt.hpp:154
example6.valid
valid
Definition: example6.py:20
gnsstk::CorrectedEphemerisRange::ComputeAtTransmitTime
double ComputeAtTransmitTime(const CommonTime &trNom, const double &pr, const Position &rx, const SatID sat, NavLibrary &navLib, NavSearchOrder order=NavSearchOrder::User, SVHealth xmitHealth=SVHealth::Any, NavValidityType valid=NavValidityType::ValidOnly, const EllipsoidModel &ellipsoid=GPSEllipsoid())
Definition: EphemerisRange.cpp:102
gnsstk::ObsRngDev::computeOrdTx
void computeOrdTx(double obs, const Position &rxpos, NavLibrary &navLib, const EllipsoidModel &em, NavSearchOrder order, SVHealth xmitHealth, NavValidityType valid)
Definition: ObsRngDev.cpp:241
gnsstk::CorrectedEphemerisRange::ComputeAtTransmitSvTime
double ComputeAtTransmitSvTime(const CommonTime &ttNom, const double &pr, const Position &rx, const SatID sat, NavLibrary &navLib, NavSearchOrder order=NavSearchOrder::User, SVHealth xmitHealth=SVHealth::Any, NavValidityType valid=NavValidityType::ValidOnly, const EllipsoidModel &ellipsoid=GPSEllipsoid())
Definition: EphemerisRange.cpp:165
gnsstk::printTime
std::string printTime(const CommonTime &t, const std::string &fmt)
Definition: TimeString.cpp:64
gnsstk::ObsRngDev::obstime
CommonTime obstime
time of SV observation
Definition: ObsRngDev.hpp:390
gnsstk::ObsRngDev::elevation
vfloat elevation
SV elevation.
Definition: ObsRngDev.hpp:396
gnsstk::CorrectedEphemerisRange::elevation
double elevation
Definition: EphemerisRange.hpp:263
gnsstk::CorrectedEphemerisRange::svclkdrift
double svclkdrift
The satellite clock drift in m/s.
Definition: EphemerisRange.hpp:258
gnsstk::ObsRngDev::iono
vdouble iono
iono correction (meters)
Definition: ObsRngDev.hpp:400
gnsstk::ObsRngDev::computeTrop
void computeTrop(const TropModel &tm)
Definition: ObsRngDev.cpp:278
gnsstk::Position
Definition: Position.hpp:136
gnsstk::Xvt::clkbias
double clkbias
Sat clock correction in seconds.
Definition: Xvt.hpp:153
gnsstk::EllipsoidModel
Definition: EllipsoidModel.hpp:56
gnsstk::ObsRngDev::trop
vdouble trop
trop correction (meters)
Definition: ObsRngDev.hpp:401
gnsstk::CorrectedEphemerisRange
Definition: EphemerisRange.hpp:84
gnsstk::IonoModelStore::getCorrection
virtual double getCorrection(const CommonTime &time, const Position &rxgeo, double svel, double svaz, CarrierBand band=CarrierBand::L1) const
Definition: IonoModelStore.cpp:61
gnsstk::CorrectedEphemerisRange::azimuth
double azimuth
Definition: EphemerisRange.hpp:266
TimeString.hpp
gnsstk::CorrectedEphemerisRange::svPosVel
Xvt svPosVel
The satellite position (m) and velocity (m/s) in ECEF coordinates.
Definition: EphemerisRange.hpp:279


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:40