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