1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.hipparchus.analysis.differentiation.Gradient;
25 import org.hipparchus.exception.LocalizedCoreFormats;
26 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
27 import org.hipparchus.geometry.euclidean.threed.Vector3D;
28 import org.orekit.errors.OrekitException;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.utils.ParameterDriver;
32 import org.orekit.utils.TimeStampedFieldPVCoordinates;
33
34
35
36
37
38
39 public abstract class AbstractMeasurement<T extends ObservedMeasurement<T>> implements ObservedMeasurement<T> {
40
41
42 private final List<ParameterDriver> supportedParameters;
43
44
45
46
47 private final List<ObservableSatellite> satellites;
48
49
50 private final AbsoluteDate date;
51
52
53 private double[] observed;
54
55
56 private final MeasurementQuality measurementQuality;
57
58
59 private final List<EstimationModifier<T>> modifiers;
60
61
62 private boolean enabled;
63
64
65
66
67
68
69
70
71
72
73
74
75 protected AbstractMeasurement(final AbsoluteDate date, final double observed,
76 final double sigma, final double baseWeight,
77 final List<ObservableSatellite> satellites) {
78 this(date, new double[] {observed}, new double[] {sigma}, new double[] {baseWeight}, satellites);
79 }
80
81
82
83
84
85
86
87
88
89
90
91
92 protected AbstractMeasurement(final AbsoluteDate date, final double[] observed,
93 final double[] sigma, final double[] baseWeight,
94 final List<ObservableSatellite> satellites) {
95 this(date, observed, new MeasurementQuality(sigma, baseWeight), satellites);
96 }
97
98
99
100
101
102
103
104
105
106
107
108 protected AbstractMeasurement(final AbsoluteDate date, final double[] observed,
109 final MeasurementQuality measurementQuality,
110 final List<ObservableSatellite> satellites) {
111 if (measurementQuality.getDimension() != observed.length) {
112 throw new OrekitException(LocalizedCoreFormats.DIMENSIONS_MISMATCH, measurementQuality.getDimension(), observed.length);
113 }
114 this.supportedParameters = new ArrayList<>();
115
116 this.date = date;
117 this.observed = observed.clone();
118 this.measurementQuality = measurementQuality;
119 this.satellites = satellites;
120
121
122 satellites.forEach(s -> addParametersDrivers(s.getParametersDrivers()));
123
124 this.modifiers = new ArrayList<>();
125 setEnabled(true);
126 }
127
128
129 @Override
130 public void setObservedValue(final double[] newObserved) {
131 this.observed = newObserved.clone();
132 }
133
134
135
136
137
138 protected void addParameterDriver(final ParameterDriver driver) {
139 supportedParameters.add(driver);
140 }
141
142
143
144
145
146 protected void addParametersDrivers(final List<ParameterDriver> drivers) {
147 for (final ParameterDriver driver : drivers) {
148 addParameterDriver(driver);
149 }
150 }
151
152
153 @Override
154 public List<ParameterDriver> getParametersDrivers() {
155 return Collections.unmodifiableList(supportedParameters);
156 }
157
158
159 @Override
160 public final void setEnabled(final boolean enabled) {
161 this.enabled = enabled;
162 }
163
164
165 @Override
166 public boolean isEnabled() {
167 return enabled;
168 }
169
170
171 @Override
172 public MeasurementQuality getMeasurementQuality() {
173 return measurementQuality;
174 }
175
176
177 @Override
178 public List<ObservableSatellite> getSatellites() {
179 return satellites;
180 }
181
182
183
184
185
186
187
188
189
190
191
192
193
194 protected EstimatedMeasurementBase<T> theoreticalEvaluationWithoutDerivatives(final int iteration,
195 final int evaluation,
196 final SpacecraftState[] states) {
197 final EstimatedMeasurement<T> estimatedMeasurement = theoreticalEvaluation(iteration, evaluation, states);
198 final EstimatedMeasurementBase<T> estimatedMeasurementBase = new EstimatedMeasurementBase<>(estimatedMeasurement.getObservedMeasurement(),
199 iteration, evaluation, states, estimatedMeasurement.getParticipants());
200 estimatedMeasurementBase.setEstimatedValue(estimatedMeasurement.getEstimatedValue());
201 estimatedMeasurementBase.setStatus(estimatedMeasurement.getStatus());
202 return estimatedMeasurementBase;
203 }
204
205
206
207
208
209
210
211
212
213
214
215 protected abstract EstimatedMeasurement<T> theoreticalEvaluation(int iteration, int evaluation, SpacecraftState[] states);
216
217
218 @Override
219 public EstimatedMeasurementBase<T> estimateWithoutDerivatives(final int iteration, final int evaluation, final SpacecraftState[] states) {
220
221
222 final EstimatedMeasurementBase<T> estimation = theoreticalEvaluationWithoutDerivatives(iteration, evaluation, states);
223
224
225 for (final EstimationModifier<T> modifier : modifiers) {
226 modifier.modifyWithoutDerivatives(estimation);
227 }
228
229 return estimation;
230
231 }
232
233
234 @Override
235 public EstimatedMeasurement<T> estimate(final int iteration, final int evaluation, final SpacecraftState[] states) {
236
237
238 final EstimatedMeasurement<T> estimation = theoreticalEvaluation(iteration, evaluation, states);
239
240
241 for (final EstimationModifier<T> modifier : modifiers) {
242 modifier.modify(estimation);
243 }
244
245 return estimation;
246
247 }
248
249
250 @Override
251 public AbsoluteDate getDate() {
252 return date;
253 }
254
255
256 @Override
257 public double[] getObservedValue() {
258 return observed.clone();
259 }
260
261
262 @Override
263 public void addModifier(final EstimationModifier<T> modifier) {
264
265
266 supportedParameters.addAll(modifier.getParametersDrivers());
267
268 modifiers.add(modifier);
269
270 }
271
272
273 @Override
274 public List<EstimationModifier<T>> getModifiers() {
275 return Collections.unmodifiableList(modifiers);
276 }
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292 public static TimeStampedFieldPVCoordinates<Gradient> getCoordinates(final SpacecraftState state,
293 final int firstDerivative,
294 final int freeParameters) {
295
296
297
298 final Vector3D p = state.getPosition();
299 final FieldVector3D<Gradient> pDS =
300 new FieldVector3D<>(Gradient.variable(freeParameters, firstDerivative, p.getX()),
301 Gradient.variable(freeParameters, firstDerivative + 1, p.getY()),
302 Gradient.variable(freeParameters, firstDerivative + 2, p.getZ()));
303
304
305
306 final Vector3D v = state.getVelocity();
307 final FieldVector3D<Gradient> vDS =
308 new FieldVector3D<>(Gradient.variable(freeParameters, firstDerivative + 3, v.getX()),
309 Gradient.variable(freeParameters, firstDerivative + 4, v.getY()),
310 Gradient.variable(freeParameters, firstDerivative + 5, v.getZ()));
311
312
313
314 final Vector3D a = state.getPVCoordinates().getAcceleration();
315 final FieldVector3D<Gradient> aDS =
316 new FieldVector3D<>(Gradient.constant(freeParameters, a.getX()),
317 Gradient.constant(freeParameters, a.getY()),
318 Gradient.constant(freeParameters, a.getZ()));
319
320 return new TimeStampedFieldPVCoordinates<>(state.getDate(), pDS, vDS, aDS);
321
322 }
323
324
325
326
327
328
329
330 protected Map<String, Integer> getParameterIndices(final SpacecraftState[] states) {
331 return Observer.getParameterIndices(states, getParametersDrivers());
332 }
333
334 }