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_FOR_INTERPOLATION,
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 public static class OrekitAttitudeEphemerisSegment
196 implements AttitudeEphemerisFile.AttitudeEphemerisSegment<TimeStampedAngularCoordinates> {
197
198
199 private List<TimeStampedAngularCoordinates> attitudeDataLines;
200
201
202 private String interpolationMethod;
203
204
205 private int interpolationSamples;
206
207
208 private AngularDerivativesFilter availableDerivatives;
209
210
211 private Frame referenceFrame;
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226 public OrekitAttitudeEphemerisSegment(final List<TimeStampedAngularCoordinates> attitudeDataLines,
227 final String interpolationMethod,
228 final int interpolationSamples,
229 final Frame referenceFrame,
230 final AngularDerivativesFilter availableDerivatives) {
231 this.attitudeDataLines = attitudeDataLines;
232 this.interpolationMethod = interpolationMethod;
233 this.interpolationSamples = interpolationSamples;
234 this.referenceFrame = referenceFrame;
235 this.availableDerivatives = availableDerivatives;
236 }
237
238
239 @Override
240 public List<TimeStampedAngularCoordinates> getAngularCoordinates() {
241 return Collections.unmodifiableList(attitudeDataLines);
242 }
243
244
245 @Override
246 public Frame getReferenceFrame() {
247 return referenceFrame;
248 }
249
250
251 @Override
252 public AbsoluteDate getStart() {
253 return attitudeDataLines.get(0).getDate();
254 }
255
256
257 @Override
258 public AbsoluteDate getStop() {
259 return attitudeDataLines.get(attitudeDataLines.size() - 1).getDate();
260 }
261
262
263 @Override
264 public String getInterpolationMethod() {
265 return interpolationMethod;
266 }
267
268
269 @Override
270 public int getInterpolationSamples() {
271 return interpolationSamples;
272 }
273
274
275 @Override
276 public AngularDerivativesFilter getAvailableDerivatives() {
277 return availableDerivatives;
278 }
279
280
281 @Override
282 public BoundedAttitudeProvider getAttitudeProvider() {
283 return new TabulatedProvider(getAngularCoordinates(),
284 getInterpolationSamples(), getAvailableDerivatives(),
285 getStart(), getStop(),
286 new FixedFrameBuilder(getReferenceFrame()));
287 }
288
289 }
290
291 }