Navigation Message Library
Note
Please make an effort to keep this documentation in order of difficulty/usefulness, from simplest to hardest/most esoteric.

Getting Started

The NavFactory classes provide an interface for searching for navigation message data, including ephemeris, almanac, health ionospheric, ISC and time offset data, where

  • Ephemeris is the more precise orbital information where the subject and transmitting satellite are the same.
  • Almanac is less precise orbit information where the subject and transmitting satellite are not necessarily the same.
  • Health data indicates whether a given satellite/signal is in a usable state.
  • Time offset data provides the necessary data for converting between time systems, e.g. GPS and UTC.
  • Ionospheric data is provided by the system to model signal delays through the ionosphere for single-frequency users.
  • ISC (inter-signal correction) data is provided by the system to determine the delay between a given signal and the defined reference signal.
Note
Clock data also appears but only in SP3 data and is really only used for internal storage. It is factored into the computed Xvt in that case.

The simplest portion of this interface is defined in the NavLibrary class, which provides an interface for computing the satellite XVT at a given time. Refer to that class' documentation for a simple example of its use. The NavLibrary class also provides an interface for retrieving health status information and time offset information.

Entry Points

The NavLibrary class, which provides the highest-level interface, has four primary entry points for looking up navigation message data:

Regarding NavLibrary::getXvt() and antenna phase center (APC), one exception to this rule is when using SP3 files as input. The data in an SP3 file can be referenced to the center-of-mass, or to the antenna phase center. There is no programattic way to distinguish between the two, so it's entirely up to the user in this case to know what they're doing.

Use Cases

The table below describes what search parameters are expected to be specified vs. may be wildcards ("Any") in that situation. In each case, the use of wildcards is given as an option, i.e. specific values may still be specified if desired.

The following generalized use cases are defined: \dictionary \dicterm{Low-Precision} \dicdef{Only a rough estimate of the satellite position is needed. Typically used for applications where only azimuth and elevation measurements are needed to precision of maybe a 10th of a degree. Almanac or Ephemeris data may be used in such cases. Examples: visibility plots or any other plot against elevation and/or azimuth is used.} \dicterm{High-Precision} \dicdef{When a more precise satellite position is required. In this case you would use ephemeris data, but not almanac data. Examples: observed range deviation (ORD) analysis, inter-signal correction estimation.} \dicterm{Known-Source} \dicdef{This situation is typically when you're analyzing signal health and you need to know the exact signal a given navigation message came from. You might be looking at any given nav message type in this case, even almanac data.} \enddictionary

Parameter Low-Precision High-Precision Known-Source
sat.sat.id specified specified specified
sat.sat.system specified specified specified
sat.xmitSat.id wild wild specified
sat.xmitSat.system wild wild specified
sat.system specified specified specified
sat.obs.type wild wild wild
sat.obs.band wild specified specified
sat.obs.code wild specified specified
sat.obs.xmitAnt wild specified specified
sat.obs.freqOffs GLONASS GLONASS GLONASS
sat.obs.mcode wild wild wild
sat.nav wild specified specified
Note
nmid is used the same as "sat" in the above table as it extends the class with the additional messageType parameter. This parameter is only used in the find() method. The nmid.messageType field must always be specified as there is no wildcard value.
sat.obs.type may be specified to either "Any" or "NavMsg". No other values will yield any results.
sat.obs.freqOffset should be specified when supporting GLONASS (Is this always true, even for low-precision?)

Code Examples

In most cases, you'll want to use NavLibrary in conjunction with MultiFormatNavDataFactory to access navigation messages. This provides a relatively simple interface while simultaneously supporting multiple input formats, with the expansion of that set of supported input formats happening without the need for additional code changes.

The process for using NavLibrary in this fashion involves the following steps:

  1. Construct a NavLibrary object.
  2. Construct a NavDataFactory object (typically MultiFormatNavDataFactory).
  3. Add the NavDataFactory to the NavLibrary using addFactory().
  4. Add input data (files) to the NavDataFactory using addDataSource().
  5. Search the NavLibrary.

Low-Precision Example

Here is an example code snippet of how one might use NavLibrary for a low-precision use case. The getXvt() call in this example allows derivation of XVT data from either an almanac or ephemeris message:

Todo:
Update the ObsID stuff to match the decision about using freqOffset in the table above.
// Parameters used to construct sat will have been
// specified on the command-line or via some other means.
unsigned long subjID;
int freqOffs;
bool freqOffsSpec; // true if specified
// Output of search
// Construct a NavLibrary object.
// Construct a NavDataFactory object
std::make_shared<gnsstk::MultiFormatNavDataFactory>());
// Add the NavDataFactory to the NavLibrary
navLib.addFactory(ndfp);
// Add input data (files) to the NavDataFactory
if (!ndfp->addDataSource(inputFileName))
{
cerr << "Unable to load \"" << inputFileName << "\"" << endl;
return false;
}
// Search the NavLibrary
!freqOffsSpec);
if (!navLib.getXvt(sat, when, xvt))
{
cerr << "Unable to find XVT for " << sat << " @ " << when << endl;
return false;
}

