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