1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.conversion;
18
19 import org.orekit.attitudes.AttitudeProvider;
20 import org.orekit.attitudes.FrameAlignedProvider;
21 import org.orekit.estimation.leastsquares.AbstractBatchLSModel;
22 import org.orekit.estimation.leastsquares.BatchLSModel;
23 import org.orekit.estimation.leastsquares.ModelObserver;
24 import org.orekit.estimation.measurements.ObservedMeasurement;
25 import org.orekit.orbits.AbstractOrbitFactory;
26 import org.orekit.orbits.Orbit;
27 import org.orekit.orbits.PositionAngleType;
28 import org.orekit.propagation.SpacecraftState;
29 import org.orekit.propagation.SpacecraftStateInterpolator;
30 import org.orekit.propagation.covariance.StateCovariance;
31 import org.orekit.propagation.analytical.Ephemeris;
32 import org.orekit.time.TimeInterpolator;
33 import org.orekit.time.TimeStampedPair;
34 import org.orekit.utils.ParameterDriversList;
35
36 import java.util.ArrayList;
37 import java.util.List;
38
39
40
41
42
43
44
45
46 public class EphemerisPropagatorBuilder
47 extends AbstractPropagatorBuilder<Ephemeris, Orbit, AbstractOrbitFactory<Orbit>> {
48
49
50 private static final double DEFAULT_SCALE = 10.0;
51
52
53 private final List<SpacecraftState> states;
54
55
56 private final List<StateCovariance> covariances;
57
58
59 private final TimeInterpolator<SpacecraftState> stateInterpolator;
60
61
62 private final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator;
63
64
65 private final AttitudeProvider provider;
66
67
68
69
70
71
72
73
74
75
76 public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
77 final TimeInterpolator<SpacecraftState> stateInterpolator) {
78 this(states, stateInterpolator, states.isEmpty() ? null : new FrameAlignedProvider(states.getFirst().getFrame()));
79 }
80
81
82
83
84
85
86
87
88 public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
89 final TimeInterpolator<SpacecraftState> stateInterpolator,
90 final AttitudeProvider attitudeProvider) {
91 this(states, stateInterpolator, new ArrayList<>(), null, attitudeProvider);
92 }
93
94
95
96
97
98
99
100
101
102 public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
103 final int interpolationPoints,
104 final double extrapolationThreshold,
105 final AttitudeProvider attitudeProvider) {
106 this(states,
107 new SpacecraftStateInterpolator(interpolationPoints, extrapolationThreshold,
108 states.getFirst().getFrame(), states.getFirst().getFrame()),
109 attitudeProvider);
110 }
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
127 final TimeInterpolator<SpacecraftState> stateInterpolator,
128 final List<StateCovariance> covariances,
129 final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator) {
130 this(states, stateInterpolator, covariances, covarianceInterpolator,
131 states.isEmpty() ? null : new FrameAlignedProvider(states.getFirst().getFrame()));
132 }
133
134
135
136
137
138
139
140
141
142
143 public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
144 final TimeInterpolator<SpacecraftState> stateInterpolator,
145 final List<StateCovariance> covariances,
146 final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator,
147 final AttitudeProvider attitudeProvider) {
148 super((AbstractOrbitFactory<Orbit>) states.getFirst().getOrbit().factory(PositionAngleType.TRUE, DEFAULT_SCALE),
149 false, attitudeProvider);
150 deselectDynamicParameters();
151
152
153 Ephemeris.checkInputConsistency(states, stateInterpolator, covariances, covarianceInterpolator);
154
155 this.states = states;
156 this.stateInterpolator = stateInterpolator;
157 this.covariances = covariances == null ? new ArrayList<>() : covariances;
158 this.covarianceInterpolator = covarianceInterpolator;
159 this.provider = attitudeProvider;
160 }
161
162
163
164
165 private EphemerisPropagatorBuilder(final EphemerisPropagatorBuilder builder) {
166 this(builder.states, builder.stateInterpolator, builder.covariances,
167 builder.covarianceInterpolator, builder.getAttitudeProvider());
168 }
169
170
171 @Override
172 public EphemerisPropagatorBuilder clone() {
173
174 final EphemerisPropagatorBuilder clonedBuilder = (EphemerisPropagatorBuilder) super.clone();
175
176
177 final EphemerisPropagatorBuilder builder = new EphemerisPropagatorBuilder(clonedBuilder);
178
179
180 builder.setMass(getMass());
181
182
183 return builder;
184 }
185
186
187 @Override
188 public Ephemeris buildPropagator(final double[] normalizedParameters) {
189 if (!covariances.isEmpty() && covarianceInterpolator != null) {
190 return new Ephemeris(states, stateInterpolator, covariances, covarianceInterpolator, provider);
191 }
192 return new Ephemeris(states, stateInterpolator, provider);
193
194 }
195
196
197 @Override
198 public AbstractBatchLSModel buildLeastSquaresModel(final PropagatorBuilder[] builders,
199 final List<ObservedMeasurement<?>> measurements,
200 final ParameterDriversList estimatedMeasurementsParameters,
201 final ModelObserver observer) {
202 return new BatchLSModel(builders, measurements, estimatedMeasurementsParameters, observer);
203 }
204
205 }