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.frames.Frame;
24 import org.orekit.time.AbsoluteDate;
25 import org.orekit.time.FieldAbsoluteDate;
26 import org.orekit.time.FieldTimeInterpolator;
27 import org.orekit.time.TimeInterpolator;
28 import org.orekit.utils.AngularDerivativesFilter;
29 import org.orekit.utils.FieldPVCoordinatesProvider;
30 import org.orekit.utils.ImmutableTimeStampedCache;
31 import org.orekit.utils.PVCoordinatesProvider;
32 import org.orekit.utils.TimeStampedAngularCoordinates;
33 import org.orekit.utils.TimeStampedAngularCoordinatesHermiteInterpolator;
34 import org.orekit.utils.TimeStampedFieldAngularCoordinates;
35 import org.orekit.utils.TimeStampedFieldAngularCoordinatesHermiteInterpolator;
36
37
38
39
40
41
42
43
44 public class TabulatedProvider implements BoundedAttitudeProvider {
45
46
47 private final transient ImmutableTimeStampedCache<? extends TimeStampedAngularCoordinates> table;
48
49
50 private final AngularDerivativesFilter filter;
51
52
53 private final AbsoluteDate minDate;
54
55
56 private final AbsoluteDate maxDate;
57
58
59 private final AttitudeBuilder builder;
60
61
62
63
64
65
66
67
68
69
70
71 public TabulatedProvider(final Frame referenceFrame, final List<? extends TimeStampedAngularCoordinates> table,
72 final int n, final AngularDerivativesFilter filter) {
73 this(table, n, filter, table.get(0).getDate(), table.get(table.size() - 1).getDate(),
74 new FixedFrameBuilder(referenceFrame));
75 }
76
77
78
79
80
81
82
83
84
85
86 public TabulatedProvider(final List<? extends TimeStampedAngularCoordinates> table,
87 final int n, final AngularDerivativesFilter filter,
88 final AbsoluteDate minDate, final AbsoluteDate maxDate,
89 final AttitudeBuilder builder) {
90 this.table = new ImmutableTimeStampedCache<TimeStampedAngularCoordinates>(n, table);
91 this.filter = filter;
92 this.minDate = minDate;
93 this.maxDate = maxDate;
94 this.builder = builder;
95 }
96
97
98 public Attitude getAttitude(final PVCoordinatesProvider pvProv,
99 final AbsoluteDate date, final Frame frame) {
100
101
102 final List<TimeStampedAngularCoordinates> sample = table.getNeighbors(date).collect(Collectors.toList());
103
104
105 final TimeInterpolator<TimeStampedAngularCoordinates> interpolator =
106 new TimeStampedAngularCoordinatesHermiteInterpolator(sample.size(), filter);
107
108
109 final TimeStampedAngularCoordinates interpolated = interpolator.interpolate(date, sample);
110
111
112 return builder.build(frame, pvProv, interpolated);
113
114 }
115
116
117 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
118 final FieldAbsoluteDate<T> date,
119 final Frame frame) {
120
121
122 final List<TimeStampedFieldAngularCoordinates<T>> sample =
123 table.
124 getNeighbors(date.toAbsoluteDate()).
125 map(ac -> new TimeStampedFieldAngularCoordinates<>(date.getField(), ac)).
126 collect(Collectors.toList());
127
128
129 final FieldTimeInterpolator<TimeStampedFieldAngularCoordinates<T>, T> interpolator =
130 new TimeStampedFieldAngularCoordinatesHermiteInterpolator<>(sample.size(), filter);
131
132
133 final TimeStampedFieldAngularCoordinates<T> interpolated = interpolator.interpolate(date, sample);
134
135
136 return builder.build(frame, pvProv, interpolated);
137
138 }
139
140
141 public AbsoluteDate getMinDate() {
142 return minDate;
143 }
144
145
146 public AbsoluteDate getMaxDate() {
147 return maxDate;
148 }
149
150 }