0.4.1
Loading...
Searching...
No Matches
GalileoEphemeris.hpp
Go to the documentation of this file.
1// This file is part of INSTINCT, the INS Toolkit for Integrated
2// Navigation Concepts and Training by the Institute of Navigation of
3// the University of Stuttgart, Germany.
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9/// @file GalileoEphemeris.hpp
10/// @brief Galileo Ephemeris information
11/// @author T. Topp (topp@ins.uni-stuttgart.de)
12/// @date 2022-12-12
13
14#pragma once
15
16#include <bitset>
17#include <cstdint>
18
20
21namespace NAV
22{
23
24/// @brief Broadcasted ephemeris message data
25/// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5., p. 43ff
26///
27/// \image html GPS-satellite-orbits.png "Description of the GPS satellite orbits"
28class GalileoEphemeris final : public SatNavData
29{
30 public:
31 /// @brief Navigation Data Validity and Signal Health Status
32 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.9.3, p. 52
33 struct SvHealth
34 {
35 /// @brief Navigation Data Validity
36 enum DataValidityStatus : uint8_t
37 {
38 NavigationDataValid = 0, ///< Navigation data valid
39 WorkingWithoutGuarantee = 1, ///< Working without guarantee
40 };
41 /// @brief Signal Health Status
42 enum SignalHealthStatus : uint8_t
43 {
44 SignalOK = 0, ///< Signal OK
45 SignalOutOfService = 1, ///< Signal out of service
46 SignalWillBeOutOfService = 2, ///< Signal will be out of service
47 SignalComponentCurrentlyInTest = 3, ///< Signal Component currently in Test
48 };
49
53
54 SignalHealthStatus E5a_SignalHealthStatus = SignalOK; ///< E5a Signal Health Status
55 SignalHealthStatus E5b_SignalHealthStatus = SignalOK; ///< E5b Signal Health Status
56 SignalHealthStatus E1B_SignalHealthStatus = SignalOK; ///< E1-B/C Signal Health Status
57 };
58
59 // #######################################################################################################
60 // Members
61 // #######################################################################################################
62
63 // ------------------------------------------ Time Parameters --------------------------------------------
64
65 /// @brief Time of Clock
67
68 /// @brief Time of Ephemeris
70
71 /// @brief Issue of Data of the nav batch
72 ///
73 /// The navigation data is disseminated in data batches each one identified by an Issue of
74 /// Data. In nominal operation the navigation data (ephemeris, satellite clock correction and
75 /// SISA) have limited validity duration depending on the data type. The identification of each
76 /// batch by an Issue of Data (IOD) value enables:
77 /// - the users to distinguish the data in different batches received from each satellite
78 /// - to indicate to the user receiver the validity of the data (which have to be updated
79 /// using new issue of navigation data)
80 /// - the user receiver to compute the full batch of data even if it misses some pages
81 /// or start receiving the data somewhere during the transmission
82 ///
83 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.9.2, p. 51
84 size_t IODnav{};
85
86 /// Polynomial coefficients for clock correction
87 /// - a(0) bias [s]
88 /// - a(1) drift [s/s]
89 /// - a(2) drift rate (aging) [s/s^2]
90 ///
91 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.3, p. 46
92 std::array<double, 3> a{};
93
94 // --------------------------------------- Keplerian Parameters ------------------------------------------
95
96 double sqrt_A{}; ///< Square root of the semi-major axis [m^1/2]
97 double e{}; ///< Eccentricity [-]
98 double i_0{}; ///< Inclination angle at reference time [rad]
99 double Omega_0{}; ///< Longitude of the ascending node at reference time [rad]
100 double omega{}; ///< Argument of perigee [rad]
101 double M_0{}; ///< Mean anomaly at reference time [rad]
102
103 // -------------------------------------- Pertubation Parameters -----------------------------------------
104
105 double delta_n{}; ///< Mean motion difference from computed value [rad/s]
106 double Omega_dot{}; ///< Rate of change of right ascension [rad/s]
107 double i_dot{}; ///< Rate of change of inclination [rad/s]
108 double Cus{}; ///< Amplitude of the sine harmonic correction term to the argument of latitude [rad]
109 double Cuc{}; ///< Amplitude of the cosine harmonic correction term to the argument of latitude [rad]
110 double Cis{}; ///< Amplitude of the sine harmonic correction term to the angle of inclination [rad]
111 double Cic{}; ///< Amplitude of the cosine harmonic correction term to the angle of inclination [rad]
112 double Crs{}; ///< Amplitude of the sine harmonic correction term to the orbit radius [m]
113 double Crc{}; ///< Amplitude of the cosine harmonic correction term to the orbit radius [m]
114
115 // ----------------------------------------------- Other -------------------------------------------------
116
117 /// @brief Data sources
118 ///
119 /// Bit 0 set: I/NAV E1-B
120 /// Bit 1 set: F/NAV E5a-I
121 /// Bit 2 set: I/NAV E5b-I
122 /// Bits 0 and 2: Both can be set if the navigation messages were merged, however, bits 0-2 cannot all be set,
123 /// as the I/NAV and F/NAV messages contain different information
124 /// Bit 3 reserved for Galileo internal use
125 /// Bit 4 reserved for Galileo internal use
126 /// Bit 8 set: af0-af2, Toc, SISA are for E5a,E1
127 /// Bit 9 set: af0-af2, Toc, SISA are for E5b,E1
128 /// Bits 8-9 : exclusive (only one bit can be set)
129 ///
130 /// @note See \cite RINEX-3.04 RINEX-3.04, ch. A8, p. A25
131 std::bitset<10> dataSource;
132
133 /// SISA (Signal in space accuracy) [m]
134 ///
135 /// Signal - In - Space Accuracy (SISA) is a prediction of the minimum standard deviation
136 /// (1-sigma) of the unbiased Gaussian distribution which overbounds the Signal - In - Space
137 /// Error (SISE) predictable distribution for all possible user locations within the satellite
138 /// coverage area. When no accurate prediction is available (SISA = NAPA), this is an indicator
139 /// of a potential anomalous SIS.
140 ///
141 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.12, p.58
143
144 /// @brief Signal Health
145 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.9.3, p. 52
147
148 /// @brief E1-E5a Broadcast Group Delay [s]
149 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.5, p. 47f
150 double BGD_E1_E5a{};
151 /// @brief E1-E5b Broadcast Group Delay [s]
152 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.5, p. 47f
153 double BGD_E1_E5b{};
154
155 // #######################################################################################################
156 // Functions
157 // #######################################################################################################
158
159 /// @brief Default Constructor
160 /// @param[in] toc Time the Clock information is calculated (Time of Clock)
161 explicit GalileoEphemeris(const InsTime& toc);
162
163 /// @brief Constructor
164 /// @param[in] toc Time the Clock information is calculated (Time of Clock)
165 /// @param[in] toe Time the Orbit information is calculated (Time of Ephemeris)
166 /// @param[in] IODnav Issue of Data of the nav batch
167 /// @param[in] a Polynomial coefficients for clock correction (a0 bias [s], a1 drift [s/s], a2 drift rate (aging) [s/s^2])
168 /// @param[in] sqrt_A Square root of the semi-major axis [m^1/2]
169 /// @param[in] e Eccentricity [-]
170 /// @param[in] i_0 Inclination angle at reference time [rad]
171 /// @param[in] Omega_0 Longitude of the ascending node at reference time [rad]
172 /// @param[in] omega Argument of perigee [rad]
173 /// @param[in] M_0 Mean anomaly at reference time [rad]
174 /// @param[in] delta_n Mean motion difference from computed value [rad/s]
175 /// @param[in] Omega_dot Rate of change of right ascension [rad/s]
176 /// @param[in] i_dot Rate of change of inclination [rad/s]
177 /// @param[in] Cus Amplitude of the sine harmonic correction term to the argument of latitude [rad]
178 /// @param[in] Cuc Amplitude of the cosine harmonic correction term to the argument of latitude [rad]
179 /// @param[in] Cis Amplitude of the sine harmonic correction term to the angle of inclination [rad]
180 /// @param[in] Cic Amplitude of the cosine harmonic correction term to the angle of inclination [rad]
181 /// @param[in] Crs Amplitude of the sine harmonic correction term to the orbit radius [m]
182 /// @param[in] Crc Amplitude of the cosine harmonic correction term to the orbit radius [m]
183 /// @param[in] dataSource Data sources
184 /// @param[in] signalAccuracy SISA (Signal in space accuracy) [m]
185 /// @param[in] svHealth Signal Health
186 /// @param[in] BGD_E1_E5a E1-E5a Broadcast Group Delay [s]
187 /// @param[in] BGD_E1_E5b E1-E5b Broadcast Group Delay [s]
188 GalileoEphemeris(const InsTime& toc, const InsTime& toe,
189 const size_t& IODnav,
190 const std::array<double, 3>& a,
191 const double& sqrt_A, const double& e, const double& i_0, const double& Omega_0, const double& omega, const double& M_0,
192 const double& delta_n, const double& Omega_dot, const double& i_dot, const double& Cus, const double& Cuc,
193 const double& Cis, const double& Cic, const double& Crs, const double& Crc,
194 const std::bitset<10>& dataSource, const double& signalAccuracy, const SvHealth& svHealth,
195 const double& BGD_E1_E5a, const double& BGD_E1_E5b);
196
197#ifdef TESTING
198 /// @brief Constructor for pasting raw data from Nav files
199 /// @param[in] year Time of Clock year
200 /// @param[in] month Time of Clock month
201 /// @param[in] day Time of Clock day
202 /// @param[in] hour Time of Clock hour
203 /// @param[in] minute Time of Clock minute
204 /// @param[in] second Time of Clock second
205 /// @param[in] svClockBias Clock correction a(0) bias [s]
206 /// @param[in] svClockDrift Clock correction a(1) drift [s/s]
207 /// @param[in] svClockDriftRate Clock correction a(2) drift rate (aging) [s/s^2]
208 /// @param[in] IODnav Issue of Data of the nav batch
209 /// @param[in] Crs Amplitude of the sine harmonic correction term to the orbit radius [m]
210 /// @param[in] delta_n Mean motion difference from computed value [rad/s]
211 /// @param[in] M_0 Mean anomaly at reference time [rad]
212 /// @param[in] Cuc Amplitude of the cosine harmonic correction term to the argument of latitude [rad]
213 /// @param[in] e Eccentricity [-]
214 /// @param[in] Cus Amplitude of the sine harmonic correction term to the argument of latitude [rad]
215 /// @param[in] sqrt_A Square root of the semi-major axis [m^1/2]
216 /// @param[in] Toe Time of Ephemeris
217 /// @param[in] Cic Amplitude of the cosine harmonic correction term to the angle of inclination [rad]
218 /// @param[in] Omega_0 Longitude of the ascending node at reference time [rad]
219 /// @param[in] Cis Amplitude of the sine harmonic correction term to the angle of inclination [rad]
220 /// @param[in] i_0 Inclination angle at reference time [rad]
221 /// @param[in] Crc Amplitude of the cosine harmonic correction term to the orbit radius [m]
222 /// @param[in] omega Argument of perigee [rad]
223 /// @param[in] Omega_dot Rate of change of right ascension [rad/s]
224 /// @param[in] i_dot Rate of change of inclination [rad/s]
225 /// @param[in] dataSource Data sources
226 /// @param[in] GALWeek GAL Week to go with Toe
227 /// @param[in] spare1 Spare data
228 /// @param[in] signalAccuracy SISA Signal in space accuracy [m]
229 /// @param[in] svHealth SV health
230 /// @param[in] BGD_E1_E5a E1-E5a Broadcast Group Delay [s]
231 /// @param[in] BGD_E1_E5b E1-E5b Broadcast Group Delay [s]
232 /// @param[in] TransmissionTimeOfMessage Transmission time of message
233 /// @param[in] spare2 Spare data
234 /// @param[in] spare3 Spare data
235 /// @param[in] spare4 Spare data
236 GalileoEphemeris(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t minute, double second, double svClockBias, double svClockDrift, double svClockDriftRate,
237 double IODnav, double Crs, double delta_n, double M_0,
238 double Cuc, double e, double Cus, double sqrt_A,
239 double Toe, double Cic, double Omega_0, double Cis,
240 double i_0, double Crc, double omega, double Omega_dot,
241 double i_dot, double dataSource, double GALWeek, double spare1,
242 double signalAccuracy, double svHealth, double BGD_E1_E5a, double BGD_E1_E5b,
243 double TransmissionTimeOfMessage, double spare2 = 0.0, double spare3 = 0.0, double spare4 = 0.0);
244#endif
245
246 /// @brief Destructor
247 ~GalileoEphemeris() final = default;
248 /// @brief Copy constructor
250 /// @brief Move constructor
252 /// @brief Copy assignment operator
253 GalileoEphemeris& operator=(const GalileoEphemeris&) = delete;
254 /// @brief Move assignment operator
255 GalileoEphemeris& operator=(GalileoEphemeris&&) = delete;
256
257 /// @brief Calculates the Variance of the satellite position in [m^2]
258 [[nodiscard]] double calcSatellitePositionVariance() const final;
259
260 /// @brief Calculates clock bias and drift of the satellite
261 /// @param[in] recvTime Receive time of the signal
262 /// @param[in] dist Distance between receiver and satellite (normally the pseudorange) [m]
263 /// @param[in] freq Signal Frequency
264 [[nodiscard]] Corrections calcClockCorrections(const InsTime& recvTime, double dist, const Frequency& freq) const final;
265
266 /// @brief Checks whether the signal is healthy
267 [[nodiscard]] bool isHealthy() const final;
268
269 private:
270 /// @brief Calculates position, velocity and acceleration of the satellite at transmission time
271 /// @param[in] transTime Transmit time of the signal
272 /// @param[in] calc Flags which determine what should be calculated and returned
273 /// @note See \cite GAL-ICD-2.0 GAL-ICD-2.0, ch. 5.1.1, p. 44f
274 /// @note See \cite IS-GPS-200M IS-GPS-200 ch. 20.3.3.4.3.1 Table 20-IV p.106-109
275 [[nodiscard]] PosVelAccel calcSatelliteData(const InsTime& transTime, Orbit::Calc calc) const final;
276};
277
278} // namespace NAV
Satellite Navigation data (to calculate SatNavData and clock)
Frequency definition for different satellite systems.
Definition Frequency.hpp:59
InsTime toe
Time of Ephemeris.
double calcSatellitePositionVariance() const final
Calculates the Variance of the satellite position in [m^2].
double Omega_0
Longitude of the ascending node at reference time [rad].
double BGD_E1_E5b
E1-E5b Broadcast Group Delay [s].
bool isHealthy() const final
Checks whether the signal is healthy.
double Omega_dot
Rate of change of right ascension [rad/s].
PosVelAccel calcSatelliteData(const InsTime &transTime, Orbit::Calc calc) const final
Calculates position, velocity and acceleration of the satellite at transmission time.
double e
Eccentricity [-].
std::bitset< 10 > dataSource
Data sources.
double Cis
Amplitude of the sine harmonic correction term to the angle of inclination [rad].
double omega
Argument of perigee [rad].
double M_0
Mean anomaly at reference time [rad].
double i_dot
Rate of change of inclination [rad/s].
~GalileoEphemeris() final=default
Destructor.
double Cuc
Amplitude of the cosine harmonic correction term to the argument of latitude [rad].
double Cus
Amplitude of the sine harmonic correction term to the argument of latitude [rad].
Corrections calcClockCorrections(const InsTime &recvTime, double dist, const Frequency &freq) const final
Calculates clock bias and drift of the satellite.
double sqrt_A
Square root of the semi-major axis [m^1/2].
GalileoEphemeris(const InsTime &toc)
Default Constructor.
double Cic
Amplitude of the cosine harmonic correction term to the angle of inclination [rad].
size_t IODnav
Issue of Data of the nav batch.
double Crc
Amplitude of the cosine harmonic correction term to the orbit radius [m].
std::array< double, 3 > a
double Crs
Amplitude of the sine harmonic correction term to the orbit radius [m].
double delta_n
Mean motion difference from computed value [rad/s].
InsTime toc
Time of Clock.
double BGD_E1_E5a
E1-E5a Broadcast Group Delay [s].
SvHealth svHealth
Signal Health.
double i_0
Inclination angle at reference time [rad].
The class is responsible for all time-related tasks.
Definition InsTime.hpp:710
Abstract satellite orbit information.
Definition Orbit.hpp:25
Calc
Calculation flags.
Definition Orbit.hpp:75
SatNavData(Type type, const InsTime &refTime)
Constructor.
@ GalileoEphemeris
Galileo Broadcast Ephemeris.
Satellite clock corrections.
Definition Clock.hpp:28
Navigation Data Validity and Signal Health Status.
SignalHealthStatus E5b_SignalHealthStatus
E5b Signal Health Status.
DataValidityStatus
Navigation Data Validity.
@ NavigationDataValid
Navigation data valid.
@ WorkingWithoutGuarantee
Working without guarantee.
SignalHealthStatus E1B_SignalHealthStatus
E1-B/C Signal Health Status.
DataValidityStatus E5a_DataValidityStatus
E5a Data Validity Status.
SignalHealthStatus
Signal Health Status.
@ SignalComponentCurrentlyInTest
Signal Component currently in Test.
@ SignalOutOfService
Signal out of service.
@ SignalWillBeOutOfService
Signal will be out of service.
SignalHealthStatus E5a_SignalHealthStatus
E5a Signal Health Status.
DataValidityStatus E5b_DataValidityStatus
E5b Data Validity Status.
DataValidityStatus E1B_DataValidityStatus
E1-B Data Validity Status.
Satellite Position, Velocity and Acceleration.
Definition Orbit.hpp:40