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.attitudes.AttitudeProvider;
24 import org.orekit.estimation.measurements.EstimatedMeasurement;
25 import org.orekit.estimation.measurements.EstimationModifier;
26 import org.orekit.estimation.measurements.gnss.OneWayGNSSRange;
27 import org.orekit.frames.Transform;
28 import org.orekit.orbits.CartesianOrbit;
29 import org.orekit.orbits.Orbit;
30 import org.orekit.propagation.SpacecraftState;
31 import org.orekit.time.AbsoluteDate;
32 import org.orekit.utils.ParameterDriver;
33 import org.orekit.utils.TimeStampedPVCoordinates;
34
35
36
37
38
39 public class OnBoardAntennaOneWayGNSSRangeModifier implements EstimationModifier<OneWayGNSSRange> {
40
41
42 private final Vector3D antennaPhaseCenter1;
43
44
45 private final Vector3D antennaPhaseCenter2;
46
47
48 private final AttitudeProvider attitude;
49
50
51
52
53
54
55
56
57 public OnBoardAntennaOneWayGNSSRangeModifier(final Vector3D antennaPhaseCenter1,
58 final Vector3D antennaPhaseCenter2,
59 final AttitudeProvider attitude) {
60 this.antennaPhaseCenter1 = antennaPhaseCenter1;
61 this.antennaPhaseCenter2 = antennaPhaseCenter2;
62 this.attitude = attitude;
63 }
64
65
66 @Override
67 public List<ParameterDriver> getParametersDrivers() {
68 return Collections.emptyList();
69 }
70
71
72 @Override
73 public void modify(final EstimatedMeasurement<OneWayGNSSRange> estimated) {
74
75
76 final TimeStampedPVCoordinates[] participants = estimated.getParticipants();
77 final AbsoluteDate emissionDate = participants[0].getDate();
78 final AbsoluteDate receptionDate = participants[1].getDate();
79
80
81 final SpacecraftState refStateLocal = estimated.getStates()[0];
82 final SpacecraftState receptionState = refStateLocal.shiftedBy(receptionDate.durationFrom(refStateLocal.getDate()));
83 final Transform receptionSpacecraftToInert = receptionState.toTransform().getInverse();
84
85
86 final Orbit orbitRemote = new CartesianOrbit(participants[0], refStateLocal.getFrame(), receptionState.getMu());
87
88
89 final SpacecraftState refStateRemote = new SpacecraftState(orbitRemote,
90 attitude.getAttitude(orbitRemote,
91 orbitRemote.getDate(),
92 orbitRemote.getFrame()));
93 final SpacecraftState emissionState = refStateRemote.shiftedBy(emissionDate.durationFrom(refStateRemote.getDate()));
94 final Transform emissionSpacecraftToInert = emissionState.toTransform().getInverse();
95
96
97
98
99 final Vector3D pSpacecraftReception = receptionSpacecraftToInert.transformPosition(Vector3D.ZERO);
100 final Vector3D pSpacecraftEmission = emissionSpacecraftToInert.transformPosition(Vector3D.ZERO);
101 final double oneWayGNSSRangeUsingSpacecraftCenter = Vector3D.distance(pSpacecraftEmission, pSpacecraftReception);
102
103
104
105 final Vector3D pAPCReception = receptionSpacecraftToInert.transformPosition(antennaPhaseCenter1);
106 final Vector3D pAPCEmission = emissionSpacecraftToInert.transformPosition(antennaPhaseCenter2);
107 final double oneWayGNSSRangeUsingAntennaPhaseCenter = Vector3D.distance(pAPCEmission, pAPCReception);
108
109
110 final double[] value = estimated.getEstimatedValue();
111
112
113 value[0] += oneWayGNSSRangeUsingAntennaPhaseCenter - oneWayGNSSRangeUsingSpacecraftCenter;
114 estimated.setEstimatedValue(value);
115
116 }
117
118 }