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.Range;
32  import org.orekit.estimation.measurements.RangeMeasurementCreator;
33  import org.orekit.frames.LOFType;
34  import org.orekit.orbits.OrbitType;
35  import org.orekit.orbits.PositionAngle;
36  import org.orekit.propagation.Propagator;
37  import org.orekit.propagation.SpacecraftState;
38  import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
39  import org.orekit.utils.Constants;
40  
41  public class OnBoardAntennaRangeModifierTest {
42  
43      @Test
44      public void testPreliminary() {
45  
46          // this test does not check OnBoardAntennaRangeModifier at all,
47          // it just checks RangeMeasurementCreator behaves as necessary for the other test
48          // the *real* test is testEffect below
49          Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
50  
51          final NumericalPropagatorBuilder propagatorBuilder =
52                          context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
53                                                1.0e-6, 60.0, 0.001);
54          propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
55  
56          // create perfect range measurements without antenna offset
57          final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
58                                                                             propagatorBuilder);
59          final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
60                          EstimationTestUtils.createMeasurements(p1,
61                                                                 new RangeMeasurementCreator(context, Vector3D.ZERO),
62                                                                 1.0, 3.0, 300.0);
63  
64          // create perfect range measurements with antenna offset
65          final double xOffset = -2.5;
66          final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
67                                                                     propagatorBuilder);
68          final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
69                          EstimationTestUtils.createMeasurements(p2,
70                                                                 new RangeMeasurementCreator(context, new Vector3D(xOffset, 0, 0)),
71                                                                 1.0, 3.0, 300.0);
72  
73          for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
74              Range sr = (Range) spacecraftCenteredMeasurements.get(i);
75              Range ar = (Range) antennaCenteredMeasurements.get(i);
76              double alphaMax = FastMath.asin(Constants.WGS84_EARTH_EQUATORIAL_RADIUS / sr.getObservedValue()[0]);
77              Assert.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 1.0e-8);
78              Assert.assertTrue(ar.getObservedValue()[0] - sr.getObservedValue()[0] >= xOffset);
79              Assert.assertTrue(ar.getObservedValue()[0] - sr.getObservedValue()[0] <= xOffset * FastMath.cos(alphaMax));
80          }
81      }
82  
83      @Test
84      public void testEffect() {
85  
86          Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
87  
88          final NumericalPropagatorBuilder propagatorBuilder =
89                          context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
90                                                1.0e-6, 60.0, 0.001);
91          propagatorBuilder.setAttitudeProvider(new LofOffset(propagatorBuilder.getFrame(), LOFType.LVLH));
92          final double groundClockOffset = 1.234e-3;
93          for (final GroundStation station : context.stations) {
94              station.getClockOffsetDriver().setValue(groundClockOffset);
95          }
96  
97          // create perfect range measurements without antenna offset
98          final Propagator p1 = EstimationTestUtils.createPropagator(context.initialOrbit,
99                                                                             propagatorBuilder);
100         final List<ObservedMeasurement<?>> spacecraftCenteredMeasurements =
101                         EstimationTestUtils.createMeasurements(p1,
102                                                                new RangeMeasurementCreator(context, Vector3D.ZERO),
103                                                                1.0, 3.0, 300.0);
104 
105         // create perfect range measurements with antenna offset
106         final Vector3D apc = new Vector3D(-2.5,  0,  0);
107         final Propagator p2 = EstimationTestUtils.createPropagator(context.initialOrbit,
108                                                                    propagatorBuilder);
109         final List<ObservedMeasurement<?>> antennaCenteredMeasurements =
110                         EstimationTestUtils.createMeasurements(p2,
111                                                                new RangeMeasurementCreator(context, apc),
112                                                                1.0, 3.0, 300.0);
113 
114         final Propagator p3 = EstimationTestUtils.createPropagator(context.initialOrbit,
115                                                                    propagatorBuilder);
116 
117         OnBoardAntennaRangeModifier modifier = new OnBoardAntennaRangeModifier(apc);
118         for (int i = 0; i < spacecraftCenteredMeasurements.size(); ++i) {
119             Range sr = (Range) spacecraftCenteredMeasurements.get(i);
120             sr.addModifier(modifier);
121             EstimatedMeasurement<Range> estimated = sr.estimate(0, 0, new SpacecraftState[] { p3.propagate(sr.getDate()) });
122             Range ar = (Range) antennaCenteredMeasurements.get(i);
123             Assert.assertEquals(0.0, sr.getDate().durationFrom(ar.getDate()), 1.0e-8);
124             Assert.assertEquals(ar.getObservedValue()[0], estimated.getEstimatedValue()[0], 2.6e-7);
125         }
126 
127     }
128 
129 }
130 
131