1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical.tle.generation;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.util.FastMath;
21 import org.hipparchus.util.MathUtils;
22 import org.orekit.orbits.FieldKeplerianOrbit;
23 import org.orekit.orbits.KeplerianOrbit;
24 import org.orekit.propagation.analytical.tle.FieldTLE;
25 import org.orekit.propagation.analytical.tle.TLE;
26 import org.orekit.time.AbsoluteDate;
27 import org.orekit.time.FieldAbsoluteDate;
28 import org.orekit.time.TimeScale;
29
30
31
32
33
34
35
36 public final class TleGenerationUtil {
37
38
39
40
41
42
43 private TleGenerationUtil() {
44 }
45
46
47
48
49
50
51
52
53
54 public static TLE newTLE(final KeplerianOrbit keplerianOrbit, final TLE templateTLE,
55 final double bStar, final TimeScale utc) {
56
57
58 final double meanMotion = keplerianOrbit.getKeplerianMeanMotion();
59 final double e = keplerianOrbit.getE();
60 final double i = keplerianOrbit.getI();
61 final double raan = keplerianOrbit.getRightAscensionOfAscendingNode();
62 final double pa = keplerianOrbit.getPerigeeArgument();
63 final double meanAnomaly = keplerianOrbit.getMeanAnomaly();
64
65
66 final AbsoluteDate epoch = keplerianOrbit.getDate();
67
68
69 final int satelliteNumber = templateTLE.getSatelliteNumber();
70 final char classification = templateTLE.getClassification();
71 final int launchYear = templateTLE.getLaunchYear();
72 final int launchNumber = templateTLE.getLaunchNumber();
73 final String launchPiece = templateTLE.getLaunchPiece();
74 final int ephemerisType = templateTLE.getEphemerisType();
75 final int elementNumber = templateTLE.getElementNumber();
76
77
78 final int revolutionNumberAtEpoch = templateTLE.getRevolutionNumberAtEpoch();
79 final double dt = epoch.durationFrom(templateTLE.getDate());
80 final int newRevolutionNumberAtEpoch = (int) (revolutionNumberAtEpoch + FastMath.floor((MathUtils.normalizeAngle(meanAnomaly, FastMath.PI) + dt * meanMotion) / (MathUtils.TWO_PI)));
81
82
83 final double meanMotionFirstDerivative = templateTLE.getMeanMotionFirstDerivative();
84 final double meanMotionSecondDerivative = templateTLE.getMeanMotionSecondDerivative();
85
86
87 return new TLE(satelliteNumber, classification, launchYear, launchNumber, launchPiece, ephemerisType,
88 elementNumber, epoch, meanMotion, meanMotionFirstDerivative, meanMotionSecondDerivative,
89 e, i, pa, raan, meanAnomaly, newRevolutionNumberAtEpoch, bStar, utc);
90
91 }
92
93
94
95
96
97
98
99
100
101
102 public static <T extends CalculusFieldElement<T>> FieldTLE<T> newTLE(final FieldKeplerianOrbit<T> keplerianOrbit,
103 final FieldTLE<T> templateTLE, final T bStar,
104 final TimeScale utc) {
105
106
107 final T meanMotion = keplerianOrbit.getKeplerianMeanMotion();
108 final T e = keplerianOrbit.getE();
109 final T i = keplerianOrbit.getI();
110 final T raan = keplerianOrbit.getRightAscensionOfAscendingNode();
111 final T pa = keplerianOrbit.getPerigeeArgument();
112 final T meanAnomaly = keplerianOrbit.getMeanAnomaly();
113
114
115 final FieldAbsoluteDate<T> epoch = keplerianOrbit.getDate();
116
117
118 final int satelliteNumber = templateTLE.getSatelliteNumber();
119 final char classification = templateTLE.getClassification();
120 final int launchYear = templateTLE.getLaunchYear();
121 final int launchNumber = templateTLE.getLaunchNumber();
122 final String launchPiece = templateTLE.getLaunchPiece();
123 final int ephemerisType = templateTLE.getEphemerisType();
124 final int elementNumber = templateTLE.getElementNumber();
125
126
127 final int revolutionNumberAtEpoch = templateTLE.getRevolutionNumberAtEpoch();
128 final T dt = epoch.durationFrom(templateTLE.getDate());
129 final int newRevolutionNumberAtEpoch = (int) ((int) revolutionNumberAtEpoch + FastMath.floor(MathUtils.normalizeAngle(meanAnomaly, e.getPi()).add(dt.multiply(meanMotion)).divide(MathUtils.TWO_PI)).getReal());
130
131
132 final T meanMotionFirstDerivative = templateTLE.getMeanMotionFirstDerivative();
133 final T meanMotionSecondDerivative = templateTLE.getMeanMotionSecondDerivative();
134
135
136 return new FieldTLE<>(satelliteNumber, classification, launchYear, launchNumber, launchPiece, ephemerisType,
137 elementNumber, epoch, meanMotion, meanMotionFirstDerivative, meanMotionSecondDerivative,
138 e, i, pa, raan, meanAnomaly, newRevolutionNumberAtEpoch, bStar.getReal(), utc);
139
140 }
141
142 }