1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.measurements.model;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.hipparchus.util.MathArrays;
23 import org.orekit.errors.OrekitException;
24 import org.orekit.errors.OrekitMessages;
25 import org.orekit.frames.FieldStaticTransform;
26 import org.orekit.frames.Frame;
27 import org.orekit.frames.StaticTransform;
28 import org.orekit.signal.FieldSignalReceptionCondition;
29 import org.orekit.signal.SignalReceptionCondition;
30 import org.orekit.signal.SignalTravelTimeModel;
31 import org.orekit.time.AbsoluteDate;
32 import org.orekit.time.FieldAbsoluteDate;
33 import org.orekit.utils.FieldPVCoordinatesProvider;
34 import org.orekit.utils.PVCoordinatesProvider;
35
36
37
38
39
40
41 public class RaDecModel extends AbstractAngularMeasurementModel {
42
43
44 private final Frame referenceFrame;
45
46
47
48
49
50
51 public RaDecModel(final Frame referenceFrame, final SignalTravelTimeModel signalTravelTimeModel) {
52 super(signalTravelTimeModel);
53 if (!referenceFrame.isPseudoInertial()) {
54 throw new OrekitException(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME, referenceFrame.getName());
55 }
56 this.referenceFrame = referenceFrame;
57 }
58
59
60
61
62
63
64
65 public double[] value(final SignalReceptionCondition receptionCondition,
66 final PVCoordinatesProvider emitter) {
67 return value(receptionCondition, emitter, receptionCondition.receptionDate());
68 }
69
70
71
72
73
74
75
76
77 public double[] value(final SignalReceptionCondition receptionCondition,
78 final PVCoordinatesProvider emitter, final AbsoluteDate approxEmissionDate) {
79
80 final Vector3D apparentLineOfSightInInputFrame = getEmitterToReceiverVector(receptionCondition, emitter,
81 approxEmissionDate).normalize();
82 final StaticTransform toInertialFrameAtReception = receptionCondition.referenceFrame()
83 .getStaticTransformTo(referenceFrame, receptionCondition.receptionDate());
84 final Vector3D apparentLineOfSight = toInertialFrameAtReception.transformVector(apparentLineOfSightInInputFrame);
85
86
87 final double rightAscension = apparentLineOfSight.getAlpha();
88 final double declination = apparentLineOfSight.getDelta();
89 return new double[] { rightAscension, declination };
90 }
91
92
93
94
95
96
97
98
99 public <T extends CalculusFieldElement<T>> T[] value(final FieldSignalReceptionCondition<T> receptionCondition,
100 final FieldPVCoordinatesProvider<T> emitter) {
101 return value(receptionCondition, emitter, receptionCondition.receptionDate());
102 }
103
104
105
106
107
108
109
110
111
112 public <T extends CalculusFieldElement<T>> T[] value(final FieldSignalReceptionCondition<T> receptionCondition,
113 final FieldPVCoordinatesProvider<T> emitter,
114 final FieldAbsoluteDate<T> approxEmissionDate) {
115
116 final FieldVector3D<T> apparentLineOfSightInInputFrame = getEmitterToReceiverVector(receptionCondition,
117 emitter, approxEmissionDate).normalize();
118 final FieldAbsoluteDate<T> receptionDate = receptionCondition.receptionDate();
119 final FieldStaticTransform<T> toInertialFrameAtReception = receptionCondition.referenceFrame()
120 .getStaticTransformTo(referenceFrame, receptionDate);
121 final FieldVector3D<T> apparentLineOfSight = toInertialFrameAtReception.transformVector(apparentLineOfSightInInputFrame);
122
123
124 final T rightAscension = apparentLineOfSight.getAlpha();
125 final T declination = apparentLineOfSight.getDelta();
126 final T[] output = MathArrays.buildArray(receptionDate.getField(), 2);
127 output[0] = rightAscension;
128 output[1] = declination;
129 return output;
130 }
131 }