1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.general;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.concurrent.ConcurrentHashMap;
24
25 import org.orekit.attitudes.BoundedAttitudeProvider;
26 import org.orekit.attitudes.FixedFrameBuilder;
27 import org.orekit.attitudes.TabulatedProvider;
28 import org.orekit.errors.OrekitIllegalArgumentException;
29 import org.orekit.errors.OrekitMessages;
30 import org.orekit.frames.Frame;
31 import org.orekit.propagation.SpacecraftState;
32 import org.orekit.time.AbsoluteDate;
33 import org.orekit.utils.AngularDerivativesFilter;
34 import org.orekit.utils.TimeStampedAngularCoordinates;
35
36
37
38
39
40
41
42
43
44
45 public class OrekitAttitudeEphemerisFile
46 implements AttitudeEphemerisFile<TimeStampedAngularCoordinates,
47 OrekitAttitudeEphemerisFile.OrekitAttitudeEphemerisSegment> {
48
49
50 private final Map<String, OrekitSatelliteAttitudeEphemeris> satellites;
51
52
53
54
55 public OrekitAttitudeEphemerisFile() {
56 this.satellites = new ConcurrentHashMap<>();
57 }
58
59
60 @Override
61 public Map<String, OrekitSatelliteAttitudeEphemeris> getSatellites() {
62 return Collections.unmodifiableMap(satellites);
63 }
64
65
66
67
68
69
70
71
72 public OrekitSatelliteAttitudeEphemeris addSatellite(final String id) {
73 final OrekitSatelliteAttitudeEphemeris newSat = new OrekitSatelliteAttitudeEphemeris(id);
74 this.satellites.put(id, newSat);
75 return newSat;
76 }
77
78
79
80
81
82
83 public static class OrekitSatelliteAttitudeEphemeris
84 implements SatelliteAttitudeEphemeris<TimeStampedAngularCoordinates,
85 OrekitAttitudeEphemerisFile.OrekitAttitudeEphemerisSegment> {
86
87
88 public static final String DEFAULT_INTERPOLATION_METHOD = "LINEAR";
89
90
91 public static final int DEFAULT_INTERPOLATION_SIZE = 2;
92
93
94 private final String id;
95
96
97 private AbsoluteDate startDate;
98
99
100 private AbsoluteDate stopDate;
101
102
103 private final List<OrekitAttitudeEphemerisSegment> segments;
104
105
106
107
108
109
110
111 public OrekitSatelliteAttitudeEphemeris(final String id) {
112 this.id = id;
113 this.segments = new ArrayList<>();
114 }
115
116
117 @Override
118 public String getId() {
119 return id;
120 }
121
122
123 @Override
124 public List<OrekitAttitudeEphemerisSegment> getSegments() {
125 return Collections.unmodifiableList(this.segments);
126 }
127
128
129 @Override
130 public AbsoluteDate getStart() {
131 return this.startDate;
132 }
133
134
135 @Override
136 public AbsoluteDate getStop() {
137 return this.stopDate;
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 public OrekitAttitudeEphemerisSegment addNewSegment(final List<SpacecraftState> states,
158 final String interpolationMethod,
159 final int interpolationSamples,
160 final AngularDerivativesFilter availableDerivatives) {
161 final int minimumSampleSize = 2;
162 if (states == null || states.size() == 0) {
163 throw new OrekitIllegalArgumentException(OrekitMessages.NULL_ARGUMENT, "states");
164 }
165
166 if (interpolationSamples < minimumSampleSize) {
167 throw new OrekitIllegalArgumentException(OrekitMessages.NOT_ENOUGH_DATA,
168 interpolationSamples);
169 }
170
171 final AbsoluteDate start = states.get(0).getDate();
172 final AbsoluteDate stop = states.get(states.size() - 1).getDate();
173
174 if (this.startDate == null || start.compareTo(this.startDate) < 0) {
175 this.startDate = start;
176 }
177
178 if (this.stopDate == null || stop.compareTo(this.stopDate) > 0) {
179 this.stopDate = stop;
180 }
181
182 final List<TimeStampedAngularCoordinates> attitudeDataLines = new ArrayList<>();
183 for (SpacecraftState state : states) {
184 attitudeDataLines.add(state.getAttitude().getOrientation());
185 }
186
187 final OrekitAttitudeEphemerisSegment newSeg =
188 new OrekitAttitudeEphemerisSegment(attitudeDataLines, interpolationMethod, interpolationSamples,
189 states.get(0).getFrame(), availableDerivatives);
190 this.segments.add(newSeg);
191 return newSeg;
192 }
193 }
194
195
196 public static class OrekitAttitudeEphemerisSegment
197 implements AttitudeEphemerisFile.AttitudeEphemerisSegment<TimeStampedAngularCoordinates> {
198
199
200 private List<TimeStampedAngularCoordinates> attitudeDataLines;
201
202
203 private String interpolationMethod;
204
205
206 private int interpolationSamples;
207
208
209 private AngularDerivativesFilter availableDerivatives;
210
211
212 private Frame referenceFrame;
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 public OrekitAttitudeEphemerisSegment(final List<TimeStampedAngularCoordinates> attitudeDataLines,
228 final String interpolationMethod,
229 final int interpolationSamples,
230 final Frame referenceFrame,
231 final AngularDerivativesFilter availableDerivatives) {
232 this.attitudeDataLines = attitudeDataLines;
233 this.interpolationMethod = interpolationMethod;
234 this.interpolationSamples = interpolationSamples;
235 this.referenceFrame = referenceFrame;
236 this.availableDerivatives = availableDerivatives;
237 }
238
239
240 @Override
241 public List<TimeStampedAngularCoordinates> getAngularCoordinates() {
242 return Collections.unmodifiableList(attitudeDataLines);
243 }
244
245
246 @Override
247 public Frame getReferenceFrame() {
248 return referenceFrame;
249 }
250
251
252 @Override
253 public AbsoluteDate getStart() {
254 return attitudeDataLines.get(0).getDate();
255 }
256
257
258 @Override
259 public AbsoluteDate getStop() {
260 return attitudeDataLines.get(attitudeDataLines.size() - 1).getDate();
261 }
262
263
264 @Override
265 public String getInterpolationMethod() {
266 return interpolationMethod;
267 }
268
269
270 @Override
271 public int getInterpolationSamples() {
272 return interpolationSamples;
273 }
274
275
276 @Override
277 public AngularDerivativesFilter getAvailableDerivatives() {
278 return availableDerivatives;
279 }
280
281
282 @Override
283 public BoundedAttitudeProvider getAttitudeProvider() {
284 return new TabulatedProvider(getAngularCoordinates(),
285 getInterpolationSamples(), getAvailableDerivatives(),
286 getStart(), getStop(),
287 new FixedFrameBuilder(getReferenceFrame()));
288 }
289
290 }
291
292 }