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.Map;
20
21 import org.hipparchus.analysis.differentiation.Gradient;
22 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23 import org.hipparchus.geometry.euclidean.threed.Vector3D;
24 import org.hipparchus.util.MathUtils;
25 import org.orekit.bodies.BodyShape;
26 import org.orekit.bodies.FieldGeodeticPoint;
27 import org.orekit.bodies.GeodeticPoint;
28 import org.orekit.estimation.measurements.model.TopocentricAzElModel;
29 import org.orekit.frames.Frame;
30 import org.orekit.propagation.SpacecraftState;
31 import org.orekit.signal.SignalReceptionCondition;
32 import org.orekit.signal.SignalTravelTimeModel;
33 import org.orekit.time.AbsoluteDate;
34 import org.orekit.time.FieldAbsoluteDate;
35 import org.orekit.utils.FieldPVCoordinatesProvider;
36 import org.orekit.utils.PVCoordinatesProvider;
37 import org.orekit.utils.TimeStampedFieldPVCoordinates;
38 import org.orekit.utils.TimeStampedPVCoordinates;
39
40
41
42
43
44
45
46
47
48 public class AngularAzEl extends AngularMeasurement<AngularAzEl> {
49
50
51 public static final String MEASUREMENT_TYPE = "AngularAzEl";
52
53
54
55
56 private final GroundStation station;
57
58
59
60
61
62
63
64
65
66
67
68 public AngularAzEl(final GroundStation station, final AbsoluteDate date,
69 final double[] angular, final MeasurementQuality measurementQuality,
70 final SignalTravelTimeModel signalTravelTimeModel, final ObservableSatellite satellite) {
71 super(date, angular, measurementQuality, signalTravelTimeModel, satellite);
72 this.station = station;
73 station.getParametersDrivers().forEach(this::addParameterDriver);
74 }
75
76
77
78
79
80
81
82
83
84
85 public AngularAzEl(final GroundStation station, final AbsoluteDate date,
86 final double[] angular, final double[] sigma, final double[] baseWeight,
87 final ObservableSatellite satellite) {
88 this(station, date, angular, new MeasurementQuality(sigma, baseWeight), new SignalTravelTimeModel(), satellite);
89 }
90
91
92
93
94
95 public GroundStation getStation() {
96 return station;
97 }
98
99
100 @Override
101 protected EstimatedMeasurementBase<AngularAzEl> theoreticalEvaluationWithoutDerivatives(final int iteration,
102 final int evaluation,
103 final SpacecraftState[] states) {
104
105 final AbsoluteDate receptionDate = station.getCorrectedReceptionDate(getDate());
106 final PVCoordinatesProvider receiverPVProvider = station.getPVCoordinatesProvider();
107 final SpacecraftState state = states[0];
108 final Frame frame = state.getFrame();
109 final PVCoordinatesProvider emitter = AbstractParticipant.extractPVCoordinatesProvider(state, state.getPVCoordinates());
110 final TimeStampedPVCoordinates receiverPV = receiverPVProvider.getPVCoordinates(receptionDate, frame);
111 final SignalReceptionCondition receptionCondition = new SignalReceptionCondition(receptionDate,
112 receiverPV.getPosition(), frame);
113 final AbsoluteDate emissionDate = computeEmissionDate(receptionCondition, emitter);
114
115
116 final BodyShape bodyShape = station.getBaseFrame().getParentShape();
117 final GeodeticPoint geodeticPoint = bodyShape.transform(receiverPV.getPosition(), frame, receptionDate);
118 final TopocentricAzElModel measurementModel = new TopocentricAzElModel(frame, bodyShape,
119 getSignalTravelTimeModel().getWarmedUpModel());
120 final double[] azEl = measurementModel.value(geodeticPoint, receptionDate, emitter, emissionDate);
121
122
123 final double shift = emissionDate.durationFrom(state);
124 final SpacecraftState shiftedState = state.shiftedBy(shift);
125 final EstimatedMeasurementBase<AngularAzEl> estimated = new EstimatedMeasurementBase<>(this, iteration, evaluation,
126 new SpacecraftState[] { shiftedState },
127 new TimeStampedPVCoordinates[] { shiftedState.getPVCoordinates(), receiverPV });
128 estimated.setEstimatedValue(wrapFirstAngle(azEl[0]), azEl[1]);
129 return estimated;
130 }
131
132
133 @Override
134 protected EstimatedMeasurement<AngularAzEl> theoreticalEvaluation(final int iteration, final int evaluation,
135 final SpacecraftState[] states) {
136
137
138
139
140
141
142
143
144
145
146 final Map<String, Integer> paramIndices = getParameterIndices(states);
147 final int nbParams = 6 * states.length + paramIndices.size();
148 final SpacecraftState state = states[0];
149 final TimeStampedFieldPVCoordinates<Gradient> pva = AbstractMeasurement.getCoordinates(state, 0, nbParams);
150
151
152 final FieldPVCoordinatesProvider<Gradient> receiverPVProvider = station.getFieldPVCoordinatesProvider(nbParams,
153 paramIndices);
154 final Frame frame = state.getFrame();
155 final FieldAbsoluteDate<Gradient> receptionDate = station.getCorrectedReceptionDateField(getDate(), nbParams, paramIndices);
156 final FieldVector3D<Gradient> receiverPosition = receiverPVProvider.getPosition(receptionDate, frame);
157 final FieldPVCoordinatesProvider<Gradient> emitter = AbstractParticipant.extractFieldPVCoordinatesProvider(state, pva);
158 final FieldAbsoluteDate<Gradient> emissionDate = computeEmissionDateField(frame, receiverPosition, receptionDate, emitter);
159
160
161 final BodyShape bodyShape = station.getBaseFrame().getParentShape();
162 final FieldGeodeticPoint<Gradient> geodeticPoint = bodyShape.transform(receiverPosition, frame, receptionDate);
163 final TopocentricAzElModel measurementModel = new TopocentricAzElModel(frame, bodyShape,
164 getSignalTravelTimeModel().getWarmedUpModel());
165 final Gradient[] azEl = measurementModel.value(geodeticPoint, receptionDate, emitter, emissionDate);
166
167
168 final double shift = emissionDate.toAbsoluteDate().durationFrom(state);
169 final SpacecraftState shiftedState = state.shiftedBy(shift);
170 final EstimatedMeasurement<AngularAzEl> estimated = new EstimatedMeasurement<>(this, iteration, evaluation,
171 new SpacecraftState[] { shiftedState },
172 new TimeStampedPVCoordinates[] {shiftedState.getPVCoordinates(),
173 getStation().getPVCoordinatesProvider().getPVCoordinates(receptionDate.toAbsoluteDate(), frame) });
174 fillEstimatedMeasurement(azEl[0], azEl[1], paramIndices, estimated);
175 return estimated;
176 }
177
178
179
180
181
182 public Vector3D getObservedLineOfSight(final Frame outputFrame) {
183 return station.getBaseFrame().getStaticTransformTo(outputFrame, getDate())
184 .transformVector(new Vector3D(MathUtils.SEMI_PI - getObservedValue()[0], getObservedValue()[1]));
185 }
186
187 }