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