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.geometry.euclidean.threed.Vector3D;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.Test;
24 import org.orekit.attitudes.LofOffset;
25 import org.orekit.estimation.Context;
26 import org.orekit.estimation.EstimationTestUtils;
27 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
28 import org.orekit.estimation.measurements.ObservedMeasurement;
29 import org.orekit.estimation.measurements.gnss.InterSatellitesPhase;
30 import org.orekit.estimation.measurements.gnss.InterSatellitesPhaseMeasurementCreator;
31 import org.orekit.frames.LOFType;
32 import org.orekit.gnss.PredefinedGnssSignal;
33 import org.orekit.gnss.RadioWave;
34 import org.orekit.orbits.CartesianOrbit;
35 import org.orekit.orbits.Orbit;
36 import org.orekit.orbits.OrbitType;
37 import org.orekit.orbits.PositionAngleType;
38 import org.orekit.propagation.BoundedPropagator;
39 import org.orekit.propagation.EphemerisGenerator;
40 import org.orekit.propagation.Propagator;
41 import org.orekit.propagation.SpacecraftState;
42 import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
43 import org.orekit.utils.TimeStampedPVCoordinates;
44
45 public class OnBoardAntennaInterSatellitesPhaseModifierTest {
46
47 private static final RadioWave RADIO_WAVE = PredefinedGnssSignal.G01;
48
49 @Test
50 public void testPreliminary() {
51
52
53
54
55 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
56
57 final NumericalPropagatorBuilder propagatorBuilder =
58 context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true,
59 1.0e-6, 60.0, 0.001);
60 propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
61
62
63 final TimeStampedPVCoordinates original = context.initialOrbit.getPVCoordinates();
64 final Orbit closeOrbit = new CartesianOrbit(new TimeStampedPVCoordinates(context.initialOrbit.getDate(),
65 original.getPosition().add(new Vector3D(1000, 2000, 3000)),
66 original.getVelocity().add(new Vector3D(-0.03, 0.01, 0.02))),
67 context.initialOrbit.getFrame(),
68 context.initialOrbit.getMu());
69 final Propagator closePropagator = EstimationTestUtils.createPropagator(closeOrbit,
70 propagatorBuilder);
71 final EphemerisGenerator generator = closePropagator.getEphemerisGenerator();
72 closePropagator.propagate(context.initialOrbit.getDate().shiftedBy(3.5 * closeOrbit.getKeplerianPeriod()));
73 final BoundedPropagator ephemeris = generator.getGeneratedEphemeris();
74 final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
75 propagatorBuilder);
76 final int ambiguity = 0;
77 final double localClockOffset = 0.137e-6;
78 final double remoteClockOffset = 469.0e-6;
79 final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
80 EstimationTestUtils.createMeasurements(p1,
81 new InterSatellitesPhaseMeasurementCreator(ephemeris,
82 RADIO_WAVE,
83 ambiguity,
84 localClockOffset,
85 remoteClockOffset,
86 Vector3D.ZERO,
87 Vector3D.ZERO),
88 1.0, 3.0, 300.0);
89
90
91 final double xOffset1 = -2.5;
92 final double yOffset2 = 0.8;
93 final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
94 propagatorBuilder);
95 final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
96 EstimationTestUtils.createMeasurements(p2,
97 new InterSatellitesPhaseMeasurementCreator(ephemeris,
98 RADIO_WAVE,
99 ambiguity,
100 localClockOffset,
101 remoteClockOffset,
102 new Vector3D(xOffset1, 0, 0),
103 new Vector3D(0, yOffset2, 0)),
104 1.0, 3.0, 300.0);
105
106 for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
107 InterSatellitesPhase sr = (InterSatellitesPhase) spacecraftCenteredMeasurements.get(i);
108 InterSatellitesPhase ar = (InterSatellitesPhase) antennaCenteredMeasurements.get(i);
109 Assertions.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 2.0e-8);
110 Assertions.assertTrue((ar.getObservedValue()[0] - sr.getObservedValue()[0]) * RADIO_WAVE.getWavelength() >= -1.0);
111 Assertions.assertTrue((ar.getObservedValue()[0] - sr.getObservedValue()[0]) * RADIO_WAVE.getWavelength() <= -0.36);
112 }
113 }
114
115 @Test
116 public void testEffect() {
117
118 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
119
120 final NumericalPropagatorBuilder propagatorBuilder =
121 context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, true,
122 1.0e-6, 60.0, 0.001);
123 propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
124
125
126 final TimeStampedPVCoordinates original = context.initialOrbit.getPVCoordinates();
127 final Orbit closeOrbit = new CartesianOrbit(new TimeStampedPVCoordinates(context.initialOrbit.getDate(),
128 original.getPosition().add(new Vector3D(1000, 2000, 3000)),
129 original.getVelocity().add(new Vector3D(-0.03, 0.01, 0.02))),
130 context.initialOrbit.getFrame(),
131 context.initialOrbit.getMu());
132 final Propagator closePropagator = EstimationTestUtils.createPropagator(closeOrbit,
133 propagatorBuilder);
134 final EphemerisGenerator generator = closePropagator.getEphemerisGenerator();
135 closePropagator.propagate(context.initialOrbit.getDate().shiftedBy(3.5 * closeOrbit.getKeplerianPeriod()));
136 final BoundedPropagator ephemeris = generator.getGeneratedEphemeris();
137 final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
138 propagatorBuilder);
139 final int ambiguity = 0;
140 final double localClockOffset = 0.137e-6;
141 final double remoteClockOffset = 469.0e-6;
142 final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
143 EstimationTestUtils.createMeasurements(p1,
144 new InterSatellitesPhaseMeasurementCreator(ephemeris,
145 RADIO_WAVE,
146 ambiguity,
147 localClockOffset,
148 remoteClockOffset,
149 Vector3D.ZERO,
150 Vector3D.ZERO),
151 1.0, 3.0, 300.0);
152
153
154 final Vector3D apc1 = new Vector3D(-2.5, 0.0, 0);
155 final Vector3D apc2 = new Vector3D( 0.0, 0.8, 0);
156 final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
157 propagatorBuilder);
158 final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
159 EstimationTestUtils.createMeasurements(p2,
160 new InterSatellitesPhaseMeasurementCreator(ephemeris,
161 RADIO_WAVE,
162 ambiguity,
163 localClockOffset,
164 remoteClockOffset,
165 apc1, apc2),
166 1.0, 3.0, 300.0);
167
168 final Propagator p3 = EstimationTestUtils.createPropagator(context.initialOrbit,
169 propagatorBuilder);
170
171 OnBoardAntennaInterSatellitesPhaseModifier modifier = new OnBoardAntennaInterSatellitesPhaseModifier(apc1, apc2);
172 for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
173 InterSatellitesPhase sr = (InterSatellitesPhase) spacecraftCenteredMeasurements.get(i);
174 sr.addModifier(modifier);
175 EstimatedMeasurementBase<InterSatellitesPhase> estimated = sr.estimateWithoutDerivatives(new SpacecraftState[] {
176 p3.propagate(sr.getDate()),
177 ephemeris.propagate(sr.getDate())
178 });
179 InterSatellitesPhase ar = (InterSatellitesPhase) antennaCenteredMeasurements.get(i);
180 Assertions.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 2.0e-8);
181 Assertions.assertEquals(ar.getObservedValue()[0] * RADIO_WAVE.getWavelength(), estimated.getEstimatedValue()[0] * RADIO_WAVE.getWavelength(), 2.0e-5);
182 Assertions.assertEquals(1,
183 estimated.getAppliedEffects().entrySet().stream().
184 filter(e -> e.getKey().getEffectName().equals("mean phase center")).count());
185 }
186
187 }
188
189 }
190
191