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.geometry.euclidean.threed.Vector3D;
22 import org.hipparchus.random.CorrelatedRandomVectorGenerator;
23 import org.orekit.estimation.measurements.EstimationModifier;
24 import org.orekit.estimation.measurements.ObservableSatellite;
25 import org.orekit.estimation.measurements.PV;
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 PVBuilder extends AbstractMeasurementBuilder<PV> {
37
38
39
40
41 private final ObservableSatellite satellite;
42
43
44
45
46
47
48
49
50 public PVBuilder(final CorrelatedRandomVectorGenerator noiseSource,
51 final double sigmaPosition, final double sigmaVelocity,
52 final double baseWeight, final ObservableSatellite satellite) {
53 super(noiseSource,
54 new double[] {
55 sigmaPosition, sigmaVelocity
56 }, new double[] {
57 baseWeight
58 }, satellite);
59 this.satellite = satellite;
60 }
61
62
63 @Override
64 public PV build(final AbsoluteDate date, final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
65
66 final double[] sigma = getTheoreticalStandardDeviation();
67 final double baseWeight = getBaseWeight()[0];
68 final SpacecraftState[] relevant = new SpacecraftState[] { interpolators.get(satellite).getInterpolatedState(date) };
69
70
71 final PV dummy = new PV(relevant[0].getDate(), Vector3D.NaN, Vector3D.NaN,
72 sigma[0], sigma[1], baseWeight, satellite);
73 for (final EstimationModifier<PV> 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 final double[] pv = dummy.estimateWithoutDerivatives(relevant).getEstimatedValue();
88
89
90 final double[] noise = getNoise();
91 if (noise != null) {
92 pv[0] += noise[0];
93 pv[1] += noise[1];
94 pv[2] += noise[2];
95 pv[3] += noise[3];
96 pv[4] += noise[4];
97 pv[5] += noise[5];
98 }
99
100
101 final PV measurement = new PV(relevant[0].getDate(),
102 new Vector3D(pv[0], pv[1], pv[2]), new Vector3D(pv[3], pv[4], pv[5]),
103 sigma[0], sigma[1], baseWeight, satellite);
104 for (final EstimationModifier<PV> modifier : getModifiers()) {
105 measurement.addModifier(modifier);
106 }
107 return measurement;
108
109 }
110
111 }