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