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