High-Precision Example

Here is a reduced example code snippet of how one might use NavLibrary for a high-precision use case. In this example, the getXvt method that enforces the use of either almanac or ephemeris is used, and is forced to use only ephemeris data.

// Parameters used to construct sat will have been
// specified on the command-line or via some other means.
unsigned long subjID;
gnsstk::NavType nav; // e.g. GPSLNAV
int freqOffs;
bool freqOffsSpec; // true if specified
// Output of search
// Construct a NavLibrary object.
// Construct a NavDataFactory object
std::make_shared<gnsstk::MultiFormatNavDataFactory>());
// Add the NavDataFactory to the NavLibrary
navLib.addFactory(ndfp);
// Add input data (files) to the NavDataFactory
if (!ndfp->addDataSource(inputFileName))
{
cerr << "Unable to load \"" << inputFileName << "\"" << endl;
return false;
}
// Search the NavLibrary
gnsstk::NavSatelliteID sat(subjID, system, band, code, xmitAnt,
freqOffs, !freqOffsSpec, nav);
if (!navLib.getXvt(sat, when, xvt, false))
{
cerr << "Unable to find XVT for " << sat << " @ " << when << endl;
return false;
}

Known-Source Example

Here is a reduced example code snippet of how one might use NavLibrary for a known-source use case. This is much the same as the high-precision case, but with more details specified for matching.

// Parameters used to construct sat will have been
// specified on the command-line or via some other means.
unsigned long subjID;
unsigned long xmitID;
gnsstk::NavType nav; // e.g. GPSLNAV
int freqOffs;
bool freqOffsSpec; // true if specified
// Output of search
// Construct a NavLibrary object.
// Construct a NavDataFactory object
std::make_shared<gnsstk::MultiFormatNavDataFactory>());
// Add the NavDataFactory to the NavLibrary
navLib.addFactory(ndfp);
// Add input data (files) to the NavDataFactory
if (!ndfp->addDataSource(inputFileName))
{
cerr << "Unable to load \"" << inputFileName << "\"" << endl;
return false;
}
// Search the NavLibrary
freqOffs, xmitAnt, !freqOffsSpec);
gnsstk::SatID subjSat(subjID, subjSys);
gnsstk::SatID xmitSat(xmitID, xmitSys);
gnsstk::NavSatelliteID sat(subjSat, xmitSat, oid, nav);
if (!navLib.getXvt(sat, when, xvt, false))
{
cerr << "Unable to find XVT for " << sat << " @ " << when << endl;
return false;
}

Data Field Retrieval Example

This code snippet shows how one might take the results of a class derived from PNBNavDataFactory and immediately process the resulting decoded messages, looking at individual data fields. Something like this would be used if there's no intent to store the data internally for searching.

