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.hipparchus.util.FastMath;
23 import org.junit.Assert;
24 import org.junit.Test;
25 import org.orekit.attitudes.LofOffset;
26 import org.orekit.estimation.Context;
27 import org.orekit.estimation.EstimationTestUtils;
28 import org.orekit.estimation.measurements.EstimatedMeasurement;
29 import org.orekit.estimation.measurements.GroundStation;
30 import org.orekit.estimation.measurements.ObservedMeasurement;
31 import org.orekit.estimation.measurements.gnss.Phase;
32 import org.orekit.estimation.measurements.gnss.PhaseMeasurementCreator;
33 import org.orekit.frames.LOFType;
34 import org.orekit.gnss.Frequency;
35 import org.orekit.orbits.OrbitType;
36 import org.orekit.orbits.PositionAngle;
37 import org.orekit.propagation.Propagator;
38 import org.orekit.propagation.SpacecraftState;
39 import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
40 import org.orekit.utils.Constants;
41
42 public class OnBoardAntennaPhaseModifierTest {
43
44 @Test
45 public void testPreliminary() {
46
47
48
49
50 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
51
52 final NumericalPropagatorBuilder propagatorBuilder =
53 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
54 1.0e-6, 60.0, 0.001);
55 propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
56
57
58 final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
59 propagatorBuilder);
60 final double groundClockOffset = 12.0e-6;
61 for (final GroundStation station : context.stations) {
62 station.getClockOffsetDriver().setValue(groundClockOffset);
63 }
64 final int ambiguity = 0;
65 final double satClockOffset = 345.0e-6;
66 final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
67 EstimationTestUtils.createMeasurements(p1,
68 new PhaseMeasurementCreator(context, Frequency.G01,
69 ambiguity,
70 satClockOffset,
71 Vector3D.ZERO),
72 1.0, 3.0, 300.0);
73
74
75 final double xOffset = -2.5;
76 final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
77 propagatorBuilder);
78 final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
79 EstimationTestUtils.createMeasurements(p2,
80 new PhaseMeasurementCreator(context, Frequency.G01,
81 ambiguity,
82 satClockOffset,
83 new Vector3D(xOffset, 0, 0)),
84 1.0, 3.0, 300.0);
85
86 for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
87 Phase sr = (Phase) spacecraftCenteredMeasurements.get(i);
88 Phase ar = (Phase) antennaCenteredMeasurements.get(i);
89 double alphaMax = FastMath.asin(Constants.WGS84_EARTH_EQUATORIAL_RADIUS / sr.getObservedValue()[0]);
90 Assert.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 1.0e-8);
91 Assert.assertTrue((ar.getObservedValue()[0] - sr.getObservedValue()[0]) * sr.getWavelength() >= xOffset);
92 Assert.assertTrue((ar.getObservedValue()[0] - sr.getObservedValue()[0]) * sr.getWavelength() <= xOffset * FastMath.cos(alphaMax) * sr.getWavelength());
93 }
94 }
95
96 @Test
97 public void testEffect() {
98
99 Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
100
101 final NumericalPropagatorBuilder propagatorBuilder =
102 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
103 1.0e-6, 60.0, 0.001);
104 propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
105
106
107 final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
108 propagatorBuilder);
109 final double groundClockOffset = 12.0e-6;
110 for (final GroundStation station : context.stations) {
111 station.getClockOffsetDriver().setValue(groundClockOffset);
112 }
113 final int ambiguity = 0;
114 final double satClockOffset = 345.0e-6;
115 final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
116 EstimationTestUtils.createMeasurements(p1,
117 new PhaseMeasurementCreator(context, Frequency.G01,
118 ambiguity,
119 satClockOffset,
120 Vector3D.ZERO),
121 1.0, 3.0, 300.0);
122
123
124 final Vector3D apc = new Vector3D(-2.5, 0, 0);
125 final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
126 propagatorBuilder);
127 final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
128 EstimationTestUtils.createMeasurements(p2,
129 new PhaseMeasurementCreator(context, Frequency.G01,
130 ambiguity,
131 satClockOffset,
132 apc),
133 1.0, 3.0, 300.0);
134
135 final Propagator p3 = EstimationTestUtils.createPropagator(context.initialOrbit,
136 propagatorBuilder);
137
138 OnBoardAntennaPhaseModifier modifier = new OnBoardAntennaPhaseModifier(apc);
139 for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
140 Phase sr = (Phase) spacecraftCenteredMeasurements.get(i);
141 sr.addModifier(modifier);
142 EstimatedMeasurement<Phase> estimated = sr.estimate(0, 0, new SpacecraftState[] { p3.propagate(sr.getDate()) });
143 Phase ar = (Phase) antennaCenteredMeasurements.get(i);
144 Assert.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 1.0e-8);
145 Assert.assertEquals(ar.getObservedValue()[0], estimated.getEstimatedValue()[0], 1.1e-5);
146 }
147
148 }
149
150 }