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