1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.estimation.iod;
19
20 import java.util.List;
21
22 import org.hipparchus.geometry.euclidean.threed.Vector3D;
23 import org.hipparchus.util.FastMath;
24 import org.junit.jupiter.api.Assertions;
25 import org.junit.jupiter.api.Test;
26 import org.orekit.bodies.GeodeticPoint;
27 import org.orekit.bodies.OneAxisEllipsoid;
28 import org.orekit.estimation.Context;
29 import org.orekit.estimation.EstimationTestUtils;
30 import org.orekit.estimation.measurements.AngularAzEl;
31 import org.orekit.estimation.measurements.AngularAzElMeasurementCreator;
32 import org.orekit.estimation.measurements.AngularRaDec;
33 import org.orekit.estimation.measurements.AngularRaDecMeasurementCreator;
34 import org.orekit.estimation.measurements.GroundStation;
35 import org.orekit.estimation.measurements.ObservableSatellite;
36 import org.orekit.estimation.measurements.ObservedMeasurement;
37 import org.orekit.estimation.measurements.PVMeasurementCreator;
38 import org.orekit.frames.Frame;
39 import org.orekit.frames.FramesFactory;
40 import org.orekit.frames.TopocentricFrame;
41 import org.orekit.orbits.KeplerianOrbit;
42 import org.orekit.orbits.Orbit;
43 import org.orekit.orbits.OrbitType;
44 import org.orekit.orbits.PositionAngleType;
45 import org.orekit.propagation.Propagator;
46 import org.orekit.propagation.SpacecraftState;
47 import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
48 import org.orekit.time.AbsoluteDate;
49 import org.orekit.time.Month;
50 import org.orekit.time.TimeScalesFactory;
51 import org.orekit.utils.Constants;
52 import org.orekit.utils.IERSConventions;
53
54
55
56
57
58
59
60
61
62 class IodGoodingTest extends AbstractIodTest {
63
64
65
66 @Test
67 void testIssue1166RaDec() {
68 AbsoluteDate t1 = new AbsoluteDate(2023, Month.JUNE, 9, 17, 4,59.10, TimeScalesFactory.getUTC());
69 AbsoluteDate t2 = new AbsoluteDate(2023, Month.JUNE, 9, 17, 10,50.66, TimeScalesFactory.getUTC());
70 AbsoluteDate t3 = new AbsoluteDate(2023, Month.JUNE, 9, 17, 16,21.09, TimeScalesFactory.getUTC());
71
72 Vector3D RA = new Vector3D((15.* (16. + 5./60. + 51.20/3600.)),
73 (15.*(16.+ 11./60. + 43.73/3600.)), (15.*(16.+ 17./60. + 15.1/3600. )));
74
75 Vector3D DEC = new Vector3D((-(6.+ 31./60. + 44.22/3600.)),
76 (-(6. + 31./60. + 52.36/3600.)),
77 (-(6. +32./60. + 0.03/3600.)));
78
79 Frame ITRF = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
80 OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS ,Constants.WGS84_EARTH_FLATTENING, ITRF);
81 GeodeticPoint stationCoord = new GeodeticPoint(FastMath.toRadians(43.05722), FastMath.toRadians(76.971667), 2735.0);
82 TopocentricFrame stationFrame = new TopocentricFrame(earth, stationCoord, "N42");
83 GroundStation ground_station = new GroundStation(stationFrame);
84
85 double[] angular1 = {FastMath.toRadians(RA.getX()), FastMath.toRadians(DEC.getX())};
86 double[] angular2 = {FastMath.toRadians(RA.getY()), FastMath.toRadians(DEC.getY())};
87 double[] angular3 = {FastMath.toRadians(RA.getZ()), FastMath.toRadians(DEC.getZ())};
88
89 AngularRaDec raDec1 = new AngularRaDec(ground_station, FramesFactory.getEME2000(), t1,
90 angular1, new double[] {1.0, 1.0}, new double[] {1.0, 1.0}, new ObservableSatellite(1));
91 AngularRaDec raDec2 = new AngularRaDec(ground_station, FramesFactory.getEME2000(), t2,
92 angular2, new double[] {1.0, 1.0}, new double[] {1.0, 1.0}, new ObservableSatellite(1));
93 AngularRaDec raDec3 = new AngularRaDec(ground_station, FramesFactory.getEME2000(), t3,
94 angular3, new double[] {1.0, 1.0}, new double[] {1.0, 1.0}, new ObservableSatellite(1));
95
96
97
98
99
100
101
102 Orbit estimatedOrbitGooding = new IodGooding(mu).estimate(eme2000, raDec1, raDec2, raDec3);
103 KeplerianOrbit orbitGooding = new KeplerianOrbit(estimatedOrbitGooding);
104 System.out.println(orbitGooding);
105 Assertions.assertEquals(4.2400558079418406E7, orbitGooding.getA(), 1.0e-6);
106 Assertions.assertEquals(0.004504568857387906, orbitGooding.getE(), 1.0e-10);
107 Assertions.assertEquals(FastMath.toRadians(0.09137634766893886), orbitGooding.getI(), 1.0e-10);
108 Assertions.assertEquals(FastMath.toRadians(170.1160849868576), orbitGooding.getPerigeeArgument(), 1.0e-10);
109 Assertions.assertEquals(FastMath.toRadians(90.77888177347695), orbitGooding.getRightAscensionOfAscendingNode(), 1.0e-10);
110 Assertions.assertEquals(FastMath.toRadians(-19.13147024478354), orbitGooding.getTrueAnomaly(), 1.0e-10);
111 }
112
113 @Test
114 void testIssue1166AzEl() {
115
116 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
117 final NumericalPropagatorBuilder propagatorBuilder = context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true, 1.0e-6, 60.0, 0.001);
118 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit, propagatorBuilder);
119 final List<ObservedMeasurement<?>> measurements = EstimationTestUtils.createMeasurements(propagator,
120 new AngularAzElMeasurementCreator(context),
121 0.0, 1.0, 60.0);
122 final AngularAzEl azEl1 = (AngularAzEl) measurements.get(0);
123 final AngularAzEl azEl2 = (AngularAzEl) measurements.get(20);
124 final AngularAzEl azEl3 = (AngularAzEl) measurements.get(40);
125
126
127 Orbit orbitGooding = new IodGooding(mu).estimate(eme2000, azEl1,azEl2,azEl3);
128
129
130 SpacecraftState midPoint = propagator.propagate(azEl2.getDate());
131 Assertions.assertTrue(midPoint.getPosition().subtract(orbitGooding.getPosition()).getNorm() < 170.0);
132 Assertions.assertTrue(midPoint.getVelocity().subtract(orbitGooding.getVelocity()).getNorm() < 0.06);
133 }
134
135 @Test
136 void testGooding() {
137 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
138
139 final double mu = context.initialOrbit.getMu();
140 final Frame frame = context.initialOrbit.getFrame();
141
142 final NumericalPropagatorBuilder propagatorBuilder =
143 context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true,
144 1.0e-6, 60.0, 0.001);
145
146
147 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
148 propagatorBuilder);
149
150 final List<ObservedMeasurement<?>> measurements =
151 EstimationTestUtils.createMeasurements(propagator,
152 new PVMeasurementCreator(),
153 0.0, 1.0, 60.0);
154
155
156 final int idMeasure1 = 0;
157 final AbsoluteDate date1 = measurements.get(idMeasure1).getDate();
158 final Vector3D stapos1 = Vector3D.ZERO;
159
160
161
162 final Vector3D position1 = new Vector3D(measurements.get(idMeasure1).getObservedValue()[0],
163 measurements.get(idMeasure1).getObservedValue()[1],
164 measurements.get(idMeasure1).getObservedValue()[2]);
165 final double r1 = position1.getNorm();
166 final Vector3D lineOfSight1 = position1.normalize();
167
168
169 final int idMeasure2 = 20;
170 final AbsoluteDate date2 = measurements.get(idMeasure2).getDate();
171 final Vector3D stapos2 = Vector3D.ZERO;
172
173
174
175 final Vector3D position2 = new Vector3D(
176 measurements.get(idMeasure2).getObservedValue()[0],
177 measurements.get(idMeasure2).getObservedValue()[1],
178 measurements.get(idMeasure2).getObservedValue()[2]);
179 final Vector3D lineOfSight2 = position2.normalize();
180
181
182 final int idMeasure3 = 40;
183 final AbsoluteDate date3 = measurements.get(idMeasure3).getDate();
184 final Vector3D stapos3 = Vector3D.ZERO;
185
186
187
188 final Vector3D position3 = new Vector3D(
189 measurements.get(idMeasure3).getObservedValue()[0],
190 measurements.get(idMeasure3).getObservedValue()[1],
191 measurements.get(idMeasure3).getObservedValue()[2]);
192 final double r3 = position3.getNorm();
193 final Vector3D lineOfSight3 = position3.normalize();
194
195
196 final IodGooding iod = new IodGooding(mu);
197
198
199
200 final Orbit orbit = iod.estimate(frame,
201 stapos1, stapos2, stapos3,
202 lineOfSight1, date1,
203 lineOfSight2, date2,
204 lineOfSight3, date3,
205 r1 - 1e3, r3 + 1e3);
206
207
208 SpacecraftState midPoint = propagator.propagate(date2);
209 Assertions.assertTrue(midPoint.getPosition().subtract(orbit.getPosition()).getNorm() < 1100.0);
210 Assertions.assertTrue(midPoint.getVelocity().subtract(orbit.getVelocity()).getNorm() < 0.47);
211 }
212
213 @Test
214 void testIssue756() {
215 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
216
217 final double mu = context.initialOrbit.getMu();
218 final Frame frame = context.initialOrbit.getFrame();
219
220 final NumericalPropagatorBuilder propagatorBuilder =
221 context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true,
222 1.0e-6, 60.0, 0.001);
223
224
225 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
226 propagatorBuilder);
227
228 final List<ObservedMeasurement<?>> measurements =
229 EstimationTestUtils.createMeasurements(propagator,
230 new AngularRaDecMeasurementCreator(context),
231 0.0, 1.0, 60.0);
232
233
234 final AngularRaDec raDec1 = (AngularRaDec) measurements.get(0);
235 final AngularRaDec raDec2 = (AngularRaDec) measurements.get(20);
236 final AngularRaDec raDec3 = (AngularRaDec) measurements.get(40);
237
238
239 final double rhoInit1 = 1.3127847998082995E7;
240 final double rhoInit3 = 1.3950296648518201E7;
241
242
243 final IodGooding iod = new IodGooding(mu);
244
245 final KeplerianOrbit orbit1 = new KeplerianOrbit(iod.estimate(frame, raDec1, raDec2, raDec3, rhoInit1, rhoInit3));
246 final KeplerianOrbit orbit2 = new KeplerianOrbit(iod.estimate(frame,
247 raDec1.getGroundStationPosition(frame),
248 raDec2.getGroundStationPosition(frame),
249 raDec3.getGroundStationPosition(frame),
250 raDec1.getObservedLineOfSight(frame), raDec1.getDate(),
251 raDec2.getObservedLineOfSight(frame), raDec2.getDate(),
252 raDec3.getObservedLineOfSight(frame), raDec3.getDate(),
253 rhoInit1, rhoInit3));
254
255
256 Assertions.assertEquals(0.0, orbit1.getPosition().subtract(orbit2.getPosition()).getNorm());
257 Assertions.assertEquals(0.0, orbit1.getVelocity().subtract(orbit2.getVelocity()).getNorm());
258
259
260 SpacecraftState midPoint = propagator.propagate(raDec2.getDate());
261 Assertions.assertTrue(midPoint.getPosition().subtract(orbit1.getPosition()).getNorm() < 170.0);
262 Assertions.assertTrue(midPoint.getVelocity().subtract(orbit1.getVelocity()).getNorm() < 0.06);
263 }
264
265 @Test
266 void testIssue1216() {
267 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
268
269 final double mu = context.initialOrbit.getMu();
270 final Frame frame = context.initialOrbit.getFrame();
271
272 final NumericalPropagatorBuilder propagatorBuilder =
273 context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true,
274 1.0e-6, 60.0, 0.001);
275
276
277 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
278 propagatorBuilder);
279
280 final List<ObservedMeasurement<?>> measurements =
281 EstimationTestUtils.createMeasurements(propagator,
282 new AngularAzElMeasurementCreator(context),
283 0.0, 1.0, 60.0);
284
285
286 final AngularAzEl azEl1 = (AngularAzEl) measurements.get(0);
287 final AngularAzEl azEl2 = (AngularAzEl) measurements.get(20);
288 final AngularAzEl azEl3 = (AngularAzEl) measurements.get(40);
289
290
291 final double rhoInit1 = 1.3127847998082995E7;
292 final double rhoInit3 = 1.3950296648518201E7;
293
294
295 final IodGooding iod = new IodGooding(mu);
296
297 final KeplerianOrbit orbit1 = new KeplerianOrbit(iod.estimate(frame, azEl1, azEl2, azEl3, rhoInit1, rhoInit3));
298 final KeplerianOrbit orbit2 = new KeplerianOrbit(iod.estimate(frame,
299 azEl1.getGroundStationPosition(frame),
300 azEl2.getGroundStationPosition(frame),
301 azEl3.getGroundStationPosition(frame),
302 azEl1.getObservedLineOfSight(frame), azEl1.getDate(),
303 azEl2.getObservedLineOfSight(frame), azEl2.getDate(),
304 azEl3.getObservedLineOfSight(frame), azEl3.getDate(),
305 rhoInit1, rhoInit3));
306
307
308 Assertions.assertEquals(0.0, orbit1.getPosition().subtract(orbit2.getPosition()).getNorm());
309 Assertions.assertEquals(0.0, orbit1.getVelocity().subtract(orbit2.getVelocity()).getNorm());
310
311
312 SpacecraftState midPoint = propagator.propagate(azEl2.getDate());
313 Assertions.assertTrue(midPoint.getPosition().subtract(orbit1.getPosition()).getNorm() < 170.0);
314 Assertions.assertTrue(midPoint.getVelocity().subtract(orbit1.getVelocity()).getNorm() < 0.06);
315 }
316
317 }