1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.generation;
18
19 import java.util.Map;
20 import java.util.function.ToDoubleFunction;
21
22 import org.hipparchus.random.CorrelatedRandomVectorGenerator;
23 import org.orekit.estimation.measurements.EstimationModifier;
24 import org.orekit.estimation.measurements.ObservableSatellite;
25 import org.orekit.estimation.measurements.gnss.OneWayGNSSRange;
26 import org.orekit.propagation.SpacecraftState;
27 import org.orekit.propagation.sampling.OrekitStepInterpolator;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.utils.ParameterDriver;
30
31
32
33
34
35
36 public class OneWayGNSSRangeBuilder extends AbstractMeasurementBuilder<OneWayGNSSRange> {
37
38
39 private final ObservableSatellite local;
40
41
42 private final ObservableSatellite remote;
43
44
45 private ToDoubleFunction<AbsoluteDate> remoteClockModel;
46
47
48
49
50
51
52
53
54
55 public OneWayGNSSRangeBuilder(final CorrelatedRandomVectorGenerator noiseSource,
56 final ObservableSatellite local, final ObservableSatellite remote,
57 final ToDoubleFunction<AbsoluteDate> remoteClockModel,
58 final double sigma, final double baseWeight) {
59 super(noiseSource, sigma, baseWeight, local, remote);
60 this.local = local;
61 this.remote = remote;
62 this.remoteClockModel = remoteClockModel;
63 }
64
65
66 @Override
67 public OneWayGNSSRange build(final AbsoluteDate date, final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
68
69 final double sigma = getTheoreticalStandardDeviation()[0];
70 final double baseWeight = getBaseWeight()[0];
71 final SpacecraftState[] relevant = new SpacecraftState[] {
72 interpolators.get(local).getInterpolatedState(date),
73 interpolators.get(remote).getInterpolatedState(date)
74 };
75 final double offset = remoteClockModel.applyAsDouble(date);
76
77
78 final OneWayGNSSRange dummy = new OneWayGNSSRange(interpolators.get(remote), offset, date,
79 Double.NaN, sigma, baseWeight, local);
80 for (final EstimationModifier<OneWayGNSSRange> modifier : getModifiers()) {
81 dummy.addModifier(modifier);
82 }
83
84
85 for (final ParameterDriver driver : dummy.getParametersDrivers()) {
86 if (driver.getReferenceDate() == null) {
87 final AbsoluteDate start = getStart();
88 final AbsoluteDate end = getEnd();
89 driver.setReferenceDate(start.durationFrom(end) <= 0 ? start : end);
90 }
91 }
92
93
94 double range = dummy.estimateWithoutDerivatives(relevant).getEstimatedValue()[0];
95
96
97 final double[] noise = getNoise();
98 if (noise != null) {
99 range += noise[0];
100 }
101
102
103 final OneWayGNSSRange measurement = new OneWayGNSSRange(interpolators.get(remote), offset, date,
104 range, sigma, baseWeight, local);
105 for (final EstimationModifier<OneWayGNSSRange> modifier : getModifiers()) {
106 measurement.addModifier(modifier);
107 }
108 return measurement;
109
110 }
111
112 }