if (!pnbFactory.addData(pnb, ndList, cadence))
{
return false;
}
// process any results from addData
std::shared_ptr<gnsstk::GPSLNavEph> gpsLNavEph;
std::shared_ptr<gnsstk::OrbitDataKepler> odk;
for (auto& i : ndList)
{
// using = treats the expression as a boolean which
// means the pointer is valid.
if (gpsLNavEph = std::dynamic_pointer_cast<gnsstk::GPSLNavEph>(i))
{
cout << "Found a GPS LNAV ephemeris. IODC=" << hex
<< gpsLNavEph->iodc << endl;
}
// No else because inheritance means data fields of
// interest can be in more than one place.
if (odk = std::dynamic_pointer_cast<gnsstk::OrbitDataKepler>(i))
{
cout << "Found Keplerian orbit parameters, A=" << odk->A << endl;
}
}

Practical Examples

Some practical examples may be found in gnsstk (library code). These are:

Source file Use case
EphemerisRange.cpp Get Xvt+IODC+health
BCIonoCorrector.cpp Look up ionospheric corrections
BCISCorrector.cpp Look up inter-signal corrections

More complete practical examples for NavLibrary and related classes can be found in the gnsstk-apps repository. Those are:

Source file Use case
timeconvert.cpp Look up TimeOffsetData and change time systems.
navdump.cpp Dump data, look up arbitrary data types, compute
Xvt, load different data types from different
files.
WhereSat.cpp Print Xvt of all known satellites in a time range

(If you see ^ rendered in the table above, try a newer version of Doxygen)

Practical examples using Python are somewhat scarce, but what there is can be found in swig/tests, e.g. test_NavLibrary.py.

Search Parameters

The NavLibrary entry points have a common set of parameters that are specified when searching for data. With the exception of the find() method, defaults are used for these parameters that were deemed the most likely values across typical use cases and these are typically safe values to use in a given situation. Changing from the defaults is only likely in the event of implementing an atypical use case.

