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