The Navigation Accuracy Library allows you to configure GPS satellites and a GPS receiver and determine the accuracy with which the receiver can determine its position.
The functionality described in this topic requires a license for the Navigation Accuracy Library.
DME Component Libraries computes two broad types of navigation accuracy: assessed and predicted. These terms refer to the type of accuracy calculation performed, rather than to the time at which the accuracy is evaluated. Assessed accuracies require performance assessment data and predicted accuracies require prediction support data. You can actually evaluate either of these accuracies at any time, past or future. The difference is that assessed accuracies provide you with signed (±) navigation errors expressed in a certain set of axes centered on the receiver's antenna location. However, predicted accuracies are statistical predictions of accuracy; providing 1-sigma navigation error results instead of signed errors. Visually, the difference is that an assessed accuracy provides you with an error vector while a predicted accuracy can only supply you with an error ellipsoid.
Setting up navigation accuracy analysis involves the following steps:
defining the satellite constellation that provides the navigation data
configuring the GPS receiver
Before accuracy or any other navigation quantity can be computed, the constellation of satellites providing navigation data must be identified. DME Component Libraries provides classes to load a constellation of navigation satellites from the following sources:
A SEM formatted almanac. SEM almanac files usually have a .AL3 file extension. Current and historical SEM almanac files can be downloaded from: https://ftp.agi.com/pub/Catalog/Almanacs/SEM/.
A YUMA formatted almanac, usually with a .ALM file extension.
A broadcast ephemeris in RINEX format.
A precise ephemeris in SP3a format.
A precise ephemeris in SP3c format.
All of these formats and files are readily available on the internet.
The following example shows how to create a constellation of GPS satellites from a SEM almanac:
GlobalPositioningSystemDate almanacDate = new GlobalPositioningSystemDate(new GregorianDate(2007, 7, 11)); SemAlmanac almanac = SemAlmanac.readFrom(fileName, almanacDate.getRolloverCount()); PlatformCollection constellation = almanac.createSatelliteCollection();
The number 1 passed to the readFrom method above defines the rollover count to which this almanac is referenced. Almanacs generated since August 22, 1999 will have a rollover count of 1; prior to that date, the rollover count should be 0.
The createSatelliteCollection method creates a Platform instance for each satellite described in the almanac. Each Platform will have a GpsSatelliteExtension attached to it. This extension describes the Pseudo-random number (PRN) associated the satellite. It also holds outage information for the satellite.
For various reasons, GPS satellites are sometimes unavailable for use by navigation users. Information about historical, current, and scheduled periods of unavailability are published in the form of Notice Advisories to Navstar Users (or NANUs). NANUs are then aggregated into a single Satellite Outage File (SOF) that contains all of the historical, current, and predicted outages for all of the GPS satellites as of the time the SOF is published. SOFs are available from: http://gps.afspc.af.mil/gpsoc/archive/sof/.
DME Component Libraries can read a SOF file and populate the GPS constellation with outage information. This will prevent a satellite from being used for analysis during a period when it was, or is predicted to be, unavailable. The following example shows how to read a SOF and apply it to a constellation of satellites:
SatelliteOutageFile sof = SatelliteOutageFile.readFrom(fileName); sof.populateConstellationOutageData(constellation);
The next step, after configuring the constellation of satellites, is to configure the GPS receiver. We begin by constructing an instance of the GpsReceiver type and configuring it with the constellation of GPS satellites it can use:
GpsReceiver receiver = new GpsReceiver(); receiver.setNavigationSatellites(constellation); receiver.getReceiverConstraints().add(new ElevationAngleConstraint(Trig.degreesToRadians(5.0)));
The receiver has a number of properties that must be configured before it can be used in any analysis.
The number of channels a receiver has limits the number of satellites that are used in any calculations the receiver performs. Typical receivers available today have 12 channels, allowing up to 12 satellites to be tracked simultaneously. The number of channels can be configured by setting the NumberOfChannels (get / set) property:
The GpsReceiverSolutionType of a receiver specifies how the receiver will behave when there are more satellites available to track than there are channels. When set to GpsReceiverSolutionType.ALL_IN_VIEW, the lowest elevation-angle satellites will be dropped until the remaining number of satellites matches the number of channels in the receiver. When set to GpsReceiverSolutionType.BEST_N, the library will calculate the Dilution of Precision (DOP) associated with all combinations of N satellites, where N is the number of channels. The set of N satellites with the lowest DOP value will be the tracked set. This method of reduction was common when receivers typically had only 4 channels, but is less common today. When using GpsReceiverSolutionType.BEST_N, the specific DOP value to optimize on can be specified:
The receiver's noise model determines the noise, in meters, contributed to the navigation accuracy solution by the receiver. Currently, the only noise model provided with DME Component Libraries is ConstantGpsReceiverNoiseModel, which reports the same noise value in all channels without regard to the satellite being tracked. It is possible to implement a custom noise model, with a different receiver noise value for each channel, by deriving a new class from GpsReceiverNoiseModel. The following example shows how to configure the receiver with a constant noise model:
A receiver's antenna describes, at a minimum, the position and orientation of the antenna phase center:
Cartographic receiverLocation = new Cartographic(Trig.degreesToRadians(-75.0), Trig.degreesToRadians(40.0), 0.0); Platform antenna = new Platform(); EarthCentralBody earth = CentralBodiesFacet.getFromContext().getEarth(); antenna.setLocationPoint(new PointCartographic(earth, receiverLocation)); antenna.setOrientationAxes(new AxesEastNorthUp(earth, antenna.getLocationPoint())); receiver.setAntenna(antenna);
Here, the antenna is given a fixed location and axes that orient it so that the X-axis points East, the Y-axis points North, and the Z-axis points Up, which is typical of a GPS receiver. Because the LocationPoint (get / set) and OrientationAxes (get / set) properties of a Platform can vary with time, the GPS receiver can move over the course of an analysis.
If you have the Communications Library as well, you can assign a GpsCommunicationsFrontEnd to the Antenna (get / set) property. This will allow you to analyze GPS communications behaviors in electronically challenged environments.
Once the GPS satellites and receiver are configured, an assessed or predicted accuracy calculation can be performed.
A Performance Assessment File (PAF) is required in order to compute assessed navigation accuracy. It contains GPS satellite ephemeris and clock errors for each GPS satellite at 15 minute intervals.
PAF data is available from:
Once PAF data has been loaded, an evaluator can be obtained from the GPS receiver to evaluate assessed accuracy at a given time. The following example shows how to load PAF data, obtain the evaluator, and evaluate it at specific times:
PerformanceAssessmentFile paf = PerformanceAssessmentFile.readFrom(fileName); Evaluator<NavigationAccuracyAssessed> assessedEvaluator = receiver.getNavigationAccuracyAssessedEvaluator(paf); JulianDate date = new GregorianDate(2007, 6, 10, 12, 0, 0).toJulianDate(); NavigationAccuracyAssessed assessed = assessedEvaluator.evaluate(date);
The errors in NavigationAccuracyAssessed are divided into two groups: SignalInSpace and Total. The SignalInSpace errors are those errors that result from the PAF data alone. No receiver errors are added to those values. The total errors include the receiver noise values specified in the receiver definition and are a root sum square (RSS) of the SignalInSpace errors and the receiver noise values.
Usually the PAF data files are complete and no adjustments are necessary. However, sometimes data is missing from the PAFs. DME Component Libraries will handle the missing data, but you can change the default interpolation and extrapolation behaviors. The next section discusses the capabilities available to to deal with missing data.
Three cases arise when the Assessed Accuracy evaluator is asked for navigation accuracy at a given time.
The evaluate time is within the PAF validity time and PAF data exists.
The evaluate time is within the PAF validity time and PAF data does not exist (missing data).
The evaluate time is not within the PAF validity time.
Case 1 is the usual case where the evaluate time is within the PAF validity time and there is data available. If the evaluate time is on a 15 minute boundary (as defined in the PAF file) no interpolation is performed on the PAF data. If the evaluate time is not on a 15 minute boundary, the PAF data will be linearly interpolated between two 15 minute data points.
Case 2 is the missing data case. The evaluate time is within the PAF validity time, but there is no data for one or more 15 minute segments in the file. In this case, the evaluator will interpolate between the closest available data. The one caveat here is the availability threshold. PerformanceAssessmentFile has a property called DefaultAvailabilityThreshold (get / set) that represents how many missing data points you'll allow to be interpolated over before the evaluator reports that it is unavailable and a DataUnavailableException is thrown. The default availability threshold is 2 hours. If more than 2 hours of data is missing, the evaluator will report that it is is unavailable, and a DataUnavailableException will be thrown if it is evaluated.
Case 3 is the case where the evaluate time is outside of the PAF validity time. In this case, the default behavior for the evaluator is to report that it is unavailable and to throw a DataUnavailableException if evaluated. If you want to be able to use this specific PAF data for an assessed accuracy calculation, you can; however, extrapolation of the PAF data is required. For example, this is useful when you want to perform short-term predictions of navigation accuracy. AGI's analysis has shown that this can be done effectively for 6 hours outside the validity time of the PAF file. When you use this feature though, there are no barriers to what time you may evaluate at. To extrapolate the PAF data, you must set the DefaultAllowExtrapolation (get / set) property on PerformanceAssessmentFile to true before obtaining the performance assessment evaluator. With DefaultAllowExtrapolation (get / set) set to true, the evaluator's availability times are ignored (including the availability threshold described in Case 2 above) and the evaluator will return accuracies for any given time, extrapolating or interpolating the PAF data as required.
Predicted accuracy is somewhat of a misnomer, as it implies you can only obtain accuracy results in the future. In fact, you can obtain it at any time. As stated above, the evaluator returned by getNavigationAccuracyPredictedEvaluator will provide statistical information regarding the navigation errors at a given time. This statistical accuracy information output from the NavigationAccuracyPredicted class is the 1-sigma value of the navigation error. This is also known as the square root of the navigation error covariance or RMS error.
Statistical errors are a little different to deal with than error vectors. The RMS error output is a 1-sigma value for the given metric within its distribution. For example, if the output was of vertical error, the distribution represented is a single variable normal (Gaussian) distribution. Here, the 1-sigma value represents a 68% confidence in the vertical navigation error - a familiar result. On the other hand, if the horizontal error is produced, this value is from a two dimensional distribution. In this case, the confidence in the 1-sigma value is approximately 39.3%. Similarly, the position error confidence for the 1-sigma value produced is only 19.9%, since position errors are derived from a three dimensional distribution.
Computing predicted navigation accuracy requires the use of a Prediction Support File (PSF). The following example shows how to load PSF data, obtain an evaluator for predicted accuracy, and evaluate the accuracy at a particular date:
PredictionSupportFile psf = PredictionSupportFile.readFrom(fileName); Evaluator<NavigationAccuracyPredicted> predictedEvaluator = receiver.getNavigationAccuracyPredictedEvaluator(psf); JulianDate date = new GregorianDate(2007, 4, 25, 12, 0, 0).toJulianDate(); NavigationAccuracyPredicted predicted = predictedEvaluator.evaluate(date);
Like assessed accuracy, the errors in NavigationAccuracyPredicted are divided into two groups: SignalInSpace and Total. The SignalInSpace errors are those errors that result from the PSF data alone. No receiver errors are added to those values. The total errors include the receiver noise values specified in the receiver definition and are a root sum square (RSS) of the SignalInSpace errors and the receiver noise values.
Once you have an RMS error output from the prediction navigation accuracy evaluator, you may want to convert it to a standard confidence value such as 50% or 95%. This can be accomplished with the ConfidenceInterval class. Simply call the convertToGlobalPositioningSystemConfidence method with the RMS value, the desired confidence percentile and the dimensionality of the RMS value. The correct confidence value for that particular distribution will be returned.
ConfidenceInterval confidenceInterval = new ConfidenceInterval(); double standardConfidence = confidenceInterval.convertToGlobalPositioningSystemConfidence(predicted.getPositionTotal(), 95, ConfidenceIntervalVariableDimension.THREE);
Standard predictions use PSF files, available from: https://ftp.agi.com/pub/Catalog/PSF. These files contain averages of the satellite ephemeris and clock errors over the last seven days. The best time to use these standard PSF files is as close to the file epoch as possible, as denoted by the reference time in the PSF file. The ConfidenceInterval class provides the correct scaling by default for the standard PSF predictions.
Other types of PSF files can be used, depending on how the user generates the PSF data. In this case the ConfidenceInterval class will accept a custom multiplier file that can then be used to generate the correct confidence percentiles for the type of PSF file used.
GpsReceiver can be used to compute a number of other navigation-related values, in addition to the assessed and predicted accuracy described here:
Identifies the satellites that are tracked by the receiver at a given time.
Computes Dilution of Precision (DOP) based on the configuration of the tracked satellites at a given time.
Computes outages of Receiver Autonomous Integrity Monitoring (RAIM).