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.EstimatedMeasurement;
24 import org.orekit.estimation.measurements.EstimationModifier;
25 import org.orekit.estimation.measurements.Range;
26 import org.orekit.frames.Transform;
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 OnBoardAntennaRangeModifier implements EstimationModifier<Range> {
37
38
39 private final Vector3D antennaPhaseCenter;
40
41
42
43
44 public OnBoardAntennaRangeModifier(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 modify(final EstimatedMeasurement<Range> estimated) {
57 if (estimated.getObservedMeasurement().isTwoWay()) {
58 modifyTwoWay(estimated);
59 } else {
60 modifyOneWay(estimated);
61 }
62 }
63
64
65
66
67 private void modifyOneWay(final EstimatedMeasurement<Range> estimated) {
68
69
70 final TimeStampedPVCoordinates[] participants = estimated.getParticipants();
71 final AbsoluteDate emissionDate = participants[0].getDate();
72 final Vector3D pReception = participants[1].getPosition();
73
74
75 final SpacecraftState refState = estimated.getStates()[0];
76 final SpacecraftState emissionState = refState.shiftedBy(emissionDate.durationFrom(refState.getDate()));
77 final Transform spacecraftToInert = emissionState.toTransform().getInverse();
78
79
80
81
82 final Vector3D pSpacecraft = spacecraftToInert.transformPosition(Vector3D.ZERO);
83 final double rangeUsingSpacecraftCenter = Vector3D.distance(pSpacecraft, pReception);
84
85
86
87 final Vector3D pAPC = spacecraftToInert.transformPosition(antennaPhaseCenter);
88 final double rangeUsingAntennaPhaseCenter = Vector3D.distance(pAPC, pReception);
89
90
91 final double[] value = estimated.getEstimatedValue();
92
93
94 value[0] += rangeUsingAntennaPhaseCenter - rangeUsingSpacecraftCenter;
95 estimated.setEstimatedValue(value);
96
97 }
98
99
100
101
102 private void modifyTwoWay(final EstimatedMeasurement<Range> estimated) {
103
104
105
106 final TimeStampedPVCoordinates[] participants = estimated.getParticipants();
107 final Vector3D pEmission = participants[0].getPosition();
108 final AbsoluteDate transitDate = participants[1].getDate();
109 final Vector3D pReception = participants[2].getPosition();
110
111
112 final SpacecraftState refState = estimated.getStates()[0];
113 final SpacecraftState transitState = refState.shiftedBy(transitDate.durationFrom(refState.getDate()));
114 final Transform spacecraftToInert = transitState.toTransform().getInverse();
115
116
117
118
119 final Vector3D pSpacecraft = spacecraftToInert.transformPosition(Vector3D.ZERO);
120 final double rangeUsingSpacecraftCenter =
121 0.5 * (Vector3D.distance(pEmission, pSpacecraft) + Vector3D.distance(pSpacecraft, pReception));
122
123
124
125 final Vector3D pAPC = spacecraftToInert.transformPosition(antennaPhaseCenter);
126 final double rangeUsingAntennaPhaseCenter =
127 0.5 * (Vector3D.distance(pEmission, pAPC) + Vector3D.distance(pAPC, pReception));
128
129
130 final double[] value = estimated.getEstimatedValue();
131
132
133 value[0] += rangeUsingAntennaPhaseCenter - rangeUsingSpacecraftCenter;
134 estimated.setEstimatedValue(value);
135
136 }
137
138 }