1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.gnss;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22
23 import org.orekit.errors.OrekitException;
24 import org.orekit.errors.OrekitMessages;
25 import org.orekit.files.rinex.observation.ObservationData;
26 import org.orekit.files.rinex.observation.ObservationDataSet;
27 import org.orekit.gnss.GnssSignal;
28 import org.orekit.gnss.MeasurementType;
29 import org.orekit.gnss.ObservationType;
30 import org.orekit.gnss.SatelliteSystem;
31
32
33
34
35
36 public abstract class AbstractSingleFrequencyCombination implements MeasurementCombination {
37
38
39 private final CombinationType type;
40
41
42 private final SatelliteSystem system;
43
44
45
46
47
48
49 protected AbstractSingleFrequencyCombination(final CombinationType type, final SatelliteSystem system) {
50 this.type = type;
51 this.system = system;
52 }
53
54
55 @Override
56 public String getName() {
57 return type.getName();
58 }
59
60
61 @Override
62 public CombinedObservationDataSet combine(final ObservationDataSet observations) {
63
64
65 final List<ObservationData> pseudoRanges = new ArrayList<>();
66 final List<ObservationData> phases = new ArrayList<>();
67
68
69 for (final ObservationData od : observations.getObservationData()) {
70 if (!Double.isNaN(od.getValue())) {
71 if (od.getObservationType().getMeasurementType() == MeasurementType.PSEUDO_RANGE) {
72 pseudoRanges.add(od);
73 } else if (od.getObservationType().getMeasurementType() == MeasurementType.CARRIER_PHASE) {
74 phases.add(od);
75 }
76 }
77 }
78
79
80 final List<CombinedObservationData> combined = new ArrayList<>();
81
82 for (final ObservationData phase : phases) {
83 for (final ObservationData pseudoRange : pseudoRanges) {
84
85 if (phase.getObservationType().getSignal(system) == pseudoRange.getObservationType().getSignal(system) &&
86 phase.getObservationType().getSignalCode() == pseudoRange.getObservationType().getSignalCode()) {
87 combined.add(combine(phase, pseudoRange));
88 }
89 }
90 }
91
92 return new CombinedObservationDataSet(observations.getSatellite().getSystem(),
93 observations.getSatellite().getPRN(),
94 observations.getDate(),
95 observations.getRcvrClkOffset(), combined);
96 }
97
98
99
100
101
102
103
104 public CombinedObservationData combine(final ObservationData phase, final ObservationData pseudoRange) {
105
106
107 final ObservationType obsType1 = phase.getObservationType();
108 final ObservationType obsType2 = pseudoRange.getObservationType();
109
110
111 final GnssSignal freq1 = obsType1.getSignal(system);
112 final GnssSignal freq2 = obsType2.getSignal(system);
113
114 if (freq1 != freq2) {
115 throw new OrekitException(OrekitMessages.INCOMPATIBLE_FREQUENCIES_FOR_COMBINATION_OF_MEASUREMENTS,
116 freq1, freq2, getName());
117 }
118
119
120 final MeasurementType measType1 = obsType1.getMeasurementType();
121 final MeasurementType measType2 = obsType2.getMeasurementType();
122
123
124 if (measType1 == measType2) {
125
126 throw new OrekitException(OrekitMessages.INVALID_MEASUREMENT_TYPES_FOR_COMBINATION_OF_MEASUREMENTS,
127 measType1, measType2, getName());
128 }
129
130
131 final double f = freq1.getFrequency();
132
133
134 final double combinedValue = getCombinedValue(phase.getValue(), pseudoRange.getValue());
135
136
137 return new CombinedObservationData(combinedValue, f,
138 CombinationType.PHASE_MINUS_CODE, MeasurementType.COMBINED_RANGE_PHASE,
139 Arrays.asList(phase, pseudoRange));
140 }
141
142
143
144
145
146
147
148 protected abstract double getCombinedValue(double phase, double pseudoRange);
149
150 }