Commit 08fc73c1 authored by Luc Maisonobe's avatar Luc Maisonobe

Merge branch 'develop' into gnss-attitude

parents 733bd2f8 e31f4bf5
......@@ -26,7 +26,7 @@
<orekit.maven-bundle-plugin.version>3.3.0</orekit.maven-bundle-plugin.version>
<orekit.maven-changes-plugin.version>2.12.1</orekit.maven-changes-plugin.version>
<orekit.maven-checkstyle-plugin.version>2.17</orekit.maven-checkstyle-plugin.version>
<orekit.checkstyle.version>8.4</orekit.checkstyle.version>
<orekit.checkstyle.version>8.10</orekit.checkstyle.version>
<orekit.maven-clean-plugin.version>3.0.0</orekit.maven-clean-plugin.version>
<orekit.maven-compiler-plugin.version>3.6.1</orekit.maven-compiler-plugin.version>
<orekit.maven-javadoc-plugin.version>2.10.4</orekit.maven-javadoc-plugin.version>
......
/* Copyright 2002-2018 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (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.estimation.measurements;
import org.orekit.time.TimeStamped;
/** Base interface for comparing measurements regardless of thei type.
* @author Luc Maisonobe
* @since 9.2
*/
public interface ComparableMeasurement extends TimeStamped, Comparable<ComparableMeasurement> {
/** Get the observed value.
* <p>
* The observed value is the value that was measured by the instrument.
* </p>
* @return observed value (array of size {@link #getDimension()}
*/
double[] getObservedValue();
/** {@inheritDoc}
* <p>
* Measurements comparison is primarily chronological, but measurements
* with the same date are sorted based on the observed value. Even if they
* have the same value too, they will <em>not</em> be considered equal if they
* correspond to different instances. This allows to store measurements in
* {@link java.util.SortedSet SortedSet} without losing any measurements, even
* redundant ones.
* </p>
*/
@Override
default int compareTo(final ComparableMeasurement other) {
if (this == other) {
// only case where measurements are considered equal
return 0;
}
int result = getDate().compareTo(other.getDate());
if (result == 0) {
// simultaneous measurements, we compare values
final double[] thisV = getObservedValue();
final double[] otherV = other.getObservedValue();
if (thisV.length > otherV.length) {
result = +1;
} else if (thisV.length < otherV.length) {
result = 1;
} else {
for (int i = 0; i < thisV.length && result == 0; ++i) {
result = Double.compare(thisV[i], otherV[i]);
}
if (result == 0) {
// measurements have the same value,
// but we do not want them to appear as equal
// we set up an arbitrary order
result = -1;
}
}
}
return result;
}
}
......@@ -24,7 +24,6 @@ import org.orekit.errors.OrekitIllegalArgumentException;
import org.orekit.errors.OrekitMessages;
import org.orekit.propagation.SpacecraftState;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeStamped;
import org.orekit.utils.ParameterDriver;
import org.orekit.utils.TimeStampedPVCoordinates;
......@@ -33,8 +32,7 @@ import org.orekit.utils.TimeStampedPVCoordinates;
* @author Luc Maisonobe
* @since 8.0
*/
public class EstimatedMeasurement<T extends ObservedMeasurement<T>>
implements TimeStamped, Comparable<EstimatedMeasurement<T>> {
public class EstimatedMeasurement<T extends ObservedMeasurement<T>> implements ComparableMeasurement {
/** Associated observed measurement. */
private final T observedMeasurement;
......@@ -148,6 +146,12 @@ public class EstimatedMeasurement<T extends ObservedMeasurement<T>>
return observedMeasurement.getDate().durationFrom(states[0].getDate());
}
/** {@inheritDoc} */
@Override
public double[] getObservedValue() {
return observedMeasurement.getObservedValue();
}
/** Get the estimated value.
* @return estimated value
*/
......@@ -275,17 +279,6 @@ public class EstimatedMeasurement<T extends ObservedMeasurement<T>>
parametersDerivatives.put(driver, parameterDerivatives);
}
/** {@inheritDoc}
* <p>
* Measurements comparison is based on the underlying observed measurement only.
* </p>
* @since 9.2
*/
@Override
public int compareTo(final EstimatedMeasurement<T> other) {
return observedMeasurement.compareTo(other.getObservedMeasurement());
}
/** Enumerate for the status of the measurement. */
public enum Status {
......
......@@ -20,7 +20,6 @@ import java.util.List;
import org.orekit.errors.OrekitException;
import org.orekit.propagation.SpacecraftState;
import org.orekit.time.TimeStamped;
import org.orekit.utils.ParameterDriver;
......@@ -42,8 +41,7 @@ import org.orekit.utils.ParameterDriver;
* @author Luc Maisonobe
* @since 8.0
*/
public interface ObservedMeasurement<T extends ObservedMeasurement<T>>
extends TimeStamped, Comparable<ObservedMeasurement<?>> {
public interface ObservedMeasurement<T extends ObservedMeasurement<T>> extends ComparableMeasurement {
/** Enable or disable a measurement.
* <p>
......@@ -101,14 +99,6 @@ public interface ObservedMeasurement<T extends ObservedMeasurement<T>>
*/
double[] getBaseWeight();
/** Get the observed value.
* <p>
* The observed value is the value that was measured by the instrument.
* </p>
* @return observed value (array of size {@link #getDimension()}
*/
double[] getObservedValue();
/** Add a modifier.
* <p>
* The modifiers are applied in the order in which they are added in order to
......@@ -159,49 +149,4 @@ public interface ObservedMeasurement<T extends ObservedMeasurement<T>>
EstimatedMeasurement<T> estimate(int iteration, int evaluation, SpacecraftState[] states)
throws OrekitException;
/** {@inheritDoc}
* <p>
* Measurements comparison is primarily chronological, but measurements
* with the same date are sorted based on the observed value. Even if they
* have the same value too, they will <em>not</em> be considered equal if they
* correspond to different instances. This allows to store measurements in
* {@link java.util.SortedSet SortedSet} without losing any measurements, even
* redundant ones.
* </p>
* @since 9.2
*/
@Override
default int compareTo(final ObservedMeasurement<?> other) {
if (this == other) {
// only case where measurements are considered equal
return 0;
}
int result = getDate().compareTo(other.getDate());
if (result == 0) {
// simultaneous measurements, we compare values
final double[] thisV = getObservedValue();
final double[] otherV = other.getObservedValue();
if (thisV.length > otherV.length) {
result = +1;
} else if (thisV.length < otherV.length) {
result = 1;
} else {
for (int i = 0; i < thisV.length && result == 0; ++i) {
result = Double.compare(thisV[i], otherV[i]);
}
if (result == 0) {
// measurements have the same value,
// but we do not want them to appear as equal
// we set up an arbitrary order
result = -1;
}
}
}
return result;
}
}
......@@ -165,7 +165,6 @@ public class UnivariateProcessNoise extends AbstractCovarianceMatrixProvider {
* @param previous previous state
* @param current current state
* @return physical (i.e. non normalized) orbital process noise matrix in inertial frame
* @exception OrekitException if matrix cannot be computed
*/
private RealMatrix getInertialOrbitalProcessNoiseMatrix(final SpacecraftState previous,
final SpacecraftState current) {
......
......@@ -119,7 +119,7 @@ public class MariniMurrayModel implements TroposphericModel {
*
* See: Giacomo, P., Equation for the dertermination of the density of moist air, Metrologia, V. 18, 1982
*
* @param rh relative humidity, in percent.
* @param rh relative humidity, in percent (50% -&gt; 0.5).
* @return the water vapor, in mbar (1 mbar = 100 Pa).
*/
private double getWaterVapor(final double rh) {
......@@ -134,7 +134,7 @@ public class MariniMurrayModel implements TroposphericModel {
// enhancement factor, equation (4) of reference paper
final double fw = 1.00062 + (3.14 * 1e-6) * P0 + (5.6 * 1e-7) * FastMath.pow(T0 - 273.15, 2);
final double e = (rh / 100.0) * fw * es;
final double e = rh * fw * es;
return e;
}
}
......@@ -180,6 +180,8 @@ discrete events. Here is a short list of the features offered by the library:</p
<li>orbit referenced attitudes (LOF aligned, offset on all axes)</li>
<li>space referenced attitudes (inertial, celestial body-pointed, spin-stabilized)</li>
<li>tabulated attitudes, either respective to inertial frame or respective to Local Orbital Frames</li>
<li>specific law for GNSS satellites: GPS (block IIA, block IIF, block IIF),
GLONASS, GALILEO, BEIDOU (GEO, IGSO, MEO)</li>
</ul>
</li>
</ul>
......@@ -219,6 +221,8 @@ discrete events. Here is a short list of the features offered by the library:</p
<li>right ascension/declination</li>
<li>position-velocity</li>
<li>inter-satellites range (one way and two way)</li>
<li>GNSS code</li>
<li>GNSS phase</li>
</ul>
</li>
<li>possibility to add custom measurements</li>
......
......@@ -20,6 +20,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
......@@ -27,9 +28,9 @@ import java.util.TreeSet;
import org.orekit.data.DataLoader;
import org.orekit.data.DataProvidersManager;
import org.orekit.errors.OrekitException;
import org.orekit.errors.OrekitInternalError;
import org.orekit.errors.OrekitMessages;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.ChronologicalComparator;
import org.orekit.time.TimeStamped;
import org.orekit.utils.PVCoordinates;
......@@ -125,7 +126,7 @@ public class TLESeries implements DataLoader {
filterLaunchNumber = -1;
filterLaunchPiece = null;
tles = new TreeSet<TimeStamped>(new ChronologicalComparator());
tles = new TreeSet<TimeStamped>(new TLEComparator());
previous = null;
next = null;
......@@ -418,4 +419,29 @@ public class TLESeries implements DataLoader {
return (TLE) tles.last();
}
/** Comparator allowing different TLEs at same date (see issue 411).
* @since 9.2
*/
private static class TLEComparator implements Comparator<TimeStamped> {
/** {@inheritDoc} */
@Override
public int compare(final TimeStamped timeStamped1, final TimeStamped timeStamped2) {
final int dateCompare = timeStamped1.getDate().compareTo(timeStamped2.getDate());
if (dateCompare == 0 && timeStamped1 instanceof TLE && timeStamped2 instanceof TLE) {
try {
final TLE tle1 = (TLE) timeStamped1;
final TLE tle2 = (TLE) timeStamped2;
final int line1Compare = tle1.getLine1().compareTo(tle2.getLine1());
return (line1Compare == 0) ?
tle1.getLine2().compareTo(tle2.getLine2()) :
line1Compare;
} catch (OrekitException oe) {
// this should never happen
throw new OrekitInternalError(oe);
}
}
return dateCompare;
}
}
}
......@@ -608,7 +608,7 @@ public abstract class AbstractIntegratedPropagator extends AbstractPropagator {
throws OrekitException {
// main state
SpacecraftState state = stateMapper.mapArrayToState(t, y, yDot, true); //not sure of the mean orbit, should be true
SpacecraftState state = stateMapper.mapArrayToState(t, y, yDot, meanOrbit);
// pre-integrated additional states
state = updateAdditionalStates(state);
......
......@@ -952,6 +952,28 @@ public class DSSTPropagator extends AbstractIntegratedPropagator {
this.forceModels = forceModels;
}
/** {@inheritDoc} */
@Override
public void init(final ODEStateAndDerivative initialState, final double finalTime)
throws OrekitExceptionWrapper {
try {
// Build the mean state interpolated at initial point
final SpacecraftState meanStates = mapper.mapArrayToState(0.0,
initialState.getPrimaryState(),
initialState.getPrimaryDerivative(),
true);
// Compute short periodic coefficients for this point
for (DSSTForceModel forceModel : forceModels) {
forceModel.updateShortPeriodTerms(meanStates);
}
} catch (OrekitException oe) {
throw new OrekitExceptionWrapper(oe);
}
}
/** {@inheritDoc} */
@Override
public void handleStep(final ODEStateInterpolator interpolator, final boolean isLast)
......
......@@ -38,7 +38,7 @@ FRAME_ANCESTOR_OF_NEITHER_FRAME = sistemul de coordonate {0} nu este un strămo
FRAME_NO_NTH_ANCESTOR = sistemul de coordonate {0} are nivelul {1}, nu poate avea un strămoș cu {2} nivele deasupra
# ITRF frame {0} not found
NO_SUCH_ITRF_FRAME = <MISSING TRANSLATION>
NO_SUCH_ITRF_FRAME = sistemul de coordonate ITRF cu numele {0} nu a fost găsit
# unsupported local orbital frame, supported types: {0} and {1}
UNSUPPORTED_LOCAL_ORBITAL_FRAME = sistem orbital de coordonate nesuportat, tipuri suportate: {0} și {1}
......@@ -359,7 +359,7 @@ DSST_ECC_NO_NUMERICAL_AVERAGING_METHOD = Orbita curentă are o eccentricitate {0
SP3_UNSUPPORTED_VERSION = versiunea fișierului sp3 {0} nesuportată
# found {0} epochs in file {1}, expected {2}
SP3_NUMBER_OF_EPOCH_MISMATCH = <MISSING TRANSLATION>
SP3_NUMBER_OF_EPOCH_MISMATCH = găsite {0} date de referință în fișierul {1}, așteptate {2}
# unexpected end of file in sp3 file (after line {0})
SP3_UNEXPECTED_END_OF_FILE = sfârșit neașteptat al fișierului sp3 (după linia {0})
......@@ -458,46 +458,46 @@ NO_REFERENCE_DATE_FOR_PARAMETER = nicio dată de referință nu este specificat
STATION_NOT_FOUND = stația {0} nu a fost găsită, stații cunoscute: {1}
# unknown satellite system {0}
UNKNOWN_SATELLITE_SYSTEM = <MISSING TRANSLATION>
UNKNOWN_SATELLITE_SYSTEM = sistemul de sateliți {0} este necunoscut
# unknown satellite antenna code {0}
UNKNOWN_SATELLITE_ANTENNA_CODE = <MISSING TRANSLATION>
UNKNOWN_SATELLITE_ANTENNA_CODE = codul {0} de antenă satelit este necunoscut
# cannot find satellite {0} in satellite system {1}
CANNOT_FIND_SATELLITE_IN_SYSTEM = <MISSING TRANSLATION>
CANNOT_FIND_SATELLITE_IN_SYSTEM = imposibil de găsit satelitul {0} in sistemul de sateliți {1}
# unknown RINEX frequency {0} in file {1}, line {2}
UNKNOWN_RINEX_FREQUENCY = <MISSING TRANSLATION>
UNKNOWN_RINEX_FREQUENCY = frecventa RINEX {0} din fișierul {1}, linia {2} este necunoscută
# mismatched frequencies in file {0}, line {1} (expected {2}, got {3})
MISMATCHED_FREQUENCIES = <MISSING TRANSLATION>
MISMATCHED_FREQUENCIES = frecvențe nepotrivite în fișierul {0}, linia {1} (așteptate {2}, găsite {3})
# wrong number of columns in file {0}, line {1} (expected {2} columns, got {3} columns)
WRONG_COLUMNS_NUMBER = <MISSING TRANSLATION>
WRONG_COLUMNS_NUMBER = număr incorect de coloane în fișierul {0}, linia {1} (așteptate {2} coloane, găsite {3} coloane)
# unsupported format for file {0}
UNSUPPORTED_FILE_FORMAT = <MISSING TRANSLATION>
UNSUPPORTED_FILE_FORMAT = formatul de fișier {0} nu este suportat
# incomplete header in file {0}
INCOMPLETE_HEADER = <MISSING TRANSLATION>
INCOMPLETE_HEADER = antet incomplet în fișierul {0}
# inconsistent number of satellites in line {0}, file {1}: observation with {2} satellites and number of max satellites is {3}
INCONSISTENT_NUMBER_OF_SATS = <MISSING TRANSLATION>
INCONSISTENT_NUMBER_OF_SATS = inconsistență în numărul de sateliți de la linia {0}, fișier {1}: observații cu {2} sateliți iar numărul maxim de sateliți este {3}
# the satellite system {3} from line {0}, file {1} is not consistent with the Rinex Satellite System {2} in header
INCONSISTENT_SATELLITE_SYSTEM = <MISSING TRANSLATION>
INCONSISTENT_SATELLITE_SYSTEM = sistemul de sateliți {3} de la linia {0}, fișier {1} nu este în concordanță cu Sistemul de Sateliți Sinex {2} din antet
# no propagator configured
NO_PROPAGATOR_CONFIGURED = <MISSING TRANSLATION>
NO_PROPAGATOR_CONFIGURED = niciun propagator nu este configurat
# dimension {0} is inconsistent with parameters list: {1}
DIMENSION_INCONSISTENT_WITH_PARAMETERS = <MISSING TRANSLATION>
DIMENSION_INCONSISTENT_WITH_PARAMETERS = dimensiunea {0} este inconsistentă cu lista de parametrii: {1}
# file {0} is not a supported Unix-compressed file
NOT_A_SUPPORTED_UNIX_COMPRESSED_FILE = <MISSING TRANSLATION>
NOT_A_SUPPORTED_UNIX_COMPRESSED_FILE = fișierul {0} nu este o arhiva validă UNIX
# unexpected end of file {0}
UNEXPECTED_END_OF_FILE = <MISSING TRANSLATION>
UNEXPECTED_END_OF_FILE = final neașteptat al fișierului {0}
# file {0} is corrupted
CORRUPTED_FILE = <MISSING TRANSLATION>
CORRUPTED_FILE = fișierul {0} este corupt
......@@ -163,6 +163,7 @@
* orbit referenced attitudes (LOF aligned, offset on all axes),
* space referenced attitudes (inertial, celestial body-pointed, spin-stabilized)
* tabulated attitudes, either respective to inertial frame or respective to Local Orbital Frames
* specific law for GNSS satellites: GPS (block IIA, block IIF, block IIF), GLONASS, GALILEO, BEIDOU (GEO, IGSO, MEO)
* Orbit determination
......@@ -196,6 +197,8 @@
* right ascension/declination
* position-velocity
* inter-satellites range (one way and two way)
* GNSS code
* GNSS phase
* possibility to add custom measurements
* several predefined modifiers
......
......@@ -21,12 +21,40 @@
</properties>
<body>
<release version="9.2" date="TBD" description="TBD">
<action dev="luc" type="fix">
Fixed error in relative humidity units in Marini-Marray tropospheric model.
Fixes issue #352.
</action>
<action dev="luc" type="fix">
Fixed DSST events detection in the osculating case.
Fixes issue #398.
</action>
<action dev="luc" type="fix">
Allow several TLE with same date in TLESeries.
Fixes issue #411.
</action>
<action dev="luc" type="fix">
Fixed compilation problems with JDK 1.8
Fixes issue #462.
</action>
<action dev="luc" type="add" >
Added specific attitude mode for GNSS satellites: GPS (block IIA, block IIF, block IIF),
GLONASS, GALILEO, BEIDOU (GEO, IGSO, MEO). This is still considered experimental as there
are some problems when Sun crosses the orbital plane during a midnight/noon turn maneuver
(which is a rare event but nevertheless occurs)
</action>
<action dev="luc" type="add" >
Added natural order for observed measurements primarily based on
chronological order, but with also value comparisons if measurements
are simultaneous (which occurs a lot in GNSS), and ensuring no
measurements are lost if stored in SortedSet
</action>
<action dev="luc" type="add" due-to="Albert Alcarraz García">
Added GNSS code measurements
</action>
<action dev="luc" type="add" due-to="Albert Alcarraz García">
Added GNSS phase measurements (very basic implementation for now, not usable as is)
</action>
<action dev="luc" type="add" due-to="Albert Alcarraz García">
Added loading of RINEX observation files (versions 2 and 3)
</action>
......
......@@ -41,7 +41,7 @@ public class DataProvidersManagerTest {
DataProvidersManager.getInstance().clearProviders();
Assert.assertFalse(DataProvidersManager.getInstance().isSupported(new DirectoryCrawler(new File(getPath("regular-data")))));
Assert.assertTrue(DataProvidersManager.getInstance().feed(".*", crawler));
Assert.assertEquals(22, crawler.getCount());
Assert.assertEquals(18, crawler.getCount());
}
@Test
......@@ -53,13 +53,17 @@ public class DataProvidersManagerTest {
Assert.assertFalse(manager.isSupported(new DirectoryCrawler(new File(getPath("regular-data")))));
Assert.assertEquals(0, manager.getLoadedDataNames().size());
CountingLoader tleCounter = new CountingLoader(false);
Assert.assertTrue(manager.feed(".*\\.tle$", tleCounter));
Assert.assertEquals(4, tleCounter.getCount());
Assert.assertEquals(4, manager.getLoadedDataNames().size());
Assert.assertFalse(manager.feed(".*\\.tle$", tleCounter));
Assert.assertEquals(0, tleCounter.getCount());
Assert.assertEquals(0, manager.getLoadedDataNames().size());
CountingLoader txtCounter = new CountingLoader(false);
Assert.assertTrue(manager.feed(".*\\.txt$", txtCounter));
Assert.assertEquals(5, txtCounter.getCount());
Assert.assertEquals(5, manager.getLoadedDataNames().size());
CountingLoader de405Counter = new CountingLoader(false);
Assert.assertTrue(manager.feed(".*\\.405$", de405Counter));
Assert.assertEquals(4, de405Counter.getCount());
Assert.assertEquals(8, manager.getLoadedDataNames().size());
Assert.assertEquals(9, manager.getLoadedDataNames().size());
manager.clearLoadedDataNames();
Assert.assertEquals(0, manager.getLoadedDataNames().size());
}
......@@ -75,7 +79,7 @@ public class DataProvidersManagerTest {
} catch (OrekitException oe) {
// expected
}
Assert.assertEquals(22, crawler.getCount());
Assert.assertEquals(18, crawler.getCount());
}
@Test
......@@ -190,9 +194,9 @@ public class DataProvidersManagerTest {
DataProvidersManager.getInstance().addFilter(filter);
CountingLoader crawler = new CountingLoader(false);
Assert.assertTrue(DataProvidersManager.getInstance().feed(".*", crawler));
Assert.assertEquals(22, crawler.getCount());
Assert.assertEquals(22, filter.getFilteredCount());
Assert.assertEquals(22, filter.getOpenedCount());
Assert.assertEquals(18, crawler.getCount());
Assert.assertEquals(18, filter.getFilteredCount());
Assert.assertEquals(18, filter.getOpenedCount());
}
@Test
......@@ -203,8 +207,8 @@ public class DataProvidersManagerTest {
DataProvidersManager.getInstance().addFilter(filter);
CountingLoader crawler = new CountingLoader(false);
Assert.assertTrue(DataProvidersManager.getInstance().feed(".*", crawler));
Assert.assertEquals(22, crawler.getCount());
Assert.assertEquals(22 * layers, filter.getOpenedCount());
Assert.assertEquals(18, crawler.getCount());
Assert.assertEquals(18 * layers, filter.getOpenedCount());
}
private static class CountingLoader implements DataLoader {
......
......@@ -31,7 +31,7 @@ public class OrekitMessagesTest {
@Test
public void testMessageNumber() {
Assert.assertEquals(167, OrekitMessages.values().length);
Assert.assertEquals(168, OrekitMessages.values().length);
}
@Test
......
......@@ -69,7 +69,7 @@ public class MariniMurrayModelTest {
double height = 0;
double elevation = 10;
double expectedValue = 13.25126;
double expectedValue = 13.26069;
double actualValue = model.pathDelay(FastMath.toRadians(elevation), height);
Assert.assertEquals(expectedValue, actualValue, 1.0e-5);
......
......@@ -247,9 +247,23 @@ public class TLESeriesTest {
Assert.assertEquals(tleFrame.getName(), FramesFactory.getFrame(Predefined.TEME).getName());
}
@Test
public void testIssue411() throws IOException, OrekitException {
TLESeries series = new TLESeries("^same-date-tle.txt$", false);
series.loadTLEData(-1);
TLE first = series.getFirst();
TLE last = series.getLast();
Assert.assertEquals(16908, first.getSatelliteNumber());
Assert.assertEquals(16908, last.getSatelliteNumber());
Assert.assertNotSame(first, last);
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
Utils.setDataRoot("regular-data:tle/tle-series");
}
}
\ No newline at end of file
1 16908U 86061A 08034.91387914 -.00000083 00000-0 10000-3 0 9998
2 16908 050.0095 254.1054 0011516 027.3846 332.7593 12.44459732645435
1 16908U 86061A 08034.91387914 -.00000083 +00000-0 +10000-3 0 9998
2 16908 050.0095 254.1054 0011516 027.3846 332.7593 12.44459732645435
Markdown is supported
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