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.Position;
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 PositionBuilder extends AbstractMeasurementBuilder<Position> {
37
38
39
40
41 private final ObservableSatellite satellite;
42
43
44
45
46
47
48
49 public PositionBuilder(final CorrelatedRandomVectorGenerator noiseSource,
50 final double sigma, final double baseWeight,
51 final ObservableSatellite satellite) {
52 super(noiseSource, sigma, baseWeight, satellite);
53 this.satellite = satellite;
54 }
55
56
57 @Override
58 public Position build(final AbsoluteDate date, final Map<ObservableSatellite, OrekitStepInterpolator> interpolators) {
59
60 final double sigma = getTheoreticalStandardDeviation()[0];
61 final double baseWeight = getBaseWeight()[0];
62 final SpacecraftState[] relevant = new SpacecraftState[] { interpolators.get(satellite).getInterpolatedState(date) };
63
64
65 final Position dummy = new Position(relevant[0].getDate(), Vector3D.NaN, sigma, baseWeight, satellite);
66 for (final EstimationModifier<Position> modifier : getModifiers()) {
67 dummy.addModifier(modifier);
68 }
69
70
71 for (final ParameterDriver driver : dummy.getParametersDrivers()) {
72 if (driver.getReferenceDate() == null) {
73 final AbsoluteDate start = getStart();
74 final AbsoluteDate end = getEnd();
75 driver.setReferenceDate(start.durationFrom(end) <= 0 ? start : end);
76 }
77 }
78
79
80 final double[] position = dummy.estimateWithoutDerivatives(relevant).getEstimatedValue();
81
82
83 final double[] noise = getNoise();
84 if (noise != null) {
85 position[0] += noise[0];
86 position[1] += noise[1];
87 position[2] += noise[2];
88 }
89
90
91 final Position measurement = new Position(relevant[0].getDate(), new Vector3D(position),
92 sigma, baseWeight, satellite);
93 for (final EstimationModifier<Position> modifier : getModifiers()) {
94 measurement.addModifier(modifier);
95 }
96 return measurement;
97
98 }
99
100 }