The common parameters are: \dictionary \dicterm{sat/nmid} \dicdef{The full signal/message specification to search for.} \dicterm{when} \dicdef{The time you're interested in getting the health, time offset, Xvt, etc.} \dicterm{xmitHealth} \dicdef{Allows you to specify the desired health state of the satellite that transmitted a given nav message at the time of interest. DEFAULT=Any} \dicterm{valid} \dicdef{Allows you to specify whether you want navigation messages that passed or failed validity checks. DEFAULT=ValidOnly} \dicterm{order} \dicdef{Allows you to specify whether you want the data that would have appeared in a near-real-time situation or if you want the data with the closest time stamp. DEFAULT=User} \enddictionary

Most of these parameters have a wildcard (aka "don't care", aka "Any") value, meaning that any value for that parameter will match. The when and order parameters are exceptions to this - they must always be specified as a fixed, single value.

Parameter sat/nmid

The sat and nmid parameters specify a great deal of detail about the data you're interested in, and this is where most of the use-case-specific tweaking will be done.

The sat parameter is a NavSatelliteID object, while nmid is a NavMessageID object. NavMessageID inherits from NavSatelliteID (click for class/inheritance diagram), and adds the messageType parameter.

The classes contain the following data:

\dictionary \dicterm{messageType} \dicdef{(nmid/NavMessageID only) Specifies what type of navigation message is being stored or searched for, e.g. NavMessageType::Almanac, NavMessageType::Ephemeris, etc.} \dicterm{sat} \dicdef{The subject satellite ID (SatID). This is the satellite to which the data applies. This may be different from xmitSat, and typically is in the case of almanac data. This is the satellite whose health or position you want.} \dicterm{xmitSat} \dicdef{The ID of the satellite that transmitted the navigation message. In most cases is the same as sat, but may be different for almanac data. Can be a wildcard value if, for example, you want almanac data but don't care what the transmitting satellite was. Ephemerides will have the same sat and xmitSat values and can be specified this way when searching.} \dicterm{system} \dicdef{This specifies the SatelliteSystem whose data is identified or being searched for. This is distinct from the system in sat and xmitSat for two reasons, one is that some systems have been known to broadcast data about other systems (QZSS test broadcasting GPS navigation messages for example). Another is that the NavSignalID class that contains the information does not contain the satellite data, but is in some cases used independently of the satellite ID.} \dicterm{obs} \dicdef{This specifies the CarrierBand and TrackingCode and other relevant information describing a signal. These can be set to wildcard values as well when searching.} \dicdef{nav} \dicdef{This specifies the navigation message structure from which the data was derived, e.g. gnsstk::NavType::GPSLNAV. This too can be specified as a wildcard using gnsstk::NavType::Any.} \enddictionary

Todo:
try to fix the NavType links above.

Details on SatID

SatID data is used in two ways in the NavSatelliteID class. One is to identify the transmitting satellite, and the other is to identify the subject satellite. These are distinct for the case of almanac data, where each satellite in a given constellation broadcasts low precision orbital elements ("almanacs") for every satellite in the constellation.

In most situations, the transmit satellite may be set to wildcard values in the search parameters.

The satellite is identified using a combination of the satellite system and the system-specific identifier (e.g. PRN for GPS).

A SatID may be made into a wildcard by one of two ways, either by calling the SatID::makeWild() method, or by setting SatID::wildId and/or SatID::wildSys individually (the former is recommended if the SatID is meant to match anything, as it should be kept up-to-date with any internal data changes).

Details on ObsID

The ObsID class identifies an observation of a signal from a satellite. This includes the observation type (in this case, always navigation messages), the carrier band, tracking code, transmitting antenna, and, in the case of GLONASS, the frequency offset for the FDMA constellation. Depending on your use case (see Use Cases above), you may wish to specify this data or not.

Bit fields for M-Code data are also present in the ObsID class for matching, but use cases for anything but wildcard matches will be extremely rare.

Parameter when

The when parameter specifies a time of interest. There aren't too many restrictions on this, except that the time system should match the satellite system of interest (or time system, when getting time offset information), or otherwise be set to TimeSystem::Any.

Parameter xmitHealth

The xmitHealth parameter allows you to specify whether you want your data to come from a satellite that is healthy, or unhealthy, or if you don't care.

If a default value is set in the method prototype at all, the default is SVHealth::Any, which means you don't care whether the transmitting satellite is healthy or not.

If you only want data transmitted by healthy satellites, then specify SVHealth::Healthy.

If for some reason you only want data from unhealthy satellites, then specify SVHealth::Unhealthy.

One last option for health is SVHealth::Degraded, however this is a very limited use case as currently it is only utilized by the Galileo implementation.

Parameter valid

The valid parameter allows you to specify whether or not you want to do validity checks on the navigation data before using it. When methods have a default for this parameter, it is to perform validity checks.

The validity checks are performed was the data is added to the NavDataFactory. The validity checks are all specific to each navigation message, and usually consists of range checks on decoded values.

Other values are NavValidityType::InvalidOnly, which runs validity checks and only accepts data that fails. Finally is the ubiquitous NavValidityType::Any value which skips the validity checks altogether and doesn't reject any data.

Parameter order

The order parameter has two possible values, NavSearchOrder::User, which most closely resembles the behavior a user would see when using a receiver in near real-time, and NavSearchOrder::Nearest which looks for data with the timestamp closest to when, forward or backward in time.

Most use cases will want to use NavSearchOrder::User, and this is the default when one is specified. NavSearchOrder::Nearest is only used in vary specific cases that you probably already know if you're going to use it at all.

NavFactory HOW-TO

  • Specify what to search for...
    • When using NavLibrary::find() and related methods, you must specify a NavMessageID (NavSatelliteID for the related methods). This tells find() what type of message to search for (for NavMessageID), which satellites you're interested in (NavSatelliteID) and which signals you're interested in (NavSignalID).
    • NavSatelliteID allows the use of wildcards when specifying the subject satellite and/or transmitting satellite. This means you can search for almanacs transmitted by GPS PRN 1, for example, or almanac orbital elements describing the orbit of GPS PRN 1, or almanacs for GPS PRN 7 transmitted by GPS PRN 3. This also applies to health and ephemeris data, but bear in mind that ephemeris data will have the same subject and transmit satellite. In most cases, you'll want to specify the subject satellite and leave the transmitting satellite as a wildcard. See SatID for more information.
    • NavSignalID also allows the use of wildcards for the CarrierBand, TrackingCode, and NavType, any of which can be set to the "Any" enumeration to be treated as a wildcard. This allows you to do things like get ephemerides for GPS PRN 1 without caring if the signal was L1 C/A, L1 P/Y or L2 P/Y (by setting NavSignalID::carrier and NavSignalID::code to Any and NavSignalID::nav to NavType::GPSLNAV). You can also even set NavSignalID::nav to NavType::Any if you don't care whether the orbit data came from LNAV or CNAV or CNAV2.
  • Get Ephemeris/Almanac/Health at a given time...
    • Use the NavLibrary::find() method. The results will include any system-specific data, if you know how to use it (see NavData).
  • Only process/load data of a certain type...
    • Use the NavLibrary::setTypeFilter() method, or if using a NavDataFactory class directly, use NavDataFactory::setTypeFilter().
    • This allows you to limit which data types (almanac, ephemeris, health, time offset) are processed and potentially stored internally, improving performance and reducing resource utilization by ignoring data that is not needed for the task.
  • Only process/load valid data...
    • Each ICD generally will specify valid ranges of data when applicable. This can be used to determine whether a given navigation message can/should be used or not. The NavLibrary::setValidityFilter() method or NavDataFactory::setValidityFilter() method can be used to tell the factory/factories to only process/load valid data, invalid data, or all data. Like setTypeFilter(), this can improve performance and reduce resource utilization under the right circumstances.
  • Only use data from healthy satellites...
    • The NavLibrary::getXvt(), NavLibrary::getHealth(), NavLibrary::getOffset(), NavLibrary::getISC(), NavLibrary::find() and NavDataFactory::find() methods all support the specification of the desired health status of the transmitting satellite (in the form of the SVHealth enumeration). By default, the health of the transmitting satellite is ignored, which is the fastest option as it does not engender searches for or checking of health status. Specifying a specific desired health status to getHealth() is not the most useful option, however it can give you the ability to find out when an unhealthy satellite was last marked healthy, for example.
  • Only use/retrieve valid or invalid data...
    • Like the transmit satellite health, you can also specify a validity to match as described above.
  • Only support a specific input format...
    • If you want the high-level NavLibrary::getXvt() etc. interface, use that, of course, in conjunction with the NavLibrary::addFactory() method to add the specific format factory for processing the input data.
    • If you don't need the high-level interface and just want to retrieve the objects derived from NavData, use the appropriate NavDataFactory::find() object/method.
  • Get the health of the subject satellite...
  • Get the satellite Xvt when I've already obtained orbit data...
    • The OrbitData::getXvt() method can be used to compute the Xvt.
    • Note that it is recommended to do a new find() call for each orbit computation, particularly if there's any possibility of using interpolated orbits, as in OrbitDataSP3. This is your best bet at having an appropriate set of orbital data for a given time.
  • Get the URA for a given data set...
    • The URA/SISA data is system-specific and thus stored in the leaf nodes of the NavData tree (e.g. GPSLNavEph). You will need to do a dynamic_cast to the appropriate type and then check, e.g.
      NavDataPtr result;
      navlib.find(nmid, when, result, SVHealth::Any, NavValidityType::Any,
      GPSLNavEph *eph = dynamic_cast<GPSLNavEph*>(result.get());
      if (eph != nullptr)
      {
      cout << "URA index = " << (unsigned)eph->uraIndex << endl;
      }
  • Compute Xvt over a time range using a single data set...
    • As noted above, it is recommended to do a new find() call for each orbital computation, however there is at least one use case where this is valid, when you're attempting to use empirical data to determine fit intervals. To do as described use the NavLibrary::find() or NavDataFactory::find() method to get your orbital data (ephemeris or almanac), then simply use the getXvt() method with different times.
Todo:
Determine if a URA in meters should be added to OrbitDataKepler or OrbitData.

NavFactory Design Overview

The NavFactory classes are designed with several goals in mind (in no particular order):

  • Provide a simple interface for common nav data tasks.
  • Support multiple GNSSes using a common interface.
  • Support storage formats that are implemented in the gnsstk.
  • Allow for dynamic run-time extension of supported formats.
  • Support raw nav data bit decoding as needed by input formats.
  • Allow for dynamic run-time extension of raw nav data decoding.

The end result is a design that includes the following:

  • NavLibrary class which provides a high-level interface for getting satellite XVT, health and time system offset data.
  • A tree of classes with NavDataFactory as the base, which, given a request for navigation data, will create and return the requested data if possible. This tree of classes is where support for various input formats (most prominently, files) is implemented.
  • A tree of classes with NavData as the base, which implements the storage for orbit data (OrbitData), health data (NavHealthData) and time offset data (TimeOffsetData). The GNSS-specific implementations derive from these three classes to provide the code and data needed for that GNSS.
  • A tree of classes with PNBNavDataFactory as the base, which provides the ability to decode the raw navigation message bits into their engineering units counterparts that are derived from NavData. In short, the PNBNavDataFactory classes take a PackedNavBits object as input and produce 0 or more objects derived from NavData as output. These classes are typically used internally by NavDataFactory classes.

NavFactory Extendability Design

The NavFactory classes are designed to be extensible, as noted above. This is done using two classes: MultiFormatNavDataFactory and PNBMultiGNSSNavDataFactory.

MultiFormatNavDataFactory Design

The MultiFormatNavDataFactory class is a child of the NavDataFactoryWithStoreFile class that keeps track of other NavDataFactoryWithStoreFile classes. It works by "farming out" requests to factories that are capable of handling them. The determination of whether a factory is capable of handling a given request is used by mapping each of the signals supported by the factories to the factory itself, therefore when a find request is made to MultiFormatNavDataFactory, it looks up the requested signal in the map of factories and tries matching factories until one succeeds (giving up if none succeed).

The MultiFormatNavDataFactory may be added as a single factory to the NavLibrary.

The reason for having this particular factory rather than adding each individual NavDataFactory to a NavLibrary (which is also still possible) is where the extensibility comes in. The MultiFormatNavDataFactory::factories data member is declared static and is initialized at run time, which not only allows for dynamic configuration of factory support, but also allows for other libraries to add support for factories that do not exist in the gnsstk.

As an example, support for RINEX NAV and SP3 is implemented in the core gnsstk, but support for Yuma and SEM format files is only present in the ext code. While in this particular case, using compiler directives would have worked to decide whether to add support for Yuma and SEM, that wouldn't have worked for external formats. You may have proprietary formats you wish to support, file or real-time. These can be added as described in Adding Custom NavData Factories.

The end result of all of this is that if you have a tool that is written to use NavLibrary with MultiFormatNavDataFactory, as long as you're not digging deep into the detailed specifics of the factory or data classes, all that is required to add support for additional formats is to link the library implementing the format to that executable.

Note
The fact that the factories data member is static means that certain methods will appear to behave in strange ways. Please read the warning messages in MultiFormatNavDataFactory.

PNBMultiGNSSNavDataFactory Design

The PNBMultiGNSSNavDataFactory class design is much like the MultiFormatNavDataFactory class. It also has a static data member PNBMultiGNSSNavDataFactory::factories where classes derived from PNBNavDataFactory can be added to support the decoding of additional signals. This is also initialized by libraries at run-time.

There is no NavLibrary equivalent for PNBNavDataFactory. Instead, a class derived from NavDataFactory that is expected to process the raw navigation messages from multiple systems would use an instance of this class to decode the raw navigation messages in the form of PackedNavBits. Data goes through the translation process using PNBNavDataFactory::addData(), the results of which can be stored or used as appropriate.

There are currently no factories in ext that are being added this way, however instructions for doing so can be found in Adding Custom PNBNavData Factories.

Note
The fact that the factories data member is static means that certain methods will appear to behave in strange ways. Please read the warning messages in PNBMultiGNSSNavDataFactory.

Adding Custom NavData Factories

If you wish to add support for additional file formats to MultiFormatNavDataFactory, you will need to do the following:

  1. Define a class whose constructor instantiates the factory and adds it using MultiFormatNavDataFactory::addFactory(). This constructor should check a static boolean data member to make sure it only does this once.
  2. Define a static instance of said class so that the constructor is called at run time, thereby adding the custom factory to MultiFormatNavDataFactory whenever the code is used.
Warning
It is possible that even with this implementation, the static initialization may not happen properly, a problem we have seen under Windows at the very least. It is strongly recommended that if you chose to implement an addition to the MultiFormatNavDataFactory you also implement a test in your code to make sure it actually is adding the factory properly.

Adding Custom PNBNavData Factories

Adding support for additional nav message data decoders can be added to PNBMultiGNSSNavDataFactory. You will need to do the following:

  1. Define a class whose constructor instantiates the factory and adds it using PNBMultiGNSSNavDataFactory::addFactory(). This constructor should check a static boolean data member to make sure it only does this once.
  2. Define a static instance of said class so that the constructor is called at run time, thereby adding the custom factory to MultiFormatNavDataFactory whenever the code is used.

There are no examples of this outside the gnsstk core, however one may look at core/lib/NewNav/NavStatic.cpp to see how this is done for the core PNBNavDataFactory classes. There should be little difference for outside code.

Warning
It is possible that even with this implementation, the static initialization may not happen properly, a problem we have seen under Windows at the very least. It is strongly recommended that if you chose to implement an addition to the PNBMultiGNSSNavDataFactory you also implement a test in your code to make sure it actually is adding the factory properly.

Known Issues

BeiDou Known Issues

  • The lack of a reference time for the time system conversion data in D1 Nav means we've had to make our best guess at how the time offset is really derived.
  • The B1I ICD does not appear to explicitly tie the D1 almanac pages to subframe 5, page 8 which contains the WNa. Nevertheless, we assume that the toa should match between these pages and discard any almanac pages which do not.
gnsstk::NavDataPtr
std::shared_ptr< NavData > NavDataPtr
Factories instantiate these in response to find() requests.
Definition: NavData.hpp:62
gnsstk::CarrierBand
CarrierBand
Definition: CarrierBand.hpp:54
gnsstk::NavSatelliteID
Definition: NavSatelliteID.hpp:57
gnsstk::SatelliteSystem
SatelliteSystem
Supported satellite systems.
Definition: SatelliteSystem.hpp:55
gnsstk::CarrierBand::Any
@ Any
Used to match any carrier band.
gnsstk::NavLibrary::getXvt
bool getXvt(const NavSatelliteID &sat, const CommonTime &when, Xvt &xvt, bool useAlm, SVHealth xmitHealth=SVHealth::Any, NavValidityType valid=NavValidityType::ValidOnly, NavSearchOrder order=NavSearchOrder::User)
Definition: NavLibrary.cpp:52
example5.oid
oid
Definition: example5.py:29
gnsstk::SatID
Definition: SatID.hpp:89
gnsstk::NavDataFactoryPtr
std::shared_ptr< NavDataFactory > NavDataFactoryPtr
Managed pointer to NavDataFactory.
Definition: NavDataFactory.hpp:398
gnsstk::ObservationType::NavMsg
@ NavMsg
Navigation Message data.
gnsstk::SVHealth::Any
@ Any
Use in searches when you don't care about the SV health.
gnsstk::NavLibrary
Definition: NavLibrary.hpp:944
gnsstk::ObsID
Definition: ObsID.hpp:82
gnsstk::CommonTime
Definition: CommonTime.hpp:84
gnsstk::Xvt
Definition: Xvt.hpp:60
gnsstk::NavValidityType::Any
@ Any
Load/find nav messages regardless of validity checks.
gnsstk::XmitAnt
XmitAnt
Definition: XmitAnt.hpp:53
gnsstk::TrackingCode
TrackingCode
Definition: TrackingCode.hpp:64
gnsstk::NavLibrary::addFactory
void addFactory(NavDataFactoryPtr &fact)
Definition: NavLibrary.cpp:470
gnsstk::NavSearchOrder::User
@ User
Return the latest message before the search time.
gnsstk::NavType
NavType
Supported navigation types.
Definition: NavType.hpp:58
gnsstk::XmitAnt::Any
@ Any
When making comparisons in ObsID, matches any enumeration.
gnsstk::TrackingCode::Any
@ Any
Used to match any tracking code.


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