Commit 43ae78a6 authored by Bryan Cazabonne's avatar Bryan Cazabonne
Browse files

Merge branch 'master' into develop

parents 5dbdae0f 0cac7e31
......@@ -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.1" />
<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.1</version>
<name>ORbit Extrapolation KIT</name>
<url>http://www.orekit.org/</url>
......
......@@ -20,7 +20,33 @@
<title>Orekit Changes</title>
</properties>
<body>
<release version="11.1" date="TBD" description="TBD">
<release version="11.0.1" date="2021-10-22"
description="Version 11.0.1 is a patch release of Orekit.
It fixes an important issue related to the calculation of the relativistic
clock correction for GNSS measurements. It also fixes bugs in OEM and CPF
files writing. Finally it includes some improvements in the class documentation">
<action dev="bryan" type="fix" issue="846">
Fixed wrong computation of relativistic clock correction for GNSS measurements.
</action>
<action dev="bryan" type="fix" issue="845">
Fixed parsing of Rinex clock files.
</action>
<action dev="bryan" type="fix" issue="844">
Fixed null pointer exception when constructing CPF from coordinates.
</action>
<action dev="bryan" type="update" issue="843">
Improved documentation of solar radiation pressure class to include
additional information about osculating bodies.
</action>
<action dev="sdinot" type="update" issue="842">
Used the latest version of Maven available in RedHat 8.
</action>
<action dev="pascal" type="fix" issue="839">
Fixed handling of time system in OemWriter.
</action>
<action dev="bryan" type="update" issue="838" due-to="Kendra Hale">
Improved documentation of ImpulseManeuver class.
</action>
</release>
<release version="11.0" date="2021-09-20"
description="Orekit 11.0 is a major new release.
......
......@@ -51,8 +51,8 @@ public class AbstractRelativisticClockModifier {
final TimeStampedPVCoordinates[] pv = estimated.getParticipants();
// Relativistic clock correction taking into account two-ways measurements
return pv.length < 3 ?
s * (dotProduct(pv[1]) - dotProduct(pv[0])) :
s * (dotProduct(pv[2]) - dotProduct(pv[1]));
s * (dotProduct(pv[0]) - dotProduct(pv[1])) :
s * (dotProduct(pv[1]) - dotProduct(pv[2]));
}
/** Get the scale factor used to compute relativistic effect.
......
......@@ -276,6 +276,16 @@ public class OemWriter extends AbstractMessageWriter<Header, OemSegment, Oem> {
// add an empty line for presentation
generator.newLine();
final ContextBinding oldContext = getContext();
setContext(new ContextBinding(oldContext::getConventions,
oldContext::isSimpleEOP,
oldContext::getDataContext,
oldContext::getParsedUnitsBehavior,
oldContext::getReferenceDate,
metadata::getTimeSystem,
oldContext::getClockCount,
oldContext::getClockRate));
// Start metadata
generator.enterSection(generator.getFormat() == FileFormat.KVN ?
KvnStructureKey.META.name() :
......
......@@ -18,9 +18,9 @@ package org.orekit.files.ilrs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.orekit.files.general.EphemerisFile;
......@@ -39,6 +39,9 @@ import org.orekit.utils.TimeStampedPVCoordinates;
*/
public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
/** Default satellite ID, used if header is null when initializing the ephemeris. */
public static final String DEFAULT_ID = "9999999";
/** Gravitational coefficient. */
private double mu;
......@@ -54,8 +57,8 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
/** CPF file header. */
private CPFHeader header;
/** List containing satellite information. */
private CPFEphemeris ephemeris;
/** Map containing satellite information. */
private Map<String, CPFEphemeris> ephemeris;
/** List of comments contained in the file. */
private List<String> comments;
......@@ -65,7 +68,7 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
*/
public CPF() {
this.mu = Double.NaN;
this.ephemeris = new CPFEphemeris();
this.ephemeris = new ConcurrentHashMap<>();
this.header = new CPFHeader();
this.comments = new ArrayList<>();
}
......@@ -75,12 +78,8 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
*/
@Override
public Map<String, CPFEphemeris> getSatellites() {
// Initialise an empty map
final Map<String, CPFEphemeris> satellites = new HashMap<>();
// Add the value
satellites.put(ephemeris.getId(), ephemeris);
// Return the map
return Collections.unmodifiableMap(satellites);
return Collections.unmodifiableMap(ephemeris);
}
/**
......@@ -109,10 +108,37 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
/**
* Adds a new P/V coordinate to the satellite.
* <p>
* If the header has not been read, the {@link #DEFAULT_ID} is used.
* </p>
* @param coord the P/V coordinate of the satellite
* @deprecated as of 11.0.1, replaced by {@link CPF#addSatelliteCoordinate(String, CPFCoordinate)}
*/
@Deprecated
public void addSatelliteCoordinate(final CPFCoordinate coord) {
ephemeris.coordinates.add(coord);
addSatelliteCoordinate(DEFAULT_ID, coord);
}
/**
* Adds a set of P/V coordinates to the satellite.
* @param id satellite ILRS identifier
* @param coord set of coordinates
* @since 11.0.1
*/
public void addSatelliteCoordinates(final String id, final List<CPFCoordinate> coord) {
createIfNeeded(id);
ephemeris.get(id).coordinates.addAll(coord);
}
/**
* Add a new P/V coordinates to the satellite.
* @param id satellite ILRS identifier
* @param coord the P/V coordinate of the satellite
* @since 11.0.1
*/
public void addSatelliteCoordinate(final String id, final CPFCoordinate coord) {
createIfNeeded(id);
ephemeris.get(id).coordinates.add(coord);
}
/**
......@@ -147,19 +173,46 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
this.filter = filter;
}
/**
* Create the satellite ephemeris corresponding to the given ID (if needed).
* @param id satellite ILRS identifier
*/
private void createIfNeeded(final String id) {
if (ephemeris.get(id) == null) {
ephemeris.put(id, new CPFEphemeris(id));
}
}
/** An ephemeris entry for a single satellite contains in a CPF file. */
public class CPFEphemeris
implements EphemerisFile.SatelliteEphemeris<CPFCoordinate, CPFEphemeris>,
EphemerisFile.EphemerisSegment<CPFCoordinate> {
/** Satellite ID. */
private final String id;
/** Ephemeris Data. */
private final List<CPFCoordinate> coordinates;
/** Constructor. */
/**
* Constructor.
* @deprecated as of 11.0.1, replaced by
*/
@Deprecated
public CPFEphemeris() {
this(null);
}
/**
* Constructor.
* @param id satellite ID
*/
public CPFEphemeris(final String id) {
this.id = id;
this.coordinates = new ArrayList<>();
}
/** {@inheritDoc} */
@Override
public Frame getFrame() {
......@@ -187,7 +240,7 @@ public class CPF implements EphemerisFile<CPF.CPFCoordinate, CPF.CPFEphemeris> {
/** {@inheritDoc} */
@Override
public String getId() {
return header.getIlrsSatelliteId();
return id == null ? DEFAULT_ID : id;
}
/** {@inheritDoc} */
......
......@@ -478,7 +478,7 @@ public class CPFParser implements EphemerisFileParser<CPF> {
// CPF coordinate
final CPF.CPFCoordinate coordinate = new CPF.CPFCoordinate(date, position, leap);
pi.file.addSatelliteCoordinate(coordinate);
pi.file.addSatelliteCoordinate(pi.file.getHeader().getIlrsSatelliteId(), coordinate);
}
......
......@@ -45,12 +45,19 @@ import org.orekit.utils.PVCoordinates;
* can also be a more elaborate {@link
* org.orekit.propagation.events.ApsideDetector apside event} for apogee
* maneuvers for example.</p>
* <p>The maneuver is defined by a single velocity increment in satellite
* frame. The current attitude of the spacecraft, defined by the current
* spacecraft state, will be used to compute the velocity direction in
* inertial frame. A typical case for tangential maneuvers is to use a
* {@link org.orekit.attitudes.LofOffset LOF aligned} attitude provider for state propagation and a
* velocity increment along the +X satellite axis.</p>
* <p>The maneuver is defined by a single velocity increment.
* If no AttitudeProvider is given, the current attitude of the spacecraft,
* defined by the current spacecraft state, will be used as the
* {@link AttitudeProvider} so the velocity increment should be given in
* the same pseudoinertial frame as the {@link SpacecraftState} used to
* construct the propagator that will handle the maneuver.
* If an AttitudeProvider is given, the velocity increment given should be
* defined appropriately in consideration of that provider. So, a typical
* case for tangential maneuvers is to provide a {@link org.orekit.attitudes.LofOffset LOF aligned}
* attitude provider along with a velocity increment defined in accordance with
* that LOF aligned attitude provider; e.g. if the LOF aligned attitude provider
* was constructed using LOFType.VNC the velocity increment should be
* provided in VNC coordinates.</p>
* <p>Beware that the triggering event detector must behave properly both
* before and after maneuver. If for example a node detector is used to trigger
* an inclination maneuver and the maneuver change the orbit to an equatorial one,
......
......@@ -51,7 +51,15 @@ import org.orekit.utils.ParameterDriver;
* Arnold et al recommend to use <b>D2B1</b> (i.e. <i>nD</i> = 1 and <i>nB</i> = 1) and
* <b>D4B1</b> (i.e. <i>nD</i> = 2 an <i>nB</i> = 1) configurations. At the opposite, in Arnold paper, it
* is recommend to not use <b>D2B0</b> (i.e. <i>nD</i> = 1 and <i>nB</i> = 0) configuration.
* </p>
* </p> <p>
* Since Orekit 11.0, it is possible to take into account
* the eclipses generated by Moon in the solar radiation
* pressure force model using the
* {@link #addOccultingBody(ExtendedPVCoordinatesProvider, double)}
* method.<br>
* <code> ECOM2 srp =</code>
* <code> new ECOM2(1, 1, 0.0, CelestialBodyFactory.getSun(), Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS);</code><br>
* <code> srp.addOccultingBody(CelestialBodyFactory.getMoon(), Constants.MOON_EQUATORIAL_RADIUS);</code><br>
*
* @see "Arnold, Daniel, et al, CODE’s new solar radiation pressure model for GNSS orbit determination,
* Journal of geodesy 89.8 (2015): 775-791."
......
......@@ -36,6 +36,18 @@ import org.orekit.utils.ExtendedPVCoordinatesProvider;
import org.orekit.utils.ParameterDriver;
/** Solar radiation pressure force model.
* <p>
* Since Orekit 11.0, it is possible to take into account
* the eclipses generated by Moon in the solar radiation
* pressure force model using the
* {@link #addOccultingBody(ExtendedPVCoordinatesProvider, double)}
* method.
* <p>
* Example:<br>
* <code> SolarRadiationPressure srp = </code>
* <code> new SolarRadiationPressure(CelestialBodyFactory.getSun(), Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS,</code>
* <code> new IsotropicRadiationClassicalConvention(50.0, 0.5, 0.5));</code><br>
* <code> srp.addOccultingBody(CelestialBodyFactory.getMoon(), Constants.MOON_EQUATORIAL_RADIUS);</code><br>
*
* @author Fabien Maussion
* @author &Eacute;douard Delente
......
......@@ -330,11 +330,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_PROGRAM);
}
},
/** Parser for generating program and emiting agency. */
......@@ -371,12 +366,6 @@ public class RinexClockParser {
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_COMMENT, HEADER_SYSTEM_OBS, HEADER_DCBS, HEADER_PCVS,
HEADER_TIME_SYSTEM, HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS);
}
},
/** Parser for comments. */
......@@ -393,11 +382,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_COMMENT, HEADER_SYSTEM_OBS, HEADER_TYPES_OF_DATA, HEADER_TIME_SYSTEM, HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS, HEADER_END);
}
},
/** Parser for satellite system and related observation types. */
......@@ -427,12 +411,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_SYSTEM_OBS, HEADER_COMMENT, HEADER_SYSTEM_OBS_CONTINUATION,
HEADER_TIME_SYSTEM, HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS);
}
},
/** Parser for continuation of satellite system and related observation types. */
......@@ -456,11 +434,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_SYSTEM_OBS, HEADER_TIME_SYSTEM, HEADER_COMMENT, HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS);
}
},
/** Parser for data time system. */
......@@ -481,11 +454,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS, HEADER_COMMENT, HEADER_DCBS, HEADER_PCVS, HEADER_TYPES_OF_DATA);
}
},
/** Parser for leap seconds. */
......@@ -504,11 +472,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_LEAP_SECONDS_GNSS, HEADER_DCBS, HEADER_PCVS, HEADER_COMMENT, HEADER_TYPES_OF_DATA, HEADER_NUMBER_OF_CLOCK_REF);
}
},
/** Parser for leap seconds GNSS. */
......@@ -527,11 +490,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_DCBS, HEADER_PCVS, HEADER_COMMENT, HEADER_TYPES_OF_DATA, HEADER_NUMBER_OF_CLOCK_REF);
}
},
/** Parser for applied differencial code bias corrections. */
......@@ -561,11 +519,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_DCBS, HEADER_PCVS, HEADER_COMMENT, HEADER_TYPES_OF_DATA, HEADER_NUMBER_OF_CLOCK_REF, HEADER_END);
}
},
/** Parser for applied phase center variation corrections. */
......@@ -595,11 +548,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_DCBS, HEADER_PCVS, HEADER_COMMENT, HEADER_NUMBER_OF_CLOCK_REF, HEADER_TYPES_OF_DATA, HEADER_END);
}
},
/** Parser for the different clock data types that are stored in the file. */
......@@ -623,11 +571,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_STATIONS_NAME, HEADER_COMMENT, HEADER_ANALYSIS_CENTER, HEADER_END);
}
},
/** Parser for the station with reference clock. */
......@@ -650,11 +593,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_STATION_CLOCK_REF, HEADER_COMMENT, HEADER_ANALYSIS_CENTER, HEADER_END);
}
},
/** Parser for the reference clock in case of calibration data. */
......@@ -670,11 +608,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_ANALYSIS_CENTER, HEADER_COMMENT, HEADER_END);
}
},
/** Parser for the analysis center. */
......@@ -698,12 +631,6 @@ public class RinexClockParser {
pi.file.setAnalysisCenterName(analysisCenterName);
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_NUMBER_OF_CLOCK_REF, HEADER_NUMBER_OF_SOLN_STATIONS, HEADER_DCBS, HEADER_PCVS,
HEADER_COMMENT, HEADER_LEAP_SECONDS, HEADER_LEAP_SECONDS_GNSS, HEADER_END);
}
},
/** Parser for the number of reference clocks over a period. */
......@@ -758,11 +685,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_ANALYSIS_CLOCK_REF, HEADER_COMMENT, HEADER_NUMBER_OF_SOLN_STATIONS, HEADER_NUMBER_OF_SOLN_SATS, HEADER_END);
}
},
/** Parser for the reference clock over a period. */
......@@ -797,12 +719,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_NUMBER_OF_CLOCK_REF, HEADER_ANALYSIS_CLOCK_REF, HEADER_NUMBER_OF_SOLN_STATIONS, HEADER_NUMBER_OF_SOLN_SATS,
HEADER_COMMENT, HEADER_END);
}
},
/** Parser for the number of stations embedded in the file and the related frame. */
......@@ -824,11 +740,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_SOLN_STATIONS, HEADER_COMMENT, HEADER_NUMBER_OF_SOLN_SATS, HEADER_END);
}
},
/** Parser for the stations embedded in the file and the related positions. */
......@@ -876,11 +787,6 @@ public class RinexClockParser {
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_SOLN_STATIONS, HEADER_COMMENT, HEADER_NUMBER_OF_SOLN_SATS, HEADER_END);
}
},
/** Parser for the number of satellites embedded in the file. */
......@@ -894,11 +800,6 @@ public class RinexClockParser {
// Do nothing...
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_PRN_LIST, HEADER_COMMENT, HEADER_END);
}
},
/** Parser for the satellites embedded in the file. */
......@@ -923,11 +824,6 @@ public class RinexClockParser {
}
}
/** {@inheritDoc} */
@Override
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_PRN_LIST, HEADER_COMMENT, HEADER_DCBS, HEADER_PCVS, HEADER_END);
}
},
/** Parser for the end of header. */
......@@ -1066,9 +962,19 @@ public class RinexClockParser {
public abstract void parse(String line, ParseInfo pi);
/** Get the allowed parsers for next line.
* <p>
* Because the standard only recommends an order for header keys,
* the default implementation of the method returns all the
* header keys. Specific implementations must overrides the method.
* </p>
* @return allowed parsers for next line
*/
public abstract Stream<LineParser> allowedNext();
public Stream<LineParser> allowedNext() {
return Stream.of(HEADER_PROGRAM, HEADER_COMMENT, HEADER_SYSTEM_OBS, HEADER_SYSTEM_OBS_CONTINUATION, HEADER_TIME_SYSTEM, HEADER_LEAP_SECONDS,
HEADER_LEAP_SECONDS_GNSS, HEADER_DCBS, HEADER_PCVS, HEADER_TYPES_OF_DATA, HEADER_STATIONS_NAME, HEADER_STATION_CLOCK_REF,
HEADER_ANALYSIS_CENTER, HEADER_NUMBER_OF_CLOCK_REF, HEADER_ANALYSIS_CLOCK_REF, HEADER_NUMBER_OF_SOLN_STATIONS,
HEADER_SOLN_STATIONS, HEADER_NUMBER_OF_SOLN_SATS, HEADER_PRN_LIST, HEADER_END);
}
/** Check if parser can handle line.
* @param line line to parse
......
......@@ -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": "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.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 |
......
......@@ -141,6 +141,7 @@ Math to Hipparchus
Orekit 10.3 | Hipparchus 1.8
Orekit 10.3.1 | Hipparchus 1.8
Orekit 11.0 | Hipparchus 2.0
Orekit 11.0.1 | Hipparchus 2.0
### Maven failed to compile Orekit and complained about a missing artifact.
......
......@@ -60,7 +60,7 @@ public class RelativisticClockInterSatellitesPhaseModifierTest {
final EstimatedMeasurement<InterSatellitesPhase> estimatedAfter = phase.estimate(0, 0, states);
// Verify
Assert.assertEquals(10.57, (estimatedBefore.getEstimatedValue()[0] - estimatedAfter.getEstimatedValue()[0]) * wavelength, 1.0e-2);
Assert.assertEquals(-10.57, (estimatedBefore.getEstimatedValue()[0] - estimatedAfter.getEstimatedValue()[0]) * wavelength, 1.0e-2);
Assert.assertEquals(0, modifier.getParametersDrivers().size());
}
......
......@@ -58,7 +58,7 @@ public class RelativisticClockInterSatellitesRangeModifierTest {
final EstimatedMeasurement<InterSatellitesRange> estimatedAfter = range.estimate(0, 0, states);
// Verify
Assert.assertEquals(10.57, estimatedBefore.getEstimatedValue()[0] - estimatedAfter.getEstimatedValue()[0], 1.0e-2);
Assert.assertEquals(-10.57, estimatedBefore.getEstimatedValue()[0] - estimatedAfter.getEstimatedValue()[0], 1.0e-2);
Assert.assertEquals(0, modifier.getParametersDrivers().size());
}
......