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.List;
20
21 import org.hipparchus.CalculusFieldElement;
22 import org.orekit.attitudes.FrameAlignedProvider;
23 import org.orekit.estimation.measurements.EstimatedMeasurement;
24 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
25 import org.orekit.estimation.measurements.EstimationModifier;
26 import org.orekit.estimation.measurements.GroundStation;
27 import org.orekit.estimation.measurements.TDOA;
28 import org.orekit.frames.TopocentricFrame;
29 import org.orekit.models.earth.ionosphere.IonosphericModel;
30 import org.orekit.propagation.FieldSpacecraftState;
31 import org.orekit.propagation.SpacecraftState;
32 import org.orekit.utils.Constants;
33 import org.orekit.utils.ParameterDriver;
34
35
36
37
38
39
40
41
42
43
44
45 public class TDOAIonosphericDelayModifier implements EstimationModifier<TDOA> {
46
47
48 private final IonosphericModel ionoModel;
49
50
51 private final double frequency;
52
53
54
55
56
57
58 public TDOAIonosphericDelayModifier(final IonosphericModel model,
59 final double freq) {
60 ionoModel = model;
61 frequency = freq;
62 }
63
64
65 @Override
66 public String getEffectName() {
67 return "ionosphere";
68 }
69
70
71
72
73
74
75 private double timeErrorIonosphericModel(final GroundStation station,
76 final SpacecraftState state) {
77
78 final TopocentricFrame baseFrame = station.getBaseFrame();
79
80 final double delay = ionoModel.pathDelay(state, baseFrame, frequency, ionoModel.getParameters(state.getDate()));
81
82 return delay / Constants.SPEED_OF_LIGHT;
83 }
84
85
86
87
88
89
90
91
92 private <T extends CalculusFieldElement<T>> T timeErrorIonosphericModel(final GroundStation station,
93 final FieldSpacecraftState<T> state,
94 final T[] parameters) {
95
96 final TopocentricFrame baseFrame = station.getBaseFrame();
97
98 final T delay = ionoModel.pathDelay(state, baseFrame, frequency, parameters);
99
100 return delay.divide(Constants.SPEED_OF_LIGHT);
101 }
102
103
104 @Override
105 public List<ParameterDriver> getParametersDrivers() {
106 return ionoModel.getParametersDrivers();
107 }
108
109 @Override
110 public void modifyWithoutDerivatives(final EstimatedMeasurementBase<TDOA> estimated) {
111
112 final TDOA measurement = estimated.getObservedMeasurement();
113 final GroundStation primeStation = measurement.getPrimeStation();
114 final GroundStation secondStation = measurement.getSecondStation();
115
116 TDOAModifierUtil.modifyWithoutDerivatives(estimated, primeStation, secondStation,
117 this::timeErrorIonosphericModel,
118 this);
119
120 }
121
122 @Override
123 public void modify(final EstimatedMeasurement<TDOA> estimated) {
124
125 final TDOA measurement = estimated.getObservedMeasurement();
126 final GroundStation primeStation = measurement.getPrimeStation();
127 final GroundStation secondStation = measurement.getSecondStation();
128 final SpacecraftState state = estimated.getStates()[0];
129
130 TDOAModifierUtil.modify(estimated, ionoModel,
131 new ModifierGradientConverter(state, 6, new FrameAlignedProvider(state.getFrame())),
132 primeStation, secondStation,
133 this::timeErrorIonosphericModel,
134 this::timeErrorIonosphericModel,
135 this);
136
137 }
138
139 }