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.InterSatellitesRange;
22 import org.orekit.estimation.measurements.ObservableSatellite;
23 import org.orekit.propagation.SpacecraftState;
24 import org.orekit.time.AbsoluteDate;
25 import org.orekit.utils.ParameterDriver;
26
27
28
29
30
31
32 public class InterSatellitesRangeBuilder extends AbstractMeasurementBuilder<InterSatellitesRange> {
33
34
35 private final boolean twoway;
36
37
38
39
40
41
42
43
44
45
46 public InterSatellitesRangeBuilder(final CorrelatedRandomVectorGenerator noiseSource,
47 final ObservableSatellite local, final ObservableSatellite remote,
48 final boolean twoWay, final double sigma, final double baseWeight) {
49 super(noiseSource, sigma, baseWeight, local, remote);
50 this.twoway = twoWay;
51 }
52
53
54 @Override
55 public InterSatellitesRange build(final SpacecraftState[] states) {
56
57 final ObservableSatellite[] satellites = getSatellites();
58 final double sigma = getTheoreticalStandardDeviation()[0];
59 final double baseWeight = getBaseWeight()[0];
60 final SpacecraftState[] relevant = new SpacecraftState[] {
61 states[satellites[0].getPropagatorIndex()],
62 states[satellites[1].getPropagatorIndex()]
63 };
64 final SpacecraftState state = states[satellites[0].getPropagatorIndex()];
65
66
67 final InterSatellitesRange dummy = new InterSatellitesRange(satellites[0], satellites[1], twoway, state.getDate(),
68 Double.NaN, sigma, baseWeight);
69 for (final EstimationModifier<InterSatellitesRange> 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 range = dummy.estimate(0, 0, relevant).getEstimatedValue()[0];
84
85
86 final double[] noise = getNoise();
87 if (noise != null) {
88 range += noise[0];
89 }
90
91
92 final InterSatellitesRange measurement = new InterSatellitesRange(satellites[0], satellites[1], twoway, state.getDate(),
93 range, sigma, baseWeight);
94 for (final EstimationModifier<InterSatellitesRange> modifier : getModifiers()) {
95 measurement.addModifier(modifier);
96 }
97 return measurement;
98
99 }
100
101 }