1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical.gnss;
18
19 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
20 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.attitudes.Attitude;
23 import org.orekit.attitudes.AttitudeProvider;
24 import org.orekit.errors.OrekitException;
25 import org.orekit.errors.OrekitMessages;
26 import org.orekit.frames.Frame;
27 import org.orekit.orbits.CartesianOrbit;
28 import org.orekit.orbits.Orbit;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.propagation.analytical.AbstractAnalyticalPropagator;
31 import org.orekit.propagation.analytical.gnss.data.SBASOrbitalElements;
32 import org.orekit.time.AbsoluteDate;
33 import org.orekit.utils.PVCoordinates;
34
35
36
37
38
39
40
41
42
43
44
45 public class SBASPropagator extends AbstractAnalyticalPropagator {
46
47
48 private final SBASOrbitalElements sbasOrbit;
49
50
51 private final double mass;
52
53
54 private final double mu;
55
56
57 private final Frame eci;
58
59
60 private final Frame ecef;
61
62
63
64
65
66
67
68
69
70
71 SBASPropagator(final SBASOrbitalElements sbasOrbit, final Frame eci,
72 final Frame ecef, final AttitudeProvider provider,
73 final double mass, final double mu) {
74 super(provider);
75
76 this.sbasOrbit = sbasOrbit;
77
78 setStartDate(sbasOrbit.getDate());
79
80 this.mu = mu;
81
82 this.mass = mass;
83
84 this.eci = eci;
85
86 this.ecef = ecef;
87
88 final Orbit orbit = propagateOrbit(getStartDate());
89 final Attitude attitude = provider.getAttitude(orbit, orbit.getDate(), orbit.getFrame());
90 super.resetInitialState(new SpacecraftState(orbit, attitude).withMass(mass));
91 }
92
93
94
95
96
97
98
99
100
101
102 public PVCoordinates propagateInEcef(final AbsoluteDate date) {
103
104 final UnivariateDerivative2 dt = new UnivariateDerivative2(getDT(date), 1.0, 0.0);
105
106 final UnivariateDerivative2 x = dt.multiply(dt.multiply(0.5 * sbasOrbit.getXDotDot()).add(sbasOrbit.getXDot())).add(sbasOrbit.getX());
107 final UnivariateDerivative2 y = dt.multiply(dt.multiply(0.5 * sbasOrbit.getYDotDot()).add(sbasOrbit.getYDot())).add(sbasOrbit.getY());
108 final UnivariateDerivative2 z = dt.multiply(dt.multiply(0.5 * sbasOrbit.getZDotDot()).add(sbasOrbit.getZDot())).add(sbasOrbit.getZ());
109
110 final FieldVector3D<UnivariateDerivative2> positionwithDerivatives =
111 new FieldVector3D<>(x, y, z);
112 return new PVCoordinates(new Vector3D(positionwithDerivatives.getX().getValue(),
113 positionwithDerivatives.getY().getValue(),
114 positionwithDerivatives.getZ().getValue()),
115 new Vector3D(positionwithDerivatives.getX().getFirstDerivative(),
116 positionwithDerivatives.getY().getFirstDerivative(),
117 positionwithDerivatives.getZ().getFirstDerivative()),
118 new Vector3D(positionwithDerivatives.getX().getSecondDerivative(),
119 positionwithDerivatives.getY().getSecondDerivative(),
120 positionwithDerivatives.getZ().getSecondDerivative()));
121 }
122
123
124 public Orbit propagateOrbit(final AbsoluteDate date) {
125
126 final PVCoordinates pvaInECEF = propagateInEcef(date);
127
128 final PVCoordinates pvaInECI = ecef.getTransformTo(eci, date).transformPVCoordinates(pvaInECEF);
129
130 return new CartesianOrbit(pvaInECI, eci, date, mu);
131 }
132
133
134
135
136
137 public double getMU() {
138 return mu;
139 }
140
141
142
143
144
145
146 public Frame getECI() {
147 return eci;
148 }
149
150
151
152
153
154
155 public Frame getECEF() {
156 return ecef;
157 }
158
159
160
161
162
163
164 public SBASOrbitalElements getSBASOrbitalElements() {
165 return sbasOrbit;
166 }
167
168
169 public Frame getFrame() {
170 return eci;
171 }
172
173
174 public void resetInitialState(final SpacecraftState state) {
175 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
176 }
177
178
179 protected double getMass(final AbsoluteDate date) {
180 return mass;
181 }
182
183
184 protected void resetIntermediateState(final SpacecraftState state, final boolean forward) {
185 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
186 }
187
188
189
190
191
192 private double getDT(final AbsoluteDate date) {
193
194 return date.durationFrom(sbasOrbit.getDate());
195 }
196
197 }