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