1   /* Copyright 2022 Bryan Cazabonne
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * Bryan Cazabonne licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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.Orbit;
26  import org.orekit.orbits.PositionAngleType;
27  import org.orekit.propagation.Propagator;
28  import org.orekit.propagation.SpacecraftState;
29  import org.orekit.propagation.SpacecraftStateInterpolator;
30  import org.orekit.propagation.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   * Builder for Ephemeris propagator.
41   *
42   * @author Bryan Cazabonne
43   * @author Vincent Cucchietti
44   * @since 11.3
45   */
46  public class EphemerisPropagatorBuilder extends AbstractPropagatorBuilder {
47  
48      /** Default position scale (not used for ephemeris based estimation). */
49      private static final double DEFAULT_SCALE = 10.0;
50  
51      /** List of spacecraft states. */
52      private final List<SpacecraftState> states;
53  
54      /** List of covariances. **/
55      private final List<StateCovariance> covariances;
56  
57      /** Spacecraft state interpolator. */
58      private final TimeInterpolator<SpacecraftState> stateInterpolator;
59  
60      /** State covariance interpolator. */
61      private final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator;
62  
63      /** Attitude provider. */
64      private final AttitudeProvider provider;
65  
66      /**
67       * Constructor using the default attitude provider.
68       * <p>
69       * The default attitude provider is an {@link org.orekit.attitudes.FrameAlignedProvider inertial provider} built from the frame of the first
70       * spacecraft state instance in given list
71       *
72       * @param states list of spacecraft states
73       * @param stateInterpolator spacecraft state interpolator
74       */
75      public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
76                                        final TimeInterpolator<SpacecraftState> stateInterpolator) {
77          this(states, stateInterpolator, states.isEmpty() ? null : new FrameAlignedProvider(states.get(0).getFrame()));
78      }
79  
80      /**
81       * Constructor.
82       *
83       * @param states list of spacecraft states
84       * @param stateInterpolator spacecraft state interpolator
85       * @param attitudeProvider attitude law to use
86       */
87      public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
88                                        final TimeInterpolator<SpacecraftState> stateInterpolator,
89                                        final AttitudeProvider attitudeProvider) {
90          this(states, stateInterpolator, new ArrayList<>(), null, attitudeProvider);
91      }
92  
93      /**
94       * Constructor.
95       *
96       * @param states list of spacecraft states
97       * @param interpolationPoints number of interpolation points
98       * @param extrapolationThreshold extrapolation threshold beyond which the propagation will fail
99       * @param attitudeProvider attitude law to use
100      */
101     public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
102                                       final int interpolationPoints,
103                                       final double extrapolationThreshold,
104                                       final AttitudeProvider attitudeProvider) {
105         this(states,
106              new SpacecraftStateInterpolator(interpolationPoints, extrapolationThreshold,
107                                              states.get(0).getFrame(), states.get(0).getFrame()),
108              attitudeProvider);
109     }
110 
111     /**
112      * Constructor with covariances and default attitude provider.
113      * <p>
114      * The default attitude provider is an {@link FrameAlignedProvider inertial provider} built from the frame of the first
115      * spacecraft state instance in given list
116      *
117      * @param states list of spacecraft states
118      * @param stateInterpolator spacecraft state interpolator
119      * @param covariances tabulated covariances associated to tabulated states
120      * @param covarianceInterpolator covariance interpolator
121      *
122      * @see StateCovariance
123      * @see FrameAlignedProvider
124      */
125     public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
126                                       final TimeInterpolator<SpacecraftState> stateInterpolator,
127                                       final List<StateCovariance> covariances,
128                                       final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator) {
129         this(states, stateInterpolator, covariances, covarianceInterpolator,
130              states.isEmpty() ? null : new FrameAlignedProvider(states.get(0).getFrame()));
131     }
132 
133     /**
134      * Constructor.
135      *
136      * @param states list of spacecraft states
137      * @param stateInterpolator spacecraft state interpolator
138      * @param covariances tabulated covariances associated to tabulated states
139      * @param covarianceInterpolator covariance interpolator
140      * @param attitudeProvider attitude law to use
141      */
142     public EphemerisPropagatorBuilder(final List<SpacecraftState> states,
143                                       final TimeInterpolator<SpacecraftState> stateInterpolator,
144                                       final List<StateCovariance> covariances,
145                                       final TimeInterpolator<TimeStampedPair<Orbit, StateCovariance>> covarianceInterpolator,
146                                       final AttitudeProvider attitudeProvider) {
147         super(states.get(0).getOrbit(), PositionAngleType.TRUE, DEFAULT_SCALE, false, attitudeProvider);
148         deselectDynamicParameters();
149 
150         // Check input consistency the same way Ephemeris is checking consistency
151         Ephemeris.checkInputConsistency(states, stateInterpolator, covariances, covarianceInterpolator);
152 
153         this.states                 = states;
154         this.stateInterpolator      = stateInterpolator;
155         this.covariances            = covariances == null ? new ArrayList<>() : covariances;
156         this.covarianceInterpolator = covarianceInterpolator;
157         this.provider               = attitudeProvider;
158     }
159 
160     /** {@inheritDoc} */
161     @Override
162     public EphemerisPropagatorBuilder copy() {
163         return new EphemerisPropagatorBuilder(states, stateInterpolator, covariances, covarianceInterpolator, provider);
164     }
165 
166     /** {@inheritDoc}. */
167     @Override
168     public Propagator buildPropagator(final double[] normalizedParameters) {
169         if (!covariances.isEmpty() && covarianceInterpolator != null) {
170             return new Ephemeris(states, stateInterpolator, covariances, covarianceInterpolator, provider);
171         }
172         return new Ephemeris(states, stateInterpolator, provider);
173 
174     }
175 
176     /** {@inheritDoc} */
177     @Override
178     public AbstractBatchLSModel buildLeastSquaresModel(final PropagatorBuilder[] builders,
179                                                        final List<ObservedMeasurement<?>> measurements,
180                                                        final ParameterDriversList estimatedMeasurementsParameters,
181                                                        final ModelObserver observer) {
182         return new BatchLSModel(builders, measurements, estimatedMeasurementsParameters, observer);
183     }
184 
185 }