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.geometry.euclidean.threed.Vector3D;
20 import org.hipparchus.random.CorrelatedRandomVectorGenerator;
21 import org.orekit.estimation.measurements.EstimationModifier;
22 import org.orekit.estimation.measurements.ObservableSatellite;
23 import org.orekit.estimation.measurements.PV;
24 import org.orekit.propagation.SpacecraftState;
25 import org.orekit.time.AbsoluteDate;
26 import org.orekit.utils.ParameterDriver;
27
28
29
30
31
32
33 public class PVBuilder extends AbstractMeasurementBuilder<PV> {
34
35
36
37
38
39
40
41
42 public PVBuilder(final CorrelatedRandomVectorGenerator noiseSource,
43 final double sigmaPosition, final double sigmaVelocity,
44 final double baseWeight, final ObservableSatellite satellite) {
45 super(noiseSource,
46 new double[] {
47 sigmaPosition, sigmaVelocity
48 }, new double[] {
49 baseWeight
50 }, satellite);
51 }
52
53
54 @Override
55 public PV build(final SpacecraftState[] states) {
56
57 final ObservableSatellite satellite = getSatellites()[0];
58 final double[] sigma = getTheoreticalStandardDeviation();
59 final double baseWeight = getBaseWeight()[0];
60 final SpacecraftState[] relevant = new SpacecraftState[] { states[satellite.getPropagatorIndex()] };
61
62
63 final PV dummy = new PV(relevant[0].getDate(), Vector3D.NaN, Vector3D.NaN,
64 sigma[0], sigma[1], baseWeight, satellite);
65 for (final EstimationModifier<PV> modifier : getModifiers()) {
66 dummy.addModifier(modifier);
67 }
68
69
70 for (final ParameterDriver driver : dummy.getParametersDrivers()) {
71 if (driver.getReferenceDate() == null) {
72 final AbsoluteDate start = getStart();
73 final AbsoluteDate end = getEnd();
74 driver.setReferenceDate(start.durationFrom(end) <= 0 ? start : end);
75 }
76 }
77
78
79 final double[] pv = dummy.estimate(0, 0, relevant).getEstimatedValue();
80
81
82 final double[] noise = getNoise();
83 if (noise != null) {
84 pv[0] += noise[0];
85 pv[1] += noise[1];
86 pv[2] += noise[2];
87 pv[3] += noise[3];
88 pv[4] += noise[4];
89 pv[5] += noise[5];
90 }
91
92
93 final PV measurement = new PV(relevant[0].getDate(),
94 new Vector3D(pv[0], pv[1], pv[2]), new Vector3D(pv[3], pv[4], pv[5]),
95 sigma[0], sigma[1], baseWeight, satellite);
96 for (final EstimationModifier<PV> modifier : getModifiers()) {
97 measurement.addModifier(modifier);
98 }
99 return measurement;
100
101 }
102
103 }