1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.modifiers;
18
19 import java.util.Arrays;
20
21 import org.hipparchus.analysis.differentiation.Gradient;
22 import org.orekit.estimation.measurements.EstimatedMeasurement;
23 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
24 import org.orekit.estimation.measurements.EstimationModifier;
25 import org.orekit.estimation.measurements.GroundStation;
26 import org.orekit.estimation.measurements.ObservedMeasurement;
27 import org.orekit.propagation.FieldSpacecraftState;
28 import org.orekit.propagation.SpacecraftState;
29 import org.orekit.propagation.integration.AbstractGradientConverter;
30 import org.orekit.utils.Differentiation;
31 import org.orekit.utils.ParameterDriver;
32 import org.orekit.utils.ParameterDriversProvider;
33 import org.orekit.utils.TimeSpanMap.Span;
34
35
36
37
38
39 class BistaticModifierUtil {
40
41
42 private BistaticModifierUtil() {
43
44 }
45
46
47
48
49
50
51
52
53
54
55 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurementBase<T> estimated,
56 final GroundStation emitter, final GroundStation receiver,
57 final ParametricModelEffect modelEffect,
58 final EstimationModifier<T> modifier) {
59
60
61
62 final SpacecraftState state = estimated.getStates()[0];
63 final double[] newValue = estimated.getEstimatedValue().clone();
64 newValue[0] += modelEffect.evaluate(emitter, state);
65 newValue[0] += modelEffect.evaluate(receiver, state);
66 estimated.modifyEstimatedValue(modifier, newValue);
67
68 }
69
70
71
72
73
74
75
76
77
78
79
80
81
82 public static <T extends ObservedMeasurement<T>> void modify(final EstimatedMeasurement<T> estimated,
83 final ParameterDriversProvider parametricModel,
84 final AbstractGradientConverter converter,
85 final GroundStation emitter, final GroundStation receiver,
86 final ParametricModelEffect modelEffect,
87 final ParametricModelEffectGradient modelEffectGradient,
88 final EstimationModifier<T> modifier) {
89
90 final SpacecraftState state = estimated.getStates()[0];
91
92
93 final FieldSpacecraftState<Gradient> gState = converter.getState(parametricModel);
94 final Gradient[] gParameters = converter.getParameters(gState, parametricModel);
95
96 final Gradient delayUp = modelEffectGradient.evaluate(emitter, gState, gParameters);
97 final double[] derivativesUp = delayUp.getGradient();
98
99 final Gradient delayDown = modelEffectGradient.evaluate(receiver, gState, gParameters);
100 final double[] derivativesDown = delayDown.getGradient();
101
102
103 final double[][] stateDerivatives = estimated.getStateDerivatives(0);
104 for (int jcol = 0; jcol < stateDerivatives[0].length; ++jcol) {
105 stateDerivatives[0][jcol] += derivativesUp[jcol];
106 stateDerivatives[0][jcol] += derivativesDown[jcol];
107 }
108 estimated.setStateDerivatives(0, stateDerivatives);
109
110 int index = 0;
111 for (final ParameterDriver driver : parametricModel.getParametersDrivers()) {
112 if (driver.isSelected()) {
113 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
114
115
116 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
117 parameterDerivative += derivativesUp[index + converter.getFreeStateParameters()];
118 parameterDerivative += derivativesDown[index + converter.getFreeStateParameters()];
119 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
120 index++;
121 }
122 }
123
124 }
125
126 for (final ParameterDriver driver : Arrays.asList(emitter.getEastOffsetDriver(),
127 emitter.getNorthOffsetDriver(),
128 emitter.getZenithOffsetDriver())) {
129 if (driver.isSelected()) {
130 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
131
132
133 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
134 parameterDerivative += Differentiation.differentiate((d, t) -> modelEffect.evaluate(emitter, state),
135 3, 10.0 * driver.getScale()).value(driver, state.getDate());
136 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
137 }
138 }
139 }
140
141 for (final ParameterDriver driver : Arrays.asList(receiver.getClockOffsetDriver(),
142 receiver.getEastOffsetDriver(),
143 receiver.getNorthOffsetDriver(),
144 receiver.getZenithOffsetDriver())) {
145 if (driver.isSelected()) {
146 for (Span<String> span = driver.getNamesSpanMap().getFirstSpan(); span != null; span = span.next()) {
147
148
149 double parameterDerivative = estimated.getParameterDerivatives(driver, span.getStart())[0];
150 parameterDerivative += Differentiation.differentiate((d, t) -> modelEffect.evaluate(receiver, state),
151 3, 10.0 * driver.getScale()).value(driver, state.getDate());
152 estimated.setParameterDerivatives(driver, span.getStart(), parameterDerivative);
153 }
154 }
155 }
156
157
158 modify(estimated, emitter, receiver, modelEffect, modifier);
159
160 }
161
162 }