Orekit issueshttps://gitlab.orekit.org/orekit/orekit/-/issues2024-01-16T09:42:31Zhttps://gitlab.orekit.org/orekit/orekit/-/issues/1303Feature request: implement STKEphemerisFile writer2024-01-16T09:42:31ZqmorFeature request: implement STKEphemerisFile writerPlease see https://forum.orekit.org/t/stkephemerisfile-writer/3192/1Please see https://forum.orekit.org/t/stkephemerisfile-writer/3192/1https://gitlab.orekit.org/orekit/orekit/-/issues/1302Add getStaticInverse to StaticTransform (plus Field)2024-01-24T08:01:37ZRomain SerraAdd getStaticInverse to StaticTransform (plus Field)Since `Transform` implement `StaticTransform`, they already have a `getInverse` method returning a full `Transform`. If for example the inverse is only needed to operate on position (and not `PVCoordinates`), then there is superfluous co...Since `Transform` implement `StaticTransform`, they already have a `getInverse` method returning a full `Transform`. If for example the inverse is only needed to operate on position (and not `PVCoordinates`), then there is superfluous computations performed in the inversion. A new getStaticInverse allows to get a purely-static, light-weight version12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1301Increase visibility of private methods in Maneuver2024-01-16T15:44:46ZMaxime JournotIncrease visibility of private methods in ManeuverIn `forces.Maneuver` class, methods:
- getPropulsionModelParameters (double and field version)
- getManeuverTriggersParameters (double and field version)
are private. However, it's nice to be able to get these parameters when subclassin...In `forces.Maneuver` class, methods:
- getPropulsionModelParameters (double and field version)
- getManeuverTriggersParameters (double and field version)
are private. However, it's nice to be able to get these parameters when subclassing or wrapping `Maneuver`.
I suggest to make them `public`.12.1Christopher SchankChristopher Schankhttps://gitlab.orekit.org/orekit/orekit/-/issues/1300Regression: Ephemeris with interpolationPoints=12024-03-15T13:26:43ZEvan WardRegression: Ephemeris with interpolationPoints=1As a user I would like to use an `Ephemeris` with interpolationOrder=1, i.e. step-wise interpolation. This was possible in Orekit 11.x, but no longer possible in Orekit 12.0.
Failing test case (Credit Sander Cochran):
```java
/* Ep...As a user I would like to use an `Ephemeris` with interpolationOrder=1, i.e. step-wise interpolation. This was possible in Orekit 11.x, but no longer possible in Orekit 12.0.
Failing test case (Credit Sander Cochran):
```java
/* Ephemeris propagate fails for interpolation point value of 1 */
@Test
void testMinInterpolationPoints() {
// GIVEN
final AbsoluteDate initialDate = new AbsoluteDate();
final Orbit initialOrbit = TestUtils.getDefaultOrbit(initialDate);
// Setup propagator
final Orbit finalOrbit = initialOrbit.shiftedBy(1);
final List<SpacecraftState> states = new ArrayList<>();
states.add(new SpacecraftState(initialOrbit));
states.add(new SpacecraftState(finalOrbit));
final Ephemeris ephemeris = new Ephemeris(states, 1);
// WHEN & THEN
// Error thrown when there is more than one state in ephemeris and interpolation points is 1
ephemeris.propagate(ephemeris.getMaxDate());
}
```12.0.2Evan WardEvan Wardhttps://gitlab.orekit.org/orekit/orekit/-/issues/1299Add support for Intelsat's 11 elements propagation2024-01-14T12:32:30ZBryan CazabonneAdd support for Intelsat's 11 elements propagationThe ITU-R defines a standard for the propagation of the “Intelsat’s 11 elements”. Those elements are used by some ground operators for geostationary satellites. The format is available here: https://www.itu.int/dms_pubrec/itu-r/rec/s/r-r...The ITU-R defines a standard for the propagation of the “Intelsat’s 11 elements”. Those elements are used by some ground operators for geostationary satellites. The format is available here: https://www.itu.int/dms_pubrec/itu-r/rec/s/r-rec-s.1525-0-200106-s!!pdf-e.pdf
The idea of propagating Intelsat’s 11 elements for geostationary satellites is close to GNSS almanac propagation for navigation satellites: No orbital perturbations in the equations, only elements to PV conversion.
The propagator shall extend `AbstractAnalyticalPropagator`.
This propagator in available in STK. We can validate the Orekit-based implementation with STK. We can also use some Intelsat data to validate it.12.1Bryan CazabonneBryan Cazabonnehttps://gitlab.orekit.org/orekit/orekit/-/issues/1298CPF parser ignores direction flag - causing an exception later2024-03-11T09:45:33ZM. VeltenCPF parser ignores direction flag - causing an exception later**The Problem**
Tested with Orekit 12.0.1.
As described in the [forum](https://forum.orekit.org/t/cpf-parser-ignores-direction-flag-causing-an-exception-later/3112), the CPF parser (`org.orekit.files.ilrs.CPFParser:470`) ignores the di...**The Problem**
Tested with Orekit 12.0.1.
As described in the [forum](https://forum.orekit.org/t/cpf-parser-ignores-direction-flag-causing-an-exception-later/3112), the CPF parser (`org.orekit.files.ilrs.CPFParser:470`) ignores the direction flag of position lines - index 1 in the generated array:
~~~java
/** Position values. */
TEN("10") {
/** {@inheritDoc} */
@Override
public void parse(final String line, final ParseInfo pi) {
// Data contained in the line
final String[] values = SEPARATOR.split(line);
// Epoch
final int mjd = Integer.parseInt(values[2]);
~~~
The direction flag is ignored for the other implemented line type parser (20), too.
The possible directional flag values are, according to the [CPF documentation (page 15)](https://ilrs.gsfc.nasa.gov/docs/2018/cpf_2.00h-1.pdf):
~~~
Common epoch (0):
instantaneous vector between geocenter and target, without light-time iteration. This epoch is the same as found in the corresponding old TIV format.
Transmit (1):
position vector contains light-time iterated travel time from the geocenter to the target at the transmit epoch.
Receive (2):
position vector contains light-time iterated travel time from the target to the geocenter at the receive epoch.
(The sign of each element is opposite to that of the transmit vector.)
~~~
For objects on the moon (apollo11, apollo 15 luna17 and luna21 on https://edc.dgfi.tum.de/pub/slr/cpf_predicts_v2/current) the inbound and outbound position vectors are given for the same time:
~~~
H1 CPF 2 OPA 2024 01 03 18 003 1 apollo11 OPA_ELP96
H2 100 100 0 2024 1 4 0 0 0 2024 1 8 23 45 0 900 0 1 0 0 0 3
H9
10 1 60313 0.0 0 16126075.681 398785441.280 -26042850.417
10 2 60313 0.0 0 -16202176.985 -398701851.546 26035563.466
30 1 -741. -40216. 3643. 26.9
10 1 60313 900.0 0 41473086.247 396893016.626 -26449307.496
10 2 60313 900.0 0 -41543554.533 -396804772.095 26442015.393
30 1 -3370. -40078. 3646. 26.9
~~~
**The outcome**
This causes an exception when interpolating between the points, because the time difference is zero:
~~~java
Exception in thread "main" org.hipparchus.exception.MathIllegalArgumentException: duplicated abscissa 0 causes division by zero
at org.hipparchus.analysis.interpolation.HermiteInterpolator.addSamplePoint(HermiteInterpolator.java:113)
at org.orekit.utils.TimeStampedPVCoordinatesHermiteInterpolator.lambda$interpolate$0(TimeStampedPVCoordinatesHermiteInterpolator.java:148)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
at org.orekit.utils.TimeStampedPVCoordinatesHermiteInterpolator.interpolate(TimeStampedPVCoordinatesHermiteInterpolator.java:146)
at org.orekit.utils.TimeStampedPVCoordinatesHermiteInterpolator.interpolate(TimeStampedPVCoordinatesHermiteInterpolator.java:39)
at org.orekit.time.AbstractTimeInterpolator.interpolate(AbstractTimeInterpolator.java:91)
at org.orekit.files.general.EphemerisSegmentPropagator.getPVCoordinates(EphemerisSegmentPropagator.java:115)
~~~
**Test-code**
This exception can be generated with this code snippet:
~~~
CPF cpfFile = new CPFParser().parse(new DataSource("satellite.cpf", new DataSource.ReaderOpener()
{
@Override
public Reader openOnce() throws IOException
{
return new StringReader("H1 CPF 2 OPA 2024 01 03 18 003 1 apollo11 OPA_ELP96\n"
+ "H2 100 100 0 2024 1 4 0 0 0 2024 1 8 23 45 0 900 0 1 0 0 0 3\n"
+ "H9\n"
+ "10 1 60313 0.0 0 16126075.681 398785441.280 -26042850.417\n"
+ "10 2 60313 0.0 0 -16202176.985 -398701851.546 26035563.466\n"
+ "30 1 -741. -40216. 3643. 26.9\n"
+ "10 1 60313 900.0 0 41473086.247 396893016.626 -26449307.496\n"
+ "10 2 60313 900.0 0 -41543554.533 -396804772.095 26442015.393\n"
+ "30 1 -3370. -40078. 3646. 26.9\n"
+ "10 1 60313 1800.0 0 66644291.059 393390899.000 -26855631.271\n"
+ "10 2 60313 1800.0 0 -66708842.979 -393298378.023 26848334.019\n"
+ "30 1 -5984. -39769. 3648. 26.9\n"
+ "10 1 60313 2700.0 0 91537552.217 388293816.394 -27261819.596\n"
+ "10 2 60313 2700.0 0 -91595929.760 -388197414.474 27254517.199\n"
+ "30 1 -8572. -39289. 3651. 26.8\n"
+ "10 1 60313 3600.0 0 116051895.405 381622972.022 -27667870.319\n"
+ "10 2 60313 3600.0 0 -116103866.930 -381523100.119 27660562.779\n"
+ "30 1 -11123. -38641. 3653. 26.8\n"
+ "10 1 60313 4500.0 0 140087920.030 373405955.825 -28073781.283\n"
+ "10 2 60313 4500.0 0 -140133281.178 -373303038.613 28066468.603\n"
+ "30 1 -13625. -37827. 3656. 26.8\n"
+ "10 1 60313 5400.0 0 163548202.818 363676629.997 -28479550.326\n"
+ "10 2 60313 5400.0 0 -163586777.325 -363571104.045 28472232.508\n"
+ "30 1 -16069. -36852. 3658. 26.8\n"
+ "99");
}
}));
for (CPFEphemeris ephemerisEntry : cpfFile.getSatellites().values()) {
ephemerisEntry.getPropagator().getPVCoordinates(ephemerisEntry.getStart(), FramesFactory.getITRF(IERSConventions.IERS_2010, true));
}
~~~
**Solution**
Ignore lines with direction flag value = 2 solves this issue. Probably it should be configurable which direction should be parsed?https://gitlab.orekit.org/orekit/orekit/-/issues/1297Can't truncate to CCSDS ODM-specified digits2024-01-16T12:51:29ZBrad KellyCan't truncate to CCSDS ODM-specified digitsOrekit writers are not currently compliant to https://public.ccsds.org/Pubs/502x0b3e1.pdf section 7.5.6 and 7.5.7, but outputting full double precision, per https://forum.orekit.org/t/odm-output-precision-control/3173.Orekit writers are not currently compliant to https://public.ccsds.org/Pubs/502x0b3e1.pdf section 7.5.6 and 7.5.7, but outputting full double precision, per https://forum.orekit.org/t/odm-output-precision-control/3173.https://gitlab.orekit.org/orekit/orekit/-/issues/1296org.orekit.time.LazyLoadedTimeScales#getUTC is not thread safe2024-03-16T14:20:08ZChristopher Schankorg.orekit.time.LazyLoadedTimeScales#getUTC is not thread safeorg.orekit.time.LazyLoadedTimeScales#getUTC is not thread safe. When the UTCScale is not loaded yet, two threads can enter the lazy loading, and cause a ConcurrentModificationException when looping over the loaders
Patch to fix it:
```...org.orekit.time.LazyLoadedTimeScales#getUTC is not thread safe. When the UTCScale is not loaded yet, two threads can enter the lazy loading, and cause a ConcurrentModificationException when looping over the loaders
Patch to fix it:
```
Subject: [PATCH] fix_issue-1296
---
Index: src/main/java/org/orekit/time/LazyLoadedTimeScales.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/org/orekit/time/LazyLoadedTimeScales.java b/src/main/java/org/orekit/time/LazyLoadedTimeScales.java
--- a/src/main/java/org/orekit/time/LazyLoadedTimeScales.java (revision 4314309b071f9ab340b7740b1a7da4e46e003aa2)
+++ b/src/main/java/org/orekit/time/LazyLoadedTimeScales.java (date 1704290488132)
@@ -177,23 +177,28 @@
UTCScale refUtc = utc.get();
if (refUtc == null) {
- List<OffsetModel> entries = Collections.emptyList();
- if (loaders.isEmpty()) {
- addDefaultUTCTAIOffsetsLoaders();
- }
- for (UTCTAIOffsetsLoader loader : loaders) {
- entries = loader.loadOffsets();
- if (!entries.isEmpty()) {
- break;
- }
- }
- if (entries.isEmpty()) {
- throw new OrekitException(OrekitMessages.NO_IERS_UTC_TAI_HISTORY_DATA_LOADED);
- }
- utc.compareAndSet(null, new UTCScale(getTAI(), entries));
- refUtc = utc.get();
- }
+ synchronized (this) {
+ if (utc.get() == null) { // Check if utc was not loaded in the meantime
+ List<OffsetModel> entries = Collections.emptyList();
+ if (loaders.isEmpty()) {
+ addDefaultUTCTAIOffsetsLoaders();
+ }
+ for (UTCTAIOffsetsLoader loader : loaders) {
+ entries = loader.loadOffsets();
+ if (!entries.isEmpty()) {
+ break;
+ }
+ }
+ if (entries.isEmpty()) {
+ throw new OrekitException(OrekitMessages.NO_IERS_UTC_TAI_HISTORY_DATA_LOADED);
+ }
+ utc.compareAndSet(null, new UTCScale(getTAI(), entries));
+ }
+ refUtc = utc.get();
+ }
+ }
+
return refUtc;
}
```12.0.2Christopher SchankChristopher Schankhttps://gitlab.orekit.org/orekit/orekit/-/issues/1295Beta angle EventDetector2024-01-04T20:21:07ZJoeBeta angle EventDetectorThis issue requests a (Field) `EventDetector` triggering when the solar beta angle crosses some threshold be added to orekit.
Background forum discussion can be found here: https://forum.orekit.org/t/calculating-solar-beta-angle/2977This issue requests a (Field) `EventDetector` triggering when the solar beta angle crosses some threshold be added to orekit.
Background forum discussion can be found here: https://forum.orekit.org/t/calculating-solar-beta-angle/297712.1JoeJoehttps://gitlab.orekit.org/orekit/orekit/-/issues/1294Add filter for fixing UKRI/NERC/British Geological Survey Space Geodesy Facil...2023-12-24T12:12:15ZLuc MaisonobeAdd filter for fixing UKRI/NERC/British Geological Survey Space Geodesy Facility (SGF) SP3 files in v00 format that don't respect SP3c formatSee forum discussion [SP3 precise orbit file is not compliant with SP3 format c (extra comment line)](https://forum.orekit.org/t/solved-sp3-precise-orbit-file-is-not-compliant-with-sp3-format-c-extra-comment-line/3140).
This can be fixe...See forum discussion [SP3 precise orbit file is not compliant with SP3 format c (extra comment line)](https://forum.orekit.org/t/solved-sp3-precise-orbit-file-is-not-compliant-with-sp3-format-c-extra-comment-line/3140).
This can be fixed by adding a dedicated `DataFilter` as follows:
```java
// setup filter
final FiltersManager manager = new FiltersManager();
manager.addFilter(new NsgfV00Filter()); // we could also add other classical filters, like .gz uncompression and so on...)
for (DataSource original : myListOfSP3DataSources) {
// only the nsgf v00 files will be filtered, replacing their 'c' format marker by a 'd' format marker
final SP3 file = parser.parse(manager.applyRelevantFilters(original));
}
```12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1293Add getters in LofOffset2024-03-26T11:07:07ZRomain SerraAdd getters in LofOffset12.1Tanner MillsTanner Millshttps://gitlab.orekit.org/orekit/orekit/-/issues/1292Computations not used in (Field)BrouwerLyddanePropagator2024-02-23T09:57:41ZRomain SerraComputations not used in (Field)BrouwerLyddanePropagatorIn method `propagateParameters` which returns a `KeplerianOrbit`, `(Field)UnivariateDerivative2` are used, yet at the end there is no call to `getSecondDerivative`, so some computations are basically lost. It should probably leverage `ta...In method `propagateParameters` which returns a `KeplerianOrbit`, `(Field)UnivariateDerivative2` are used, yet at the end there is no call to `getSecondDerivative`, so some computations are basically lost. It should probably leverage `taylor` or use no `Derivative` at all.https://gitlab.orekit.org/orekit/orekit/-/issues/1291Comment discrepancy in Brouwer Lyddane2024-02-21T16:50:08ZRomain SerraComment discrepancy in Brouwer LyddaneIn method propagateParameters of `(Field)BrouwerLyddanePropagator`, an angle "l" is said as being the true anomaly, yet it is passed to constructor of `KeplerianOrbit `as the mean.
Phipps thesis, on which the implementation is based, ref...In method propagateParameters of `(Field)BrouwerLyddanePropagator`, an angle "l" is said as being the true anomaly, yet it is passed to constructor of `KeplerianOrbit `as the mean.
Phipps thesis, on which the implementation is based, refers to "l" as a mean anomaly, so it's a misleading comment, also present in tests.https://gitlab.orekit.org/orekit/orekit/-/issues/1290Signature discrepancy between double and Field methods in AberrationModifier2023-12-31T08:48:08ZRomain SerraSignature discrepancy between double and Field methods in AberrationModifierProblem concerns natural-to-proper conversions. A common "signature" should be agreed upon and the other one deprecated.Problem concerns natural-to-proper conversions. A common "signature" should be agreed upon and the other one deprecated.https://gitlab.orekit.org/orekit/orekit/-/issues/1289StepHandler and EventHandler callbacks order2023-12-30T08:30:43ZMirco RasottoStepHandler and EventHandler callbacks orderHi,
This issue is related to [this discussion](https://forum.orekit.org/t/stephandler-and-eventhandler-callbacks-order/3103) on the forum.
Thanks,
MircoHi,
This issue is related to [this discussion](https://forum.orekit.org/t/stephandler-and-eventhandler-callbacks-order/3103) on the forum.
Thanks,
Mircohttps://gitlab.orekit.org/orekit/orekit/-/issues/1288Enable choice of cached PositionAngleType w/ applicable FieldOrbit2024-02-23T11:07:34ZRomain SerraEnable choice of cached PositionAngleType w/ applicable FieldOrbit12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1287Revamp tropospheric models2024-02-20T14:38:58ZLuc MaisonobeRevamp tropospheric modelsSee the [thread](https://forum.orekit.org/t/revamping-tropospheric-models/3125) in the forum.
The current architecture for tropospheric models is awkward, it uses constant temperature, pressure and hygrometry but variable location.
It a...See the [thread](https://forum.orekit.org/t/revamping-tropospheric-models/3125) in the forum.
The current architecture for tropospheric models is awkward, it uses constant temperature, pressure and hygrometry but variable location.
It also uses non-SI units in several places and not always consistently (for example the optical wavelength is in nanometers in the Marini-Murray model and in micrometers in the Mendes-Pavlis model).12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1286SP3 parser fails when only some standard deviations are missing but not all2023-12-10T16:20:51ZLuc MaisonobeSP3 parser fails when only some standard deviations are missing but not allSP3 allows some of the standard deviations in position and velocity to be missing.
It explicitly states: "If a standard deviation is unknown, its field is left blank".
The Orekit parser only checks the combination of the three fields in...SP3 allows some of the standard deviations in position and velocity to be missing.
It explicitly states: "If a standard deviation is unknown, its field is left blank".
The Orekit parser only checks the combination of the three fields in X, Y and Z, and
not each field independently, it therefore fails if only one or two are missing.
See [bug in v12 sp3 parser](https://forum.orekit.org/t/bug-in-v-12-sp3-parser/3132) discussion in the forum.12.0.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1285Units should handle conversion of field elements2023-12-06T21:05:54ZLuc MaisonobeUnits should handle conversion of field elementsThe `fromSI` and `toSI` methods should have a field version.The `fromSI` and `toSI` methods should have a field version.12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1284Wrong comment in measurement code2023-12-30T08:21:51ZBryan CazabonneWrong comment in measurement codeThe following code is taken from AngularAzEL
```java
// Partial derivatives of azimuth/elevation with respect to state
// (beware element at index 0 is the value, not a derivative)
final double[] azDerivatives = azimuth...The following code is taken from AngularAzEL
```java
// Partial derivatives of azimuth/elevation with respect to state
// (beware element at index 0 is the value, not a derivative)
final double[] azDerivatives = azimuth.getGradient();
final double[] elDerivatives = elevation.getGradient();
estimated.setStateDerivatives(0,
Arrays.copyOfRange(azDerivatives, 0, 6), Arrays.copyOfRange(elDerivatives, 0, 6));
```
The comment is correct for DerivativeStructure, not Gradient.
When perfoming the switch, some comments were forgotten.