1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.attitudes;
18
19 import java.util.List;
20 import java.util.stream.Collectors;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.orekit.errors.OrekitException;
24 import org.orekit.errors.OrekitMessages;
25 import org.orekit.frames.FieldTransform;
26 import org.orekit.frames.Frame;
27 import org.orekit.frames.LOF;
28 import org.orekit.frames.Transform;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.FieldAbsoluteDate;
31 import org.orekit.time.FieldTimeInterpolator;
32 import org.orekit.time.TimeInterpolator;
33 import org.orekit.utils.AngularDerivativesFilter;
34 import org.orekit.utils.FieldPVCoordinates;
35 import org.orekit.utils.FieldPVCoordinatesProvider;
36 import org.orekit.utils.ImmutableTimeStampedCache;
37 import org.orekit.utils.PVCoordinates;
38 import org.orekit.utils.PVCoordinatesProvider;
39 import org.orekit.utils.TimeStampedAngularCoordinates;
40 import org.orekit.utils.TimeStampedAngularCoordinatesHermiteInterpolator;
41 import org.orekit.utils.TimeStampedFieldAngularCoordinates;
42 import org.orekit.utils.TimeStampedFieldAngularCoordinatesHermiteInterpolator;
43
44
45
46
47
48
49
50
51
52
53 public class TabulatedLofOffset implements BoundedAttitudeProvider {
54
55
56 private final Frame inertialFrame;
57
58
59 private final LOF type;
60
61
62 private final transient ImmutableTimeStampedCache<? extends TimeStampedAngularCoordinates> table;
63
64
65 private final AngularDerivativesFilter filter;
66
67
68 private final AbsoluteDate minDate;
69
70
71 private final AbsoluteDate maxDate;
72
73
74
75
76
77
78
79
80
81
82
83 public TabulatedLofOffset(final Frame inertialFrame, final LOF lof,
84 final List<? extends TimeStampedAngularCoordinates> table,
85 final int n, final AngularDerivativesFilter filter) {
86 this(inertialFrame, lof, table, n, filter, table.get(0).getDate(), table.get(table.size() - 1).getDate());
87 }
88
89
90
91
92
93
94
95
96
97
98
99 public TabulatedLofOffset(final Frame inertialFrame, final LOF lof,
100 final List<? extends TimeStampedAngularCoordinates> table,
101 final int n, final AngularDerivativesFilter filter,
102 final AbsoluteDate minDate, final AbsoluteDate maxDate) {
103 if (!inertialFrame.isPseudoInertial()) {
104 throw new OrekitException(OrekitMessages.NON_PSEUDO_INERTIAL_FRAME,
105 inertialFrame.getName());
106 }
107 this.inertialFrame = inertialFrame;
108 this.type = lof;
109 this.table = new ImmutableTimeStampedCache<TimeStampedAngularCoordinates>(n, table);
110 this.filter = filter;
111 this.minDate = minDate;
112 this.maxDate = maxDate;
113 }
114
115
116
117
118 public List<? extends TimeStampedAngularCoordinates> getTable() {
119 return table.getAll();
120 }
121
122
123 public Attitude getAttitude(final PVCoordinatesProvider pvProv,
124 final AbsoluteDate date, final Frame frame) {
125
126
127 final List<TimeStampedAngularCoordinates> sample = table.getNeighbors(date).collect(Collectors.toList());
128
129
130 final TimeInterpolator<TimeStampedAngularCoordinates> interpolator =
131 new TimeStampedAngularCoordinatesHermiteInterpolator(sample.size(), filter);
132
133
134 final TimeStampedAngularCoordinates interpolated = interpolator.interpolate(date, sample);
135
136
137 final PVCoordinates pv = pvProv.getPVCoordinates(date, inertialFrame);
138 final Transform inertialToLof = type.transformFromInertial(date, pv);
139
140
141 final Transform frameToInertial = frame.getTransformTo(inertialFrame, date);
142 final Transform frameToLof = new Transform(date, frameToInertial, inertialToLof);
143
144
145 return new Attitude(date, frame,
146 interpolated.addOffset(frameToLof.getAngular()));
147 }
148
149
150 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
151 final FieldAbsoluteDate<T> date,
152 final Frame frame) {
153
154
155 final List<TimeStampedFieldAngularCoordinates<T>> sample =
156 table.
157 getNeighbors(date.toAbsoluteDate()).
158 map(ac -> new TimeStampedFieldAngularCoordinates<>(date.getField(), ac)).
159 collect(Collectors.toList());
160
161
162 final FieldTimeInterpolator<TimeStampedFieldAngularCoordinates<T>, T> interpolator =
163 new TimeStampedFieldAngularCoordinatesHermiteInterpolator<>(sample.size(), filter);
164
165
166 final TimeStampedFieldAngularCoordinates<T> interpolated = interpolator.interpolate(date, sample);
167
168
169 final FieldPVCoordinates<T> pv = pvProv.getPVCoordinates(date, inertialFrame);
170 final FieldTransform<T> inertialToLof = type.transformFromInertial(date, pv);
171
172
173 final FieldTransform<T> frameToInertial = frame.getTransformTo(inertialFrame, date);
174 final FieldTransform<T> frameToLof = new FieldTransform<>(date, frameToInertial, inertialToLof);
175
176
177 return new FieldAttitude<>(date, frame,
178 interpolated.addOffset(frameToLof.getAngular()));
179 }
180
181
182 public AbsoluteDate getMinDate() {
183 return minDate;
184 }
185
186
187 public AbsoluteDate getMaxDate() {
188 return maxDate;
189 }
190
191 }