1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.estimation.measurements;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.hipparchus.Field;
25 import org.hipparchus.analysis.differentiation.Gradient;
26 import org.hipparchus.util.FastMath;
27 import org.orekit.orbits.CartesianOrbit;
28 import org.orekit.orbits.FieldCartesianOrbit;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.clocks.QuadraticClockModel;
32 import org.orekit.utils.AbsolutePVCoordinates;
33 import org.orekit.utils.FieldAbsolutePVCoordinates;
34 import org.orekit.utils.FieldPVCoordinatesProvider;
35 import org.orekit.utils.PVCoordinatesProvider;
36 import org.orekit.utils.ParameterDriver;
37 import org.orekit.utils.TimeStampedFieldPVCoordinates;
38 import org.orekit.utils.TimeStampedPVCoordinates;
39
40
41
42
43
44
45
46
47 public abstract class AbstractParticipant implements MeasurementParticipant {
48
49
50 private static final String CLOCK_STRING = "-clock";
51
52
53
54
55
56
57
58 private static final double CLOCK_OFFSET_SCALE = FastMath.scalb(1.0, -10);
59
60
61 private final QuadraticClockModel quadraticClockModel;
62
63
64 private final List<ParameterDriver> parameterDrivers = new ArrayList<>();
65
66
67 private final String name;
68
69
70
71
72 protected AbstractParticipant(final String name) {
73 this(name, createEmptyQuadraticClock(name));
74 }
75
76
77
78
79
80 protected AbstractParticipant(final String name, final QuadraticClockModel quadraticClock) {
81
82
83 this.name = name;
84 this.quadraticClockModel = quadraticClock;
85
86
87 parameterDrivers.add(quadraticClockModel.getClockBiasDriver());
88 parameterDrivers.add(quadraticClockModel.getClockDriftDriver());
89 parameterDrivers.add(quadraticClockModel.getClockAccelerationDriver());
90 }
91
92
93
94
95 public final String getName() {
96 return name;
97 }
98
99
100
101
102
103 protected static QuadraticClockModel createEmptyQuadraticClock(final String name) {
104 return new QuadraticClockModel(new ParameterDriver(name + CLOCK_STRING + BIAS_SUFFIX,
105 0.0, CLOCK_OFFSET_SCALE,
106 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY),
107 new ParameterDriver(name + CLOCK_STRING + DRIFT_SUFFIX,
108 0.0, CLOCK_OFFSET_SCALE,
109 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY),
110 new ParameterDriver(name + CLOCK_STRING + ACCELERATION_SUFFIX,
111 0.0, CLOCK_OFFSET_SCALE,
112 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
113 }
114
115
116
117
118 public final QuadraticClockModel getQuadraticClockModel() {
119 return quadraticClockModel;
120 }
121
122
123
124
125
126
127
128 public List<ParameterDriver> getParametersDrivers() {
129 return Collections.unmodifiableList(parameterDrivers);
130 }
131
132
133
134
135
136 protected final void addParameterDriver(final ParameterDriver parameterDriver) {
137 parameterDrivers.add(parameterDriver);
138 }
139
140
141
142
143
144
145
146 public static PVCoordinatesProvider extractPVCoordinatesProvider(final SpacecraftState templateState,
147 final TimeStampedPVCoordinates pvCoordinates) {
148 if (templateState.isOrbitDefined()) {
149 final CartesianOrbit cartesianOrbit = new CartesianOrbit(pvCoordinates, templateState.getFrame(),
150 templateState.getOrbit().getMu());
151 return templateState.getOrbit().getType().convertType(cartesianOrbit);
152 } else {
153 return new AbsolutePVCoordinates(templateState.getFrame(), pvCoordinates);
154 }
155 }
156
157
158
159
160
161
162
163
164 public static FieldPVCoordinatesProvider<Gradient> extractFieldPVCoordinatesProvider(final SpacecraftState templateState,
165 final TimeStampedFieldPVCoordinates<Gradient> pvCoordinates) {
166 final Field<Gradient> field = pvCoordinates.getDate().getField();
167 if (templateState.isOrbitDefined()) {
168 final FieldCartesianOrbit<Gradient> cartesianOrbit = new FieldCartesianOrbit<>(pvCoordinates, templateState.getFrame(),
169 field.getZero().newInstance(templateState.getOrbit().getMu()));
170 return templateState.getOrbit().getType().convertType(cartesianOrbit);
171 } else {
172 return new FieldAbsolutePVCoordinates<>(templateState.getFrame(), pvCoordinates);
173 }
174 }
175 }