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.hipparchus.Field;
23 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.orekit.attitudes.FrameAlignedProvider;
26 import org.orekit.estimation.measurements.EstimatedMeasurement;
27 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
28 import org.orekit.estimation.measurements.EstimationModifier;
29 import org.orekit.estimation.measurements.GroundStation;
30 import org.orekit.estimation.measurements.TDOA;
31 import org.orekit.models.earth.troposphere.TroposphericModel;
32 import org.orekit.propagation.FieldSpacecraftState;
33 import org.orekit.propagation.SpacecraftState;
34 import org.orekit.utils.Constants;
35 import org.orekit.utils.FieldTrackingCoordinates;
36 import org.orekit.utils.ParameterDriver;
37 import org.orekit.utils.TrackingCoordinates;
38
39
40
41
42
43
44
45
46
47
48
49 public class TDOATroposphericDelayModifier implements EstimationModifier<TDOA> {
50
51
52 private final TroposphericModel tropoModel;
53
54
55
56
57
58
59 @Deprecated
60 public TDOATroposphericDelayModifier(final org.orekit.models.earth.troposphere.DiscreteTroposphericModel model) {
61 this(new org.orekit.models.earth.troposphere.TroposphericModelAdapter(model));
62 }
63
64
65
66
67
68
69 public TDOATroposphericDelayModifier(final TroposphericModel model) {
70 tropoModel = model;
71 }
72
73
74
75
76
77
78 private double timeErrorTroposphericModel(final GroundStation station, final SpacecraftState state) {
79 final Vector3D position = state.getPosition();
80
81
82 final TrackingCoordinates trackingCoordinates =
83 station.getBaseFrame().getTrackingCoordinates(position, state.getFrame(), state.getDate());
84
85
86 if (trackingCoordinates.getElevation() > 0) {
87
88 final double delay = tropoModel.pathDelay(trackingCoordinates,
89 station.getOffsetGeodeticPoint(state.getDate()),
90 station.getPressureTemperatureHumidity(state.getDate()),
91 tropoModel.getParameters(state.getDate()), state.getDate()).
92 getDelay();
93
94 return delay / Constants.SPEED_OF_LIGHT;
95 }
96
97 return 0;
98 }
99
100
101
102
103
104
105
106
107 private <T extends CalculusFieldElement<T>> T timeErrorTroposphericModel(final GroundStation station,
108 final FieldSpacecraftState<T> state,
109 final T[] parameters) {
110
111 final Field<T> field = state.getDate().getField();
112 final T zero = field.getZero();
113
114
115 final FieldVector3D<T> pos = state.getPosition();
116 final FieldTrackingCoordinates<T> trackingCoordinates =
117 station.getBaseFrame().getTrackingCoordinates(pos, state.getFrame(), state.getDate());
118
119
120 if (trackingCoordinates.getElevation().getReal() > 0) {
121
122 final T delay = tropoModel.pathDelay(trackingCoordinates,
123 station.getOffsetGeodeticPoint(state.getDate()),
124 station.getPressureTemperatureHumidity(state.getDate()),
125 parameters, state.getDate()).
126 getDelay();
127
128 return delay.divide(Constants.SPEED_OF_LIGHT);
129 }
130
131 return zero;
132 }
133
134
135 @Override
136 public List<ParameterDriver> getParametersDrivers() {
137 return tropoModel.getParametersDrivers();
138 }
139
140
141 @Override
142 public void modifyWithoutDerivatives(final EstimatedMeasurementBase<TDOA> estimated) {
143
144 final TDOA measurement = estimated.getObservedMeasurement();
145 final GroundStation primeStation = measurement.getPrimeStation();
146 final GroundStation secondStation = measurement.getSecondStation();
147
148 TDOAModifierUtil.modifyWithoutDerivatives(estimated, primeStation, secondStation,
149 this::timeErrorTroposphericModel, this);
150
151 }
152
153
154 @Override
155 public void modify(final EstimatedMeasurement<TDOA> estimated) {
156
157 final TDOA measurement = estimated.getObservedMeasurement();
158 final GroundStation primeStation = measurement.getPrimeStation();
159 final GroundStation secondStation = measurement.getSecondStation();
160 final SpacecraftState state = estimated.getStates()[0];
161
162 TDOAModifierUtil.modify(estimated, tropoModel,
163 new ModifierGradientConverter(state, 6, new FrameAlignedProvider(state.getFrame())),
164 primeStation, secondStation,
165 this::timeErrorTroposphericModel,
166 this::timeErrorTroposphericModel,
167 this);
168
169 }
170
171 }