Commit 9e309047 authored by Bryan Cazabonne's avatar Bryan Cazabonne
Browse files

Merge branch 'master' into develop

parents ac37bc10 03e90e38
......@@ -2,7 +2,7 @@
<project name="orekit" default="jar" basedir=".">
<property name="project.version" value="11.1-SNAPSHOT" />
<property name="project.version" value="11.0.2" />
<property name="src.dir" location="src" />
<property name="main.src.dir" value="${src.dir}/main/java" />
......
......@@ -5,7 +5,7 @@
<groupId>org.orekit</groupId>
<artifactId>orekit</artifactId>
<packaging>jar</packaging>
<version>11.1-SNAPSHOT</version>
<version>11.0.2</version>
<name>ORbit Extrapolation KIT</name>
<url>http://www.orekit.org/</url>
......@@ -269,6 +269,9 @@
<contributor>
<name>Lars N&#230;sbye Christensen</name>
</contributor>
<contributor>
<name>Emmanuel Papanagiotou</name>
</contributor>
<contributor>
<name>Thomas Paulet</name>
</contributor>
......
......@@ -20,7 +20,27 @@
<title>Orekit Changes</title>
</properties>
<body>
<release version="11.1" date="TBD" description="TBD">
<release version="11.0.2" date="2021-11-24"
description="Version 11.0.2 is a patch release of Orekit.
It fixes an important issue related to the handling of indexes
when building the state transition matrix in multi satellites
orbit determination. It also fixes bugs in TLE and CRD files.
Finally it includes an update of the release guide.">
<action dev="bryan" type="fix" issue="859" due-to="Emmanuel Papanagiotou">
Allowed custom setting of state to TLE conversion in propagator builder.
</action>
<action dev="bryan" type="fix" issue="847">
Fixed handling of comments in CRD files.
</action>
<action dev="bryan" type="fix" issue="851">
Fixed deserialization of TLE caused by the bStarParameterDriver.
</action>
<action dev="bryan" type="fix" issue="850">
Fixed indexes when build state transition matrix for multi sat Kalman.
</action>
<action dev="sdinot" type="update">
Updated the release guide to remove actions that are no longer required.
</action>
</release>
<release version="11.0.1" date="2021-10-22"
description="Version 11.0.1 is a patch release of Orekit.
......
......@@ -688,6 +688,9 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
// loop over all orbits
for (int k = 0; k < predictedSpacecraftStates.length; ++k) {
// Indexes
final int[] indK = covarianceIndirection[k];
// Short period derivatives
analyticalDerivativeComputations(mappers[k], predictedSpacecraftStates[k]);
......@@ -700,10 +703,9 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
builders.get(k).getOrbitalParametersDrivers().getDrivers();
for (int i = 0; i < dYdY0.length; ++i) {
if (drivers.get(i).isSelected()) {
int jOrb = orbitsStartColumns[k];
for (int j = 0; j < dYdY0[i].length; ++j) {
if (drivers.get(j).isSelected()) {
stm.setEntry(i, jOrb++, dYdY0[i][j]);
stm.setEntry(indK[i], indK[j], dYdY0[i][j]);
}
}
}
......@@ -718,7 +720,7 @@ public abstract class AbstractKalmanModel implements KalmanEstimation, NonLinear
// Fill 1st row, 2nd column (dY/dPp)
for (int i = 0; i < dYdPp.length; ++i) {
for (int j = 0; j < nbParams; ++j) {
stm.setEntry(i, orbitsEndColumns[k] + j, dYdPp[i][j]);
stm.setEntry(indK[i], indK[j + 6], dYdPp[i][j]);
}
}
......
......@@ -247,7 +247,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H2);
return Stream.of(H2, COMMENTS);
}
},
......@@ -283,7 +283,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H3);
return Stream.of(H3, COMMENTS);
}
},
......@@ -320,7 +320,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H4);
return Stream.of(H4, COMMENTS);
}
},
......@@ -385,7 +385,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H5, C0);
return Stream.of(H5, C0, COMMENTS);
}
},
......@@ -412,7 +412,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C0);
return Stream.of(C0, COMMENTS);
}
},
......@@ -444,7 +444,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C1, C2, C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C1, C2, C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -481,7 +481,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C2, C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C2, C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -528,7 +528,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C3, C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -562,7 +562,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C4, C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -605,7 +605,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C5, C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -638,7 +638,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C6, C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -676,7 +676,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(C7, TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -693,7 +693,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(TEN, ELEVEN, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -723,7 +723,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, TEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, TEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -754,7 +754,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, ELEVEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, ELEVEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -771,7 +771,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, TEN, ELEVEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, TEN, ELEVEN, TWELVE, METEO, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -803,7 +803,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, METEO_SUPP, TEN, ELEVEN, TWELVE, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, METEO_SUPP, TEN, ELEVEN, TWELVE, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -820,7 +820,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, METEO_SUPP, TEN, ELEVEN, TWELVE, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, METEO_SUPP, TEN, ELEVEN, TWELVE, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -865,7 +865,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, TEN, ELEVEN, ANGLES, CALIB, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, TEN, ELEVEN, ANGLES, CALIB, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -882,7 +882,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -899,7 +899,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -916,7 +916,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -933,7 +933,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, H8);
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, H8, COMMENTS);
}
},
......@@ -950,7 +950,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY);
return Stream.of(H8, METEO, CALIB, CALIB_DETAILS, CALIB_SHOT, TEN, ELEVEN, TWELVE, ANGLES, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -971,7 +971,9 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H1, H2, H3, H4, H5, H8, C0, C1, C2, C3, C4, C5, C6, C7);
return Stream.of(H1, H2, H3, H4, H5, H8, H9, C0, C1, C2, C3, C4, C5, C6, C7, TEN, ELEVEN, TWELVE, METEO,
METEO_SUPP, ANGLES, CALIB, CALIB_DETAILS, CALIB_SHOT, STAT, COMPATIBILITY, COMMENTS);
}
},
......@@ -1001,7 +1003,7 @@ public class CRDParser {
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(H1, H9);
return Stream.of(H1, H9, COMMENTS);
}
},
......
......@@ -1014,4 +1014,46 @@ public class TLE implements TimeStamped, Serializable {
return Collections.singletonList(bStarParameterDriver);
}
/** Replace the instance with a data transfer object for serialization.
* @return data transfer object that will be serialized
*/
private Object writeReplace() {
return new DataTransferObject(line1, line2, utc);
}
/** Internal class used only for serialization. */
private static class DataTransferObject implements Serializable {
/** Serializable UID. */
private static final long serialVersionUID = -1596648022319057689L;
/** First line. */
private String line1;
/** Second line. */
private String line2;
/** The UTC scale. */
private final TimeScale utc;
/** Simple constructor.
* @param line1 the first element (69 char String)
* @param line2 the second element (69 char String)
* @param utc the UTC time scale
*/
DataTransferObject(final String line1, final String line2, final TimeScale utc) {
this.line1 = line1;
this.line2 = line2;
this.utc = utc;
}
/** Replace the deserialized data transfer object with a {@link TLE}.
* @return replacement {@link TLE}
*/
private Object readResolve() {
return new TLE(line1, line2, utc);
}
}
}
......@@ -46,12 +46,24 @@ import org.orekit.utils.ParameterDriversList;
*/
public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements OrbitDeterminationPropagatorBuilder {
/** Default value for epsilon. */
private static final double EPSILON_DEFAULT = 1.0e-10;
/** Default value for maxIterations. */
private static final int MAX_ITERATIONS_DEFAULT = 100;
/** Data context used to access frames and time scales. */
private final DataContext dataContext;
/** Template TLE. */
private final TLE templateTLE;
/** Threshold for convergence used in TLE generation. */
private final double epsilon;
/** Maximum number of iterations for convergence used in TLE generation. */
private final int maxIterations;
/** Build a new instance. This constructor uses the {@link DataContext#getDefault()
* default data context}.
* <p>
......@@ -61,6 +73,9 @@ public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements O
* classification, .... and is also used together with the {@code positionScale} to
* convert from the {@link ParameterDriver#setNormalizedValue(double) normalized}
* parameters used by the callers of this builder to the real orbital parameters.
* </p><p>
* Using this constructor, {@link #EPSILON_DEFAULT} and {@link #MAX_ITERATIONS_DEFAULT}
* are used for spacecraft's state to TLE transformation
* </p>
* @param templateTLE reference TLE from which real orbits will be built
* @param positionAngle position angle type to use
......@@ -83,6 +98,9 @@ public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements O
* classification, .... and is also used together with the {@code positionScale} to
* convert from the {@link ParameterDriver#setNormalizedValue(double) normalized}
* parameters used by the callers of this builder to the real orbital parameters.
* </p><p>
* Using this constructor, {@link #EPSILON_DEFAULT} and {@link #MAX_ITERATIONS_DEFAULT}
* are used for spacecraft's state to TLE transformation
* </p>
* @param templateTLE reference TLE from which real orbits will be built
* @param positionAngle position angle type to use
......@@ -90,11 +108,65 @@ public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements O
* (typically set to the expected standard deviation of the position)
* @param dataContext used to access frames and time scales.
* @since 10.1
* @see #TLEPropagatorBuilder(TLE, PositionAngle, double, DataContext, double, int)
*/
public TLEPropagatorBuilder(final TLE templateTLE,
final PositionAngle positionAngle,
final double positionScale,
final DataContext dataContext) {
this(templateTLE, positionAngle, positionScale, dataContext, EPSILON_DEFAULT, MAX_ITERATIONS_DEFAULT);
}
/** Build a new instance. This constructor uses the {@link DataContext#getDefault()
* default data context}.
* <p>
* The template TLE is used as a model to {@link
* #createInitialOrbit() create initial orbit}. It defines the
* inertial frame, the central attraction coefficient, orbit type, satellite number,
* classification, .... and is also used together with the {@code positionScale} to
* convert from the {@link ParameterDriver#setNormalizedValue(double) normalized}
* parameters used by the callers of this builder to the real orbital parameters.
* </p>
* @param templateTLE reference TLE from which real orbits will be built
* @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 epsilon used to compute threshold for convergence check
* @param maxIterations maximum number of iterations for convergence
* @since 11.0.2
* @see #TLEPropagatorBuilder(TLE, PositionAngle, double, DataContext, double, int)
*/
@DefaultDataContext
public TLEPropagatorBuilder(final TLE templateTLE, final PositionAngle positionAngle,
final double positionScale, final double epsilon,
final int maxIterations) {
this(templateTLE, positionAngle, positionScale, DataContext.getDefault(), epsilon, maxIterations);
}
/** Build a new instance.
* <p>
* The template TLE is used as a model to {@link
* #createInitialOrbit() create initial orbit}. It defines the
* inertial frame, the central attraction coefficient, orbit type, satellite number,
* classification, .... and is also used together with the {@code positionScale} to
* convert from the {@link ParameterDriver#setNormalizedValue(double) normalized}
* parameters used by the callers of this builder to the real orbital parameters.
* </p>
* @param templateTLE reference TLE from which real orbits will be built
* @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 dataContext used to access frames and time scales.
* @param epsilon used to compute threshold for convergence check
* @param maxIterations maximum number of iterations for convergence
* @since 11.0.2
*/
public TLEPropagatorBuilder(final TLE templateTLE,
final PositionAngle positionAngle,
final double positionScale,
final DataContext dataContext,
final double epsilon,
final int maxIterations) {
super(TLEPropagator.selectExtrapolator(templateTLE, dataContext.getFrames())
.getInitialState().getOrbit(),
positionAngle, positionScale, false,
......@@ -102,9 +174,10 @@ public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements O
for (final ParameterDriver driver : templateTLE.getParametersDrivers()) {
addSupportedParameter(driver);
}
this.templateTLE = templateTLE;
this.dataContext = dataContext;
this.templateTLE = templateTLE;
this.dataContext = dataContext;
this.epsilon = epsilon;
this.maxIterations = maxIterations;
}
/** {@inheritDoc} */
......@@ -119,7 +192,7 @@ public class TLEPropagatorBuilder extends AbstractPropagatorBuilder implements O
final TimeScale utc = dataContext.getTimeScales().getUTC();
// TLE related to the orbit
final TLE tle = TLE.stateToTLE(state, templateTLE, utc, teme);
final TLE tle = TLE.stateToTLE(state, templateTLE, utc, teme, epsilon, maxIterations);
final List<ParameterDriver> drivers = templateTLE.getParametersDrivers();
for (int index = 0; index < drivers.size(); index++) {
if (drivers.get(index).isSelected()) {
......
......@@ -45,7 +45,7 @@ with groupID org.orekit and artifactId orekit so maven
internal mechanism will download automatically all artifacts and dependencies
as required.
#set ( $versions = {"11.0.1": "2021-10-22", "11.0": "2021-09-20", "10.3.1": "2021-06-16", "10.3": "2020-12-21", "10.2": "2020-07-14", "10.1": "2020-02-19", "10.0": "2019-06-24", "9.3.1": "2019-03-16", "9.3": "2019-01-25", "9.2": "2018-05-26","9.1": "2017-11-26","9.0.1": "2017-11-03","9.0": "2017-07-26","8.0.1": "2017-11-03","8.0": "2016-06-30","7.2.1": "2017-11-03","7.2": "2016-04-05","7.1": "2016-02-07","7.0": "2015-01-11","6.1": "2013-12-13","6.0": "2013-04-23","5.0.3": "2011-07-13","5.0.2": "2011-07-11","5.0.1": "2011-04-18"} )
#set ( $versions = {"11.0.2": "2021-11-24", "11.0.1": "2021-10-22", "11.0": "2021-09-20", "10.3.1": "2021-06-16", "10.3": "2020-12-21", "10.2": "2020-07-14", "10.1": "2020-02-19", "10.0": "2019-06-24", "9.3.1": "2019-03-16", "9.3": "2019-01-25", "9.2": "2018-05-26","9.1": "2017-11-26","9.0.1": "2017-11-03","9.0": "2017-07-26","8.0.1": "2017-11-03","8.0": "2016-06-30","7.2.1": "2017-11-03","7.2": "2016-04-05","7.1": "2016-02-07","7.0": "2015-01-11","6.1": "2013-12-13","6.0": "2013-04-23","5.0.3": "2011-07-13","5.0.2": "2011-07-11","5.0.1": "2011-04-18"} )
#foreach( $version in $versions.entrySet() )
| package | link |
......
......@@ -142,6 +142,7 @@ Math to Hipparchus
Orekit 10.3.1 | Hipparchus 1.8
Orekit 11.0 | Hipparchus 2.0
Orekit 11.0.1 | Hipparchus 2.0
Orekit 11.0.2 | Hipparchus 2.0
### Maven failed to compile Orekit and complained about a missing artifact.
......
......@@ -35,10 +35,12 @@ import org.orekit.estimation.EstimationTestUtils;
import org.orekit.estimation.measurements.AngularAzElMeasurementCreator;
import org.orekit.estimation.measurements.AngularRaDecMeasurementCreator;
import org.orekit.estimation.measurements.InterSatellitesRangeMeasurementCreator;
import org.orekit.estimation.measurements.MultiplexedMeasurement;
import org.orekit.estimation.measurements.ObservableSatellite;
import org.orekit.estimation.measurements.ObservedMeasurement;
import org.orekit.estimation.measurements.PVMeasurementCreator;
import org.orekit.estimation.measurements.Position;
import org.orekit.estimation.measurements.PositionMeasurementCreator;
import org.orekit.estimation.measurements.Range;
import org.orekit.estimation.measurements.RangeMeasurementCreator;
import org.orekit.estimation.measurements.RangeRateMeasurementCreator;
......@@ -847,12 +849,12 @@ public class KalmanEstimatorTest {
new double[] { 38.3, 172.3 }, new double[] { 0.1, 0.1 },
new double[] { 0.015, 0.068 }, new double[] { 1.0e-3, 1.0e-3 },
new double[][] {
{ 5.6e5, 1.8e5, 1.9e5 },
{ 5.3e5, 1.8e5, 1.8e5 }
{ 6.9e5, 6.0e5, 12.5e5 },
{ 6.8e5, 5.9e5, 12.7e5 }
}, new double[] { 1e4, 1e4 },
new double[][] {
{ 8.8e2, 1.8e2, 3.1e2 },
{ 8.8e2, 1.8e2, 3.1e2 }
{ 5.0e2, 5.3e2, 1.4e2 },
{ 5.0e2, 5.3e2, 1.4e2 }
}, new double[] { 1.0e1, 1.0e1 });
// after the call to estimate, the parameters lacking a user-specified reference date
......@@ -1091,12 +1093,12 @@ public class KalmanEstimatorTest {
new double[] { 38.3, 172.3 }, new double[] { 0.1, 0.1 },
new double[] { 0.015, 0.068 }, new double[] { 1.0e-3, 1.0e-3 },
new double[][] {
{ 5.6e5, 1.8e5, 1.9e5 },
{ 5.3e5, 1.8e5, 1.8e5 }
{ 6.9e5, 6.0e5, 12.5e5 },
{ 6.8e5, 5.9e5, 12.7e5 }
}, new double[] { 1e4, 1e4 },
new double[][] {
{ 8.8e2, 1.8e2, 3.1e2 },
{ 8.8e2, 1.8e2, 3.1e2 }
{ 5.0e2, 5.3e2, 1.4e2 },
{ 5.0e2, 5.3e2, 1.4e2 }
}, new double[] { 1.0e1, 1.0e1 });
// after the call to estimate, the parameters lacking a user-specified reference date
......@@ -1113,6 +1115,74 @@ public class KalmanEstimatorTest {
}
@Test
public void tesIssue850() {
Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
// Create propagator builder
final NumericalPropagatorBuilder propagatorBuilder1 =
context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
1.0e-6, 60.0, 1.0);
propagatorBuilder1.getPropagationParametersDrivers().getDrivers().forEach(driver -> driver.setSelected(true));
final NumericalPropagatorBuilder propagatorBuilder2 =
context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
1.0e-6, 60.0, 1.0);
propagatorBuilder2.getPropagationParametersDrivers().getDrivers().forEach(driver -> driver.setSelected(true));
// Generate measurement for both propagators
final Propagator propagator1 = EstimationTestUtils.createPropagator(context.initialOrbit,
propagatorBuilder1);
final List<ObservedMeasurement<?>> measurements1 =