1 /* Contributed in the public domain.
2 * Licensed to CS GROUP (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.frames;
18
19 import java.util.Collection;
20 import java.util.function.BiFunction;
21 import java.util.function.Supplier;
22
23 import org.orekit.bodies.CelestialBodies;
24 import org.orekit.time.TimeScales;
25 import org.orekit.utils.IERSConventions;
26
27 /**
28 * A collection of commonly used {@link Frame}s. This interface defines methods for
29 * obtaining instances of many commonly used reference frames.
30 *
31 * @author Guylaine Prat
32 * @author Luc Maisonobe
33 * @author Pascal Parraud
34 * @author Evan Ward
35 * @see FramesFactory
36 * @since 10.0
37 */
38 public interface Frames {
39
40 /** Get Earth Orientation Parameters history.
41 * @param conventions conventions for which EOP history is requested
42 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
43 * @return Earth Orientation Parameters history
44 */
45 EOPHistory getEOPHistory(IERSConventions conventions, boolean simpleEOP);
46
47 /** Get one of the predefined frames.
48 * @param factoryKey key of the frame within the factory
49 * @return the predefined frame
50 */
51 Frame getFrame(Predefined factoryKey);
52
53 /** Get the unique GCRF frame.
54 * <p>The GCRF frame is the root frame in the frame tree.</p>
55 * @return the unique instance of the GCRF frame
56 */
57 Frame getGCRF();
58
59 /** Get the unique ICRF frame.
60 * <p>The ICRF frame is centered at solar system barycenter and aligned
61 * with GCRF.</p>
62 * @return the unique instance of the ICRF frame
63 */
64 Frame getICRF();
65
66 /** Get the ecliptic frame.
67 * The IAU defines the ecliptic as "the plane perpendicular to the mean heliocentric
68 * orbital angular momentum vector of the Earth-Moon barycentre in the BCRS (IAU 2006
69 * Resolution B1)." The +z axis is aligned with the angular momentum vector, and the +x
70 * axis is aligned with +x axis of {@link #getMOD(IERSConventions) MOD}.
71 *
72 * <p> This implementation agrees with the JPL 406 ephemerides to within 0.5 arc seconds.
73 * @param conventions IERS conventions to apply
74 * @return the selected reference frame singleton.
75 */
76 Frame getEcliptic(IERSConventions conventions);
77
78 /** Get the unique EME2000 frame.
79 * <p>The EME2000 frame is also called the J2000 frame.
80 * The former denomination is preferred in Orekit.</p>
81 * @return the unique instance of the EME2000 frame
82 */
83 FactoryManagedFrame getEME2000();
84
85 /** Get an unspecified International Terrestrial Reference Frame.
86 * <p>
87 * The frame returned uses the {@link EOPEntry Earth Orientation Parameters}
88 * blindly. So if for example one loads only EOP 14 C04 files to retrieve
89 * the parameters, the frame will be an {@link ITRFVersion#ITRF_2014}. However,
90 * if parameters are loaded from different files types, or even for file
91 * types that changed their reference (like Bulletin A switching from
92 * {@link ITRFVersion#ITRF_2008} to {@link ITRFVersion#ITRF_2014} starting
93 * with Vol. XXXI No. 013 published on 2018-03-29), then the ITRF returned
94 * by this method will jump from one version to another version.
95 * </p>
96 * <p>
97 * IF a specific version of ITRF is needed, then {@link #getITRF(ITRFVersion,
98 * IERSConventions, boolean)} should be used instead.
99 * </p>
100 * @param conventions IERS conventions to apply
101 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
102 * @return the selected reference frame singleton.
103 * @see #getITRF(ITRFVersion, IERSConventions, boolean)
104 * @since 6.1
105 */
106 FactoryManagedFrame getITRF(IERSConventions conventions,
107 boolean simpleEOP);
108
109 /** Get the TIRF reference frame, ignoring tidal effects.
110 * @param conventions IERS conventions to apply
111 * @return the selected reference frame singleton.
112 * library cannot be read.
113 */
114 FactoryManagedFrame getTIRF(IERSConventions conventions);
115
116 /** Get an specific International Terrestrial Reference Frame.
117 * <p>
118 * Note that if a specific version of ITRF is required, then {@code simpleEOP}
119 * should most probably be set to {@code false}, as ignoring tidal effects
120 * has an effect of the same order of magnitude as the differences between
121 * the various {@link ITRFVersion ITRF versions}.
122 * </p>
123 * @param version ITRF version
124 * @param conventions IERS conventions to apply
125 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
126 * @return the selected reference frame singleton.
127 * @since 9.2
128 */
129 VersionedITRF getITRF(ITRFVersion version,
130 IERSConventions conventions,
131 boolean simpleEOP);
132
133 /** Get the TIRF reference frame.
134 * @param conventions IERS conventions to apply
135 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
136 * @return the selected reference frame singleton.
137 * @since 6.1
138 */
139 FactoryManagedFrame getTIRF(IERSConventions conventions,
140 boolean simpleEOP);
141
142 /** Get the CIRF2000 reference frame.
143 * @param conventions IERS conventions to apply
144 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
145 * @return the selected reference frame singleton.
146 */
147 FactoryManagedFrame getCIRF(IERSConventions conventions,
148 boolean simpleEOP);
149
150 /** Get the VEIS 1950 reference frame.
151 * <p>Its parent frame is the GTOD frame with IERS 1996 conventions without EOP corrections.<p>
152 * @return the selected reference frame singleton.
153 */
154 FactoryManagedFrame getVeis1950();
155
156 /** Get the equinox-based ITRF reference frame.
157 * @param conventions IERS conventions to apply
158 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
159 * @return the selected reference frame singleton.
160 * @since 6.1
161 */
162 FactoryManagedFrame getITRFEquinox(IERSConventions conventions,
163 boolean simpleEOP);
164
165 /** Get the GTOD reference frame.
166 * <p>
167 * The applyEOPCorr parameter is available mainly for testing purposes or for
168 * consistency with legacy software that don't handle EOP correction parameters.
169 * Beware that setting this parameter to {@code false} leads to crude accuracy
170 * (order of magnitudes for errors might be above 250m in LEO and 1400m in GEO).
171 * For this reason, setting this parameter to false is restricted to {@link
172 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
173 * IERSConventions IERS conventions} cannot be freely chosen here.
174 * </p>
175 * @param applyEOPCorr if true, EOP corrections are applied (here, dut1 and lod)
176 * @return the selected reference frame singleton.
177 */
178 FactoryManagedFrame getGTOD(boolean applyEOPCorr);
179
180 /** Get the GTOD reference frame.
181 * @param conventions IERS conventions to apply
182 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
183 * @return the selected reference frame singleton.
184 */
185 FactoryManagedFrame getGTOD(IERSConventions conventions,
186 boolean simpleEOP);
187
188 /** Get the TOD reference frame.
189 * <p>
190 * The applyEOPCorr parameter is available mainly for testing purposes or for
191 * consistency with legacy software that don't handle EOP correction parameters.
192 * Beware that setting this parameter to {@code false} leads to crude accuracy
193 * (order of magnitudes for errors might be above 1m in LEO and 10m in GEO).
194 * For this reason, setting this parameter to false is restricted to {@link
195 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
196 * IERSConventions IERS conventions} cannot be freely chosen here.
197 * </p>
198 * @param applyEOPCorr if true, EOP corrections are applied (here, nutation)
199 * @return the selected reference frame singleton.
200 */
201 FactoryManagedFrame getTOD(boolean applyEOPCorr);
202
203 /** Get the TOD reference frame.
204 * @param conventions IERS conventions to apply
205 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
206 * @return the selected reference frame singleton.
207 */
208 FactoryManagedFrame getTOD(IERSConventions conventions,
209 boolean simpleEOP);
210
211 /** Get the MOD reference frame.
212 * <p>
213 * The applyEOPCorr parameter is available mainly for testing purposes or for
214 * consistency with legacy software that don't handle EOP correction parameters.
215 * Beware that setting this parameter to {@code false} leads to crude accuracy
216 * (order of magnitudes for errors might be above 1m in LEO and 10m in GEO).
217 * For this reason, setting this parameter to false is restricted to {@link
218 * IERSConventions#IERS_1996 IERS 1996} conventions, and hence the {@link
219 * IERSConventions IERS conventions} cannot be freely chosen here.
220 * </p>
221 * @param applyEOPCorr if true, EOP corrections are applied (EME2000/GCRF bias compensation)
222 * @return the selected reference frame singleton.
223 */
224 FactoryManagedFrame getMOD(boolean applyEOPCorr);
225
226 /** Get the MOD reference frame.
227 * @param conventions IERS conventions to apply
228 * @return the selected reference frame singleton.
229 */
230 FactoryManagedFrame getMOD(IERSConventions conventions);
231
232 /** Get the TEME reference frame.
233 * <p>
234 * The TEME frame is used for the SGP4 model in TLE propagation. This frame has <em>no</em>
235 * official definition and there are some ambiguities about whether it should be used
236 * as "of date" or "of epoch". This frame should therefore be used <em>only</em> for
237 * TLE propagation and not for anything else, as recommended by the CCSDS Orbit Data Message
238 * blue book.
239 * </p>
240 * @return the selected reference frame singleton.
241 */
242 FactoryManagedFrame getTEME();
243
244 /** Get the PZ-90.11 (Parametry Zemly – 1990.11) reference frame.
245 * <p>
246 * The PZ-90.11 reference system was updated on all operational
247 * GLONASS satellites starting from 3:00 pm on December 31, 2013.
248 * </p>
249 * <p>
250 * The transition between parent frame (ITRF-2008) and PZ-90.11 frame is performed using
251 * a seven parameters Helmert transformation.
252 * <pre>
253 * From To ΔX(m) ΔY(m) ΔZ(m) RX(mas) RY(mas) RZ(mas) Epoch
254 * ITRF-2008 PZ-90.11 +0.003 +0.001 -0.000 +0.019 -0.042 +0.002 2010
255 * </pre>
256 * @see "Springer Handbook of Global Navigation Satellite Systems, Peter Teunissen & Oliver Montenbruck"
257 *
258 * @param convention IERS conventions to apply
259 * @param simpleEOP if true, tidal effects are ignored when interpolating EOP
260 * @return the selected reference frame singleton.
261 */
262 FactoryManagedFrame getPZ9011(IERSConventions convention,
263 boolean simpleEOP);
264
265 /* Helpers for creating instances */
266
267 /**
268 * Create a set of frames from the given data.
269 *
270 * @param timeScales used to build the frames as well as the EOP data set.
271 * @param celestialBodies used to get {@link #getICRF()} which is the inertial frame
272 * of the solar system barycenter.
273 * @return a set of reference frame constructed from the given data.
274 * @see #of(TimeScales, Supplier)
275 */
276 static Frames of(final TimeScales timeScales,
277 final CelestialBodies celestialBodies) {
278 return of(timeScales, () -> celestialBodies.getSolarSystemBarycenter()
279 .getInertiallyOrientedFrame());
280 }
281
282 /**
283 * Create a set of frames from the given data.
284 *
285 * @param timeScales used to build the frames as well as the EOP data set.
286 * @param icrfSupplier used to get {@link #getICRF()}. For example, {@code
287 * celestialBodies.getSolarSystemBarycenter().getInertiallyOrientedFrame()}
288 * @return a set of reference frame constructed from the given data.
289 * @see CelestialBodies
290 * @see TimeScales#of(Collection, BiFunction)
291 */
292 static Frames of(final TimeScales timeScales,
293 final Supplier<Frame> icrfSupplier) {
294 return new AbstractFrames(timeScales, icrfSupplier) {
295 @Override
296 public EOPHistory getEOPHistory(final IERSConventions conventions,
297 final boolean simpleEOP) {
298 return getTimeScales().getUT1(conventions, simpleEOP).getEOPHistory();
299 }
300 };
301 }
302
303 }