Orekit issueshttps://gitlab.orekit.org/groups/orekit/-/issues2024-03-22T12:46:02Zhttps://gitlab.orekit.org/orekit/orekit/-/issues/1332inter satellites one way range rate measurements2024-03-22T12:46:02ZLuc Maisonobeinter satellites one way range rate measurementsInter satellites one way range rate measurements should be available.Inter satellites one way range rate measurements should be available.12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1329SP3Ephemeris.getPropagator ignores clock offset2024-03-22T12:46:09ZLuc MaisonobeSP3Ephemeris.getPropagator ignores clock offsetThe `SP3Ephemeris` class implements `EphemerisFile.SatelliteEphemeris<SP3Coordinate, SP3Segment>`, hence it allows to retrieve `SP3Coordinate` instances which include clock offsets.
When calling `getPropagator` on the other hand, `SP3Ep...The `SP3Ephemeris` class implements `EphemerisFile.SatelliteEphemeris<SP3Coordinate, SP3Segment>`, hence it allows to retrieve `SP3Coordinate` instances which include clock offsets.
When calling `getPropagator` on the other hand, `SP3Ephemeris` uses internally `EphemerisSegmentPropagator`, which despite knowing about the real coordinates type (here `SP3Coordinate`), only interpolates `TimeStampedPVCoordinates` because it casts the coordinates to `TimeStampedPVCoordinates` and then uses `TimeStampedPVCoordinatesHermiteInterpolator`.
`SP3Ephemeris` (or perhaps even `EphemerisSegmentPropagator`) should allow to retrieve additional information. At `SP3Ephemeris` level, it could be using additional states, whereas at `EphemerisSegmentPropagator` it could be generating the proper coordinates type.12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1328Potential NullPointerException in Frame2024-03-15T13:26:43ZLuc MaisonobePotential NullPointerException in FrameThe field version of `Frame.getStaticTransformTo` javadoc states that null `date` parameters are allowed (they are allowed in the primitive double version).
However, the first instruction is `date.hasZeroField()`, which will trigger an e...The field version of `Frame.getStaticTransformTo` javadoc states that null `date` parameters are allowed (they are allowed in the primitive double version).
However, the first instruction is `date.hasZeroField()`, which will trigger an exception if null date is passed.
This occured to me because SonarQube identified a bug between lines 530 and 534 of the field version of `GroundStation.getOffsetGeodeticPoint`, as the check for null date is performed *after* `getStaticTransformTo` has been called.12.0.2https://gitlab.orekit.org/orekit/orekit/-/issues/1327SP3Writer generates blank lines2024-03-15T13:26:43ZMark RuttenSP3Writer generates blank linesI found a problem with a multiple of 17 satellites (i.e. a complete row), where the SP3Writer incorrectly generates two blank lines in the header, one just after the satellite names and one just after the accuracies.I found a problem with a multiple of 17 satellites (i.e. a complete row), where the SP3Writer incorrectly generates two blank lines in the header, one just after the satellite names and one just after the accuracies.12.0.2Mark RuttenMark Ruttenhttps://gitlab.orekit.org/orekit/orekit/-/issues/1325inter-satellite measurements should consider direction-dependent phase centers2024-03-22T12:46:15ZLuc Maisonobeinter-satellite measurements should consider direction-dependent phase centersAntenna phase centers can be direction-dependent. The `FrequencyPattern` class manages this, thanks to both a phase center position and phase center variation functions, which can for example be read from Antex files.
The `OnBoardAntenn...Antenna phase centers can be direction-dependent. The `FrequencyPattern` class manages this, thanks to both a phase center position and phase center variation functions, which can for example be read from Antex files.
The `OnBoardAntenna{InterSatellites|OneWayGNSS}{Phase|Range}Modifier` modifiers should use `FrequencyPattern` instead of using only fixed vectors for emitter and receiver phase centers.12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1322Wrong writing of SBAS time system in SP3 files2024-03-15T13:26:43ZLuc MaisonobeWrong writing of SBAS time system in SP3 filesThe SBAS time system is not allowed in SP3 files, it should be changed to UTC.The SBAS time system is not allowed in SP3 files, it should be changed to UTC.12.0.2Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1321Wrong parsing of Beidou time system in SP3 file2024-03-15T13:26:43ZLuc MaisonobeWrong parsing of Beidou time system in SP3 fileThe Beidou system time should be written BDT and not BDS.The Beidou system time should be written BDT and not BDS.12.0.2Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1318Add default implementation of getPosition in (Field)Propagator2024-02-01T17:31:46ZRomain SerraAdd default implementation of getPosition in (Field)PropagatorIt shall use static transforms to speed things up.
Default implementation must be overwritten in EphemerisSegmentPropagator and AggregatedPropagatorIt shall use static transforms to speed things up.
Default implementation must be overwritten in EphemerisSegmentPropagator and AggregatedPropagator12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1317Wrong units in SP3 base for pos/vel and clock/rate2024-01-30T16:55:56ZLuc MaisonobeWrong units in SP3 base for pos/vel and clock/rateThe SP3 header uses mm (and 10⁻⁴ mm/s) for pos/vel base accuracy, and ps (and 10⁻⁴ ps/s) for clock/rate base accuracy.
As of Orekit 12.X, these values are parsed and returned as is by the API, they should be in SI units.
It should be po...The SP3 header uses mm (and 10⁻⁴ mm/s) for pos/vel base accuracy, and ps (and 10⁻⁴ ps/s) for clock/rate base accuracy.
As of Orekit 12.X, these values are parsed and returned as is by the API, they should be in SI units.
It should be possible to add new getters/setters with an additional `Unit` parameter and deprecate the default ones without units, making sure that they still return values with the raw non-SI units for compatibility. Then the deprecated methods should be removed in 13.0.Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1315Add support for Walker constellations2024-01-29T15:07:02ZLuc MaisonobeAdd support for Walker constellationsOne should add some builder to create all the orbits in a Walker constellation.
The builder should by default generate the regular orbits with integer indices, but it should be possible to also add in-orbit spare satellites at intermedia...One should add some builder to create all the orbits in a Walker constellation.
The builder should by default generate the regular orbits with integer indices, but it should be possible to also add in-orbit spare satellites at intermediate indices within some planes.12.1Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1314Wrong parsing of GAL timesystem in SP3 files2024-03-15T13:26:43ZLuc MaisonobeWrong parsing of GAL timesystem in SP3 filesSP3 files can use GAL as the time system. This however does not work because we use `TimeSystem.valueOf` instead of `TimeSystem.parseTimeSystem`.
So it works only for the time systems enumerates that have 3 letters (GPS, UTC, and probabl...SP3 files can use GAL as the time system. This however does not work because we use `TimeSystem.valueOf` instead of `TimeSystem.parseTimeSystem`.
So it works only for the time systems enumerates that have 3 letters (GPS, UTC, and probably TAI), but not for GALILEO, GLONASS and the likes.12.0.2Luc MaisonobeLuc Maisonobehttps://gitlab.orekit.org/orekit/orekit/-/issues/1309Incorrect transmitter location in BistaticRange measurement2024-03-16T14:20:08ZMark RuttenIncorrect transmitter location in BistaticRange measurementThe transmit date is incorrectly calculated by shifting the receive date in the wrong direction. For example
```java
final FieldAbsoluteDate<Gradient> transmitDateDS = downlinkDateDS.shiftedBy(tauTotal);
```
should be
```java
final Fiel...The transmit date is incorrectly calculated by shifting the receive date in the wrong direction. For example
```java
final FieldAbsoluteDate<Gradient> transmitDateDS = downlinkDateDS.shiftedBy(tauTotal);
```
should be
```java
final FieldAbsoluteDate<Gradient> transmitDateDS = downlinkDateDS.shiftedBy(tauTotal.negate());
```
This doesn't affect the calculation of the theoretical measurement but does affect the list of participants in the estimated measurement.12.0.2Mark RuttenMark Ruttenhttps://gitlab.orekit.org/orekit/orekit/-/issues/1307Unnecessary calls to transformPVCoordinates in (Field)ShortTermEncounter2DDef...2024-02-24T08:39:12ZRomain SerraUnnecessary calls to transformPVCoordinates in (Field)ShortTermEncounter2DDefinitionCan be replaced by `transformPosition` as only `getPosition` is called afterwardsCan be replaced by `transformPosition` as only `getPosition` is called afterwards12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1306Enable intermediate state reset for (Field)TlePropagator2024-02-03T15:45:29ZRomain SerraEnable intermediate state reset for (Field)TlePropagatorThis would allow using (Field)ImpulseManeuver for instanceThis would allow using (Field)ImpulseManeuver for instance12.1Romain SerraRomain Serrahttps://gitlab.orekit.org/orekit/orekit/-/issues/1304Add get methods to KnockeRediffusedForceModel class2024-01-23T23:26:57ZElisabet CidAdd get methods to KnockeRediffusedForceModel classIt is not possible to obtain the albedo and solar flux IR parameters of the class KnockeRediffusedForceModel via "get" methods. These parameters are not available for an user.It is not possible to obtain the albedo and solar flux IR parameters of the class KnockeRediffusedForceModel via "get" methods. These parameters are not available for an user.12.1Luc MaisonobeLuc Maisonobehttps://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/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 Schank