Commit 31cf4641 authored by Bryan Cazabonne's avatar Bryan Cazabonne
Browse files

Merge branch 'issue-653' into develop

parents 38b0b48f c5534071
......@@ -311,6 +311,9 @@
<contributor>
<name>Sofia Urbina</name>
</contributor>
<contributor>
<name>M&#233;lina Vanel</name>
</contributor>
</contributors>
<organization>
......
......@@ -76,6 +76,7 @@
AbstractAnalyticalPropagator <|-- AdapterPropagator
AbstractAnalyticalPropagator <|-- EcksteinHechlerPropagator
AbstractAnalyticalPropagator <|-- KeplerianPropagator
AbstractAnalyticalPropagator <|-- BrouwerLyddanePropagator
AbstractAnalyticalPropagator <|-- Ephemeris
BoundedPropagator <|.. Ephemeris
......
......@@ -57,6 +57,7 @@
class KeplerianPropagatorBuilder
class TLEPropagatorBuilder
class EcksteinHechlerPropagatorBuilder
class BrouwerLyddanePropagatorBuilder
interface PropagatorConverter {
+Propagator convert(Propagator source, double timeSpan, int nbPoints, Collection<String> freeParameters)
......@@ -87,6 +88,7 @@
PropagatorBuilder <|.. KeplerianPropagatorBuilder
PropagatorBuilder <|.. TLEPropagatorBuilder
PropagatorBuilder <|.. DSSTPropagatorBuilder
PropagatorBuilder <|.. BrouwerLyddanePropagatorBuilder
PropagatorBuilder <|.right. EcksteinHechlerPropagatorBuilder
PropagatorConverter <|.. AbstractPropagatorConverter
......
......@@ -55,6 +55,8 @@ public enum OrekitMessages implements Localizable {
ALMOST_CRITICALLY_INCLINED_ORBIT("almost critically inclined orbit (i = {0} degrees)"),
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS(
"unable to compute Eckstein-Hechler mean parameters after {0} iterations"),
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS(
"unable to compute Brouwer-Lyddane mean parameters after {0} iterations"),
UNABLE_TO_COMPUTE_TLE(
"unable to compute TLE after {0} iterations"),
NULL_PARENT_FOR_FRAME("null parent for frame {0}"),
......
/* Copyright 2002-2021 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.propagation.conversion;
import org.orekit.attitudes.AttitudeProvider;
import org.orekit.attitudes.InertialProvider;
import org.orekit.forces.gravity.potential.GravityFieldFactory;
import org.orekit.forces.gravity.potential.TideSystem;
import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
import org.orekit.orbits.Orbit;
import org.orekit.orbits.OrbitType;
import org.orekit.orbits.PositionAngle;
import org.orekit.propagation.Propagator;
import org.orekit.propagation.analytical.BrouwerLyddanePropagator;
/** Builder for Brouwer-Lyddane propagator.
* @author Melina Vanel
* @since 11.1
*/
public class BrouwerLyddanePropagatorBuilder extends AbstractPropagatorBuilder {
/** Provider for un-normalized coefficients. */
private final UnnormalizedSphericalHarmonicsProvider provider;
/** Build a new instance.
* <p>
* The template orbit is used as a model to {@link
* #createInitialOrbit() create initial orbit}. It defines the
* inertial frame, the central attraction coefficient, the orbit type, and is also
* used together with the {@code positionScale} to convert from the {@link
* org.orekit.utils.ParameterDriver#setNormalizedValue(double) normalized} parameters used by the
* callers of this builder to the real orbital parameters.
* </p>
*
* @param templateOrbit reference orbit from which real orbits will be built
* (note that the mu from this orbit will be overridden with the mu from the
* {@code provider})
* @param provider for un-normalized zonal coefficients
* @param positionAngle position angle type to use
* @param positionScale scaling factor used for orbital parameters normalization
* (typically set to the expected standard deviation of the position)
* @see #BrouwerLyddanePropagatorBuilder(Orbit,
* UnnormalizedSphericalHarmonicsProvider, PositionAngle, double, AttitudeProvider)
*/
public BrouwerLyddanePropagatorBuilder(final Orbit templateOrbit,
final UnnormalizedSphericalHarmonicsProvider provider,
final PositionAngle positionAngle,
final double positionScale) {
this(templateOrbit, provider, positionAngle, positionScale,
InertialProvider.of(templateOrbit.getFrame()));
}
/** Build a new instance.
* <p>
* The template orbit is used as a model to {@link
* #createInitialOrbit() create initial orbit}. It defines the
* inertial frame, the central attraction coefficient, the orbit type, and is also
* used together with the {@code positionScale} to convert from the {@link
* org.orekit.utils.ParameterDriver#setNormalizedValue(double) normalized} parameters used by the
* callers of this builder to the real orbital parameters.
* </p>
* @param templateOrbit reference orbit from which real orbits will be built
* (note that the mu from this orbit will be overridden with the mu from the
* {@code provider})
* @param provider for un-normalized zonal coefficients
* @param positionAngle position angle type to use
* @param positionScale scaling factor used for orbital parameters normalization
* (typically set to the expected standard deviation of the position)
* @param attitudeProvider attitude law to use.
*/
public BrouwerLyddanePropagatorBuilder(final Orbit templateOrbit,
final UnnormalizedSphericalHarmonicsProvider provider,
final PositionAngle positionAngle,
final double positionScale,
final AttitudeProvider attitudeProvider) {
super(overrideMu(templateOrbit, provider, positionAngle), positionAngle,
positionScale, true, attitudeProvider);
this.provider = provider;
}
/** Build a new instance.
* <p>
* The template orbit is used as a model to {@link
* #createInitialOrbit() create initial orbit}. It defines the
* inertial frame, the central attraction coefficient, the orbit type, and is also
* used together with the {@code positionScale} to convert from the {@link
* org.orekit.utils.ParameterDriver#setNormalizedValue(double) normalized} parameters used by the
* callers of this builder to the real orbital parameters.
* </p>
*
* @param templateOrbit reference orbit from which real orbits will be built
* (note that the mu from this orbit will be overridden with the mu from the
* {@code provider})
* @param referenceRadius reference radius of the Earth for the potential model (m)
* @param mu central attraction coefficient (m³/s²)
* @param tideSystem tide system
* @param c20 un-normalized zonal coefficient (about -1.08e-3 for Earth)
* @param c30 un-normalized zonal coefficient (about +2.53e-6 for Earth)
* @param c40 un-normalized zonal coefficient (about +1.62e-6 for Earth)
* @param c50 un-normalized zonal coefficient (about +2.28e-7 for Earth)
* @param orbitType orbit type to use
* @param positionAngle position angle type to use
* @param positionScale scaling factor used for orbital parameters normalization
* (typically set to the expected standard deviation of the position)
* @see #BrouwerLyddanePropagatorBuilder(Orbit,
* UnnormalizedSphericalHarmonicsProvider, PositionAngle, double, AttitudeProvider)
*/
public BrouwerLyddanePropagatorBuilder(final Orbit templateOrbit,
final double referenceRadius,
final double mu,
final TideSystem tideSystem,
final double c20,
final double c30,
final double c40,
final double c50,
final OrbitType orbitType,
final PositionAngle positionAngle,
final double positionScale) {
this(templateOrbit,
GravityFieldFactory.getUnnormalizedProvider(referenceRadius, mu, tideSystem,
new double[][] {
{
0
}, {
0
}, {
c20
}, {
c30
}, {
c40
}, {
c50
}
}, new double[][] {
{
0
}, {
0
}, {
0
}, {
0
}, {
0
}, {
0
}
}),
positionAngle, positionScale);
}
/** Override central attraction coefficient.
* @param templateOrbit template orbit
* @param provider gravity field provider
* @param positionAngle position angle type to use
* @return orbit with overridden central attraction coefficient
*/
private static Orbit overrideMu(final Orbit templateOrbit,
final UnnormalizedSphericalHarmonicsProvider provider,
final PositionAngle positionAngle) {
final double[] parameters = new double[6];
final double[] parametersDot = templateOrbit.hasDerivatives() ? new double[6] : null;
templateOrbit.getType().mapOrbitToArray(templateOrbit, positionAngle, parameters, parametersDot);
return templateOrbit.getType().mapArrayToOrbit(parameters, parametersDot, positionAngle,
templateOrbit.getDate(),
provider.getMu(),
templateOrbit.getFrame());
}
/** {@inheritDoc} */
public Propagator buildPropagator(final double[] normalizedParameters) {
setParameters(normalizedParameters);
return new BrouwerLyddanePropagator(createInitialOrbit(), getAttitudeProvider(),
provider);
}
}
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = banen er nær kritisk hældning (i = {0} grad
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = umuligt at udregne Eckstein-Hechler middelparametrene efter {0} iterationer
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = umuligt at udregne Brouwer-Lyddane middelparametrene efter {0} iterationer
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = umuligt at udregne TLE efter {0} iterationer
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = Umlaufbahn mit einer fast kritischen Inklinat
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = die Eckstein-Hechler Durchschnitt-Parameter können nicht berechnet werden nach {0} Iterationen
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = die Brouwer-Lyddane Durchschnitt-Parameter können nicht berechnet werden nach {0} Iterationen
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = die TLE können nicht berechnet werden nach {0} Iterationen
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = σχεδόν κρίσιμα κεκλιμέν
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = αδύνατο να υπολογιστούν οι Eckstein-Hechler μέσες παράμετροι μετά από {0} επαναλήψεις
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = αδύνατο να υπολογιστούν οι Brouwer-Lyddane μέσες παράμετροι μετά από {0} επαναλήψεις
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = αδύνατο να υπολογιστούν οι TLE μετά από {0} επαναλήψεις
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = almost critically inclined orbit (i = {0} deg
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = unable to compute Eckstein-Hechler mean parameters after {0} iterations
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = unable to compute Brouwer-Lyddane mean parameters after {0} iterations
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = unable to compute TLE after {0} iterations
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = órbita con inclinación casi crítica (i = {
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = después de {0} iteraciones no se han conseguido calcular los parámetros medios de Eckstein-Hechler
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = después de {0} iteraciones no se han conseguido calcular los parámetros medios de Brouwer-Lyddane
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = después de {0} iteraciones no se han conseguido calcular el TLE
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = orbite quasiment à inclinaison critique (i =
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = impossible de calculer les paramètres moyens au sens de Eckstein-Hechler après {0} itérations
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = impossible de calculer les paramètres moyens au sens de Brouwer-Lyddane après {0} itérations
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = impossible de calculer le TLE après {0} itérations
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = órbita case con inclinación critica (i = {0
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = imposible de calcula-los parámetros medios de Eckstein-Hechler despois de {0} iteracións
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = imposible de calcula-los parámetros medios de Brouwer-Lyddane despois de {0} iteracións
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = imposible de calcula-el TLE despois de {0} iteracións
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = orbita con inclinazione quasi critica (i = {0
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = impossibile calcolare i parametri medi secondo Eckstein-Hechler dopo {0} iterazioni
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = impossibile calcolare i parametri medi secondo Brouwer-Lyddane dopo {0} iterazioni
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = impossibile calcolare il TLE dopo {0} iterazioni
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = banen er nær kritisk helning (i = {0} grader
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = umulig å regne ut Eckstein-Hechlers middelsparameterene etter {0} iterasjoner
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = umulig å regne ut Brouwer-Lyddane middelsparameterene etter {0} iterasjoner
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = umulig å regne ut TLE etter {0} iterasjoner
......
......@@ -19,6 +19,9 @@ ALMOST_CRITICALLY_INCLINED_ORBIT = orbită cu înclinație aproape critică (i =
# unable to compute Eckstein-Hechler mean parameters after {0} iterations
UNABLE_TO_COMPUTE_ECKSTEIN_HECHLER_MEAN_PARAMETERS = imposibil de calculat parametrii medii Eckstein-Hechler după {0} iterații
# unable to compute Brouwer-Lyddane mean parameters after {0} iterations
UNABLE_TO_COMPUTE_BROUWER_LYDDANE_MEAN_PARAMETERS = imposibil de calculat parametrii medii Brouwer-Lyddane după {0} iterații
# unable to compute TLE after {0} iterations
UNABLE_TO_COMPUTE_TLE = imposibil de calculat TLE după {0} iterații
......
......@@ -280,6 +280,19 @@ If users need a more definitive initialization of an Eckstein-Hechler propagator
should consider using a propagator converter to initialize their Eckstein-Hechler
propagator using a complete sample instead of just a single initial orbit.
### Brouwer-Lyddane propagation
At the opposite of the Eckstein-Hechler model, the Brouwer-Lyddane model is
suited for elliptical orbits. In other words, there is no problem having a small
(or big) eccentricity or inclination. Lyddane helped to solve this issue with
the Brouwer model by summing the long and short periodic variations of the mean anomaly
with the ones of the argument of perigee. One needs still to be careful with
eccentricities lower than 5e-4. For singularity reason, the computation should not
be done for the critical inclination : 63.4°.
The Brouwer-Lyddane model considers J2 to J5 potential zonal coefficients, and uses the
mean and short periodic variation of the keplerian elements to compute the position.
### GNSS propagation
There are several dedicated models used for GNSS constellations propagation. These
......
......@@ -77,6 +77,7 @@
* analytical propagation models
* Kepler
* Eckstein-Heschler
* Brouwer-Lyddane
* SDP4/SGP4 with 2006 corrections
* GNSS: GPS, QZSS, Galileo, GLONASS, Beidou, IRNSS and SBAS
* numerical propagators
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment