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