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