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