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.Collections;
20 import java.util.List;
21
22 import org.hipparchus.geometry.euclidean.threed.Vector3D;
23 import org.orekit.estimation.measurements.EstimatedMeasurementBase;
24 import org.orekit.estimation.measurements.EstimationModifier;
25 import org.orekit.estimation.measurements.TurnAroundRange;
26 import org.orekit.frames.StaticTransform;
27 import org.orekit.propagation.SpacecraftState;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.utils.ParameterDriver;
30 import org.orekit.utils.TimeStampedPVCoordinates;
31
32
33
34
35
36 public class OnBoardAntennaTurnAroundRangeModifier implements EstimationModifier<TurnAroundRange> {
37
38
39 private final Vector3D antennaPhaseCenter;
40
41
42
43
44 public OnBoardAntennaTurnAroundRangeModifier(final Vector3D antennaPhaseCenter) {
45 this.antennaPhaseCenter = antennaPhaseCenter;
46 }
47
48
49 @Override
50 public List<ParameterDriver> getParametersDrivers() {
51 return Collections.emptyList();
52 }
53
54
55 @Override
56 public void modifyWithoutDerivatives(final EstimatedMeasurementBase<TurnAroundRange> estimated) {
57
58
59
60 final TimeStampedPVCoordinates[] participants = estimated.getParticipants();
61 final Vector3D pPrimaryEmission = participants[0].getPosition();
62 final AbsoluteDate transitDateLeg1 = participants[1].getDate();
63 final Vector3D pSecondaryRebound = participants[2].getPosition();
64 final AbsoluteDate transitDateLeg2 = participants[3].getDate();
65 final Vector3D pPrimaryReception = participants[4].getPosition();
66
67
68 final SpacecraftState refState = estimated.getStates()[0];
69 final SpacecraftState transitStateLeg1 = refState.shiftedBy(transitDateLeg1.durationFrom(refState.getDate()));
70 final StaticTransform spacecraftToInertLeg1 = transitStateLeg1.toStaticTransform().getInverse();
71 final SpacecraftState transitStateLeg2 = refState.shiftedBy(transitDateLeg2.durationFrom(refState.getDate()));
72 final StaticTransform spacecraftToInertLeg2 = transitStateLeg2.toStaticTransform().getInverse();
73
74
75
76
77 final Vector3D pSpacecraftLeg1 = spacecraftToInertLeg1.transformPosition(Vector3D.ZERO);
78 final Vector3D pSpacecraftLeg2 = spacecraftToInertLeg2.transformPosition(Vector3D.ZERO);
79 final double turnAroundRangeUsingSpacecraftCenter =
80 0.5 * (Vector3D.distance(pPrimaryEmission, pSpacecraftLeg1) +
81 Vector3D.distance(pSpacecraftLeg1, pSecondaryRebound) +
82 Vector3D.distance(pSecondaryRebound, pSpacecraftLeg2) +
83 Vector3D.distance(pSpacecraftLeg2, pPrimaryReception));
84
85
86
87 final Vector3D pAPCLeg1 = spacecraftToInertLeg1.transformPosition(antennaPhaseCenter);
88 final Vector3D pAPCLeg2 = spacecraftToInertLeg2.transformPosition(antennaPhaseCenter);
89 final double turnAroundRangeUsingAntennaPhaseCenter =
90 0.5 * (Vector3D.distance(pPrimaryEmission, pAPCLeg1) +
91 Vector3D.distance(pAPCLeg1, pSecondaryRebound) +
92 Vector3D.distance(pSecondaryRebound, pAPCLeg2) +
93 Vector3D.distance(pAPCLeg2, pPrimaryReception));
94
95
96 final double[] value = estimated.getEstimatedValue();
97
98
99 value[0] += turnAroundRangeUsingAntennaPhaseCenter - turnAroundRangeUsingSpacecraftCenter;
100 estimated.modifyEstimatedValue(this, value);
101
102 }
103
104 }