Hi @AmirAllahvirdi,
The combination of measurements does not depends on the nature of the measurement (Range
, Phase
, OneWayRange
, OneWayPhase
, etc.). You must use ObservationData
objects to perform the combination of measurements. Each observation in a Rinex file corresponds to an ObservationData
when parsing the Rinex file in Orekit. Theforefore, ObservationData are used to build the measurements and they can be combined to build combined measurements.
Please note that the combination of measurements can be performed only if:
- You have different observations at different frequencies for a same epoch (e.g. C1 and C2).
- And the signal code of the observations is the same. For instance, an iono-free combination cannot be performed between C1 and P2 observations.
If I assume a GPS satellite as emitter of the observations, something like that could answer your question:
// Satellite system
final SatelliteSystem system = SatelliteSystem.GPS;
// Initialize the ionosphere-free combination
final IonosphereFreeCombination ifComb = MeasurementCombinationFactory.getIonosphereFreeCombination(system);
// Time scale
final TimeScale utc = TimeScalesFactory.getUTC();
// LEO satellite
final ObservableSatellite receiver = new ObservableSatellite(0);
// Initialize two random observations
final AbsoluteDate epoch = new AbsoluteDate("2007-09-27T00:00:00.000", utc);
final ObservationData obs1 = new ObservationData(ObservationType.C1, 21579415.208, 3, 7);
final ObservationData obs2 = new ObservationData(ObservationType.C2, 21579420.972, 3, 7);
// Perform the combination of measurements
final CombinedObservationData combined = ifComb.combine(obs1, obs2);
// Build a "ionosphere-free" OneWayGNSSRange measurement
final OneWayGNSSRange measurement = new OneWayGNSSRange(remote, dtRemote,
epoch, combined.getValue(),
1.0, 1.0, receiver);
Here you have a ionosphere-free measurement. Therefore, you don’t need to add a ionosphere measurement modifier to the measurement.
It is also possible to perform the combination of measurements directly on an ObservationDataSet
(i.e. list of ObservationData
at a same epoch and for a single satellite). The advantage of doing that is that the different verifications (different frequency, same signal code, etc.) is done internally by the algorithm of combination of measurements. At the end, you have a CombinedObservationDataSet
containing all the possible ionosphere-free combination of measurements for the given data set. The getMeasurementType() method of CombinedObservationData allow you to know the nature of the combined measurement (Range, Phase, etc.). Here a small example:
// Read the Rinex file
final RinexLoader loader = new RinexLoader(...);
// Loop on observation data set
for (final ObservationDataSet observationDataSet : loader.getObservationDataSets()) {
// Initialise a ionosphere-free combination of measurements
final IonosphereFreeCombination ifComb = MeasurementCombinationFactory.getIonosphereFreeCombination(system);
final CombinedObservationDataSet combinedDataSet = ifComb.combine(observationDataSet);
for (final CombinedObservationData cod : combinedDataSet.getObservationData()) {
// If Range
if (cod.getMeasurementType() == MeasurementType.PSEUDO_RANGE) {
// Initialize a OneWayGNSSRange
} else if (cod.getMeasurementType() == MeasurementType.CARRIER_PHASE) {
// Initialize a OneWayGNSSPhase
}
}
Best regards,
Bryan