1   /* Copyright 2002-2022 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // this test does not check OnBoardAntennaRangeModifier at all,
48          // it just checks RangeMeasurementCreator behaves as necessary for the other test
49          // the *real* test is testEffect below
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          // create perfect range measurements without antenna offset
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          // create perfect range measurements with antenna offset
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         // create perfect range measurements without antenna offset
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         // create perfect range measurements with antenna offset
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 }