| Line | Branch | Exec | Source |
|---|---|---|---|
| 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 GLONASSEphemeris.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 | |||
| 18 | #include "Navigation/GNSS/Satellite/internal/SatNavData.hpp" | ||
| 19 | |||
| 20 | namespace NAV | ||
| 21 | { | ||
| 22 | |||
| 23 | /// @brief Broadcasted ephemeris message data | ||
| 24 | /// @note See \cite GLO-ICD-5.1 GLO-ICD-5.1, ch. 4., p. 25ff | ||
| 25 | class GLONASSEphemeris final : public SatNavData | ||
| 26 | { | ||
| 27 | public: | ||
| 28 | // ####################################################################################################### | ||
| 29 | // Members | ||
| 30 | // ####################################################################################################### | ||
| 31 | |||
| 32 | /// Coefficient of linear polynomial of time system difference [s] | ||
| 33 | const double tau_c; | ||
| 34 | |||
| 35 | /// Toe Time of clock [s] (Reference time, ephemeris parameters) | ||
| 36 | const InsTime toc; | ||
| 37 | /// SV clock bias [s] | ||
| 38 | const double tau_n; | ||
| 39 | /// SV relative frequency bias | ||
| 40 | const double gamma_n; | ||
| 41 | /// Health | ||
| 42 | const bool health; | ||
| 43 | /// Position at reference time in PZ90 frame [m] | ||
| 44 | const Eigen::Vector3d PZ90_pos; | ||
| 45 | /// Velocity at reference time in PZ90 frame [m/s] | ||
| 46 | const Eigen::Vector3d PZ90_vel; | ||
| 47 | /// Accelerations due to lunar-solar gravitational perturbation in PZ90 frame [m/s^2] | ||
| 48 | const Eigen::Vector3d PZ90_accelLuniSolar; | ||
| 49 | /// Frequency number (-7 ... +13) (-7 ...+6 (ICD 5.1)) | ||
| 50 | const int8_t frequencyNumber; | ||
| 51 | |||
| 52 | // ####################################################################################################### | ||
| 53 | // Functions | ||
| 54 | // ####################################################################################################### | ||
| 55 | |||
| 56 | /// @brief Constructor | ||
| 57 | /// @param[in] toc Time the Clock information is calculated (Time of Clock) | ||
| 58 | /// @param[in] tau_c Coefficient of linear polynomial of time system difference [s] | ||
| 59 | /// @param[in] tau_n SV clock bias [s] | ||
| 60 | /// @param[in] gamma_n SV relative frequency bias | ||
| 61 | /// @param[in] health Health flag | ||
| 62 | /// @param[in] pos Position at reference time in PZ90 frame [m] | ||
| 63 | /// @param[in] vel Velocity at reference time in PZ90 frame [m/s] | ||
| 64 | /// @param[in] accelLuniSolar Accelerations due to lunar-solar gravitational perturbation in PZ90 frame [m/s^2] | ||
| 65 | /// @param[in] frequencyNumber Frequency number (-7 ... +13) (-7 ...+6 (ICD 5.1)) | ||
| 66 | GLONASSEphemeris(const InsTime& toc, double tau_c, | ||
| 67 | double tau_n, double gamma_n, bool health, | ||
| 68 | Eigen::Vector3d pos, Eigen::Vector3d vel, Eigen::Vector3d accelLuniSolar, | ||
| 69 | int8_t frequencyNumber); | ||
| 70 | |||
| 71 | #ifdef TESTING | ||
| 72 | /// @brief Constructor for pasting raw data from Nav files | ||
| 73 | /// @param[in] year Time of Clock year | ||
| 74 | /// @param[in] month Time of Clock month | ||
| 75 | /// @param[in] day Time of Clock day | ||
| 76 | /// @param[in] hour Time of Clock hour | ||
| 77 | /// @param[in] minute Time of Clock minute | ||
| 78 | /// @param[in] second Time of Clock second | ||
| 79 | /// @param[in] m_tau_n -τ_n = SV clock bias [s] | ||
| 80 | /// @param[in] gamma_n SV relative frequency bias | ||
| 81 | /// @param[in] messageFrameTime Message frame time (tk+(nd*86400)) in seconds of the UTC week | ||
| 82 | /// @param[in] satPos_x Satellite position X (km) | ||
| 83 | /// @param[in] satVel_x velocity X dot (km/sec) | ||
| 84 | /// @param[in] satAccel_x X acceleration (km/sec2) | ||
| 85 | /// @param[in] health Health | ||
| 86 | /// @param[in] satPos_y Satellite position Y (km) | ||
| 87 | /// @param[in] satVel_y velocity Y dot (km/sec) | ||
| 88 | /// @param[in] satAccel_y Y acceleration (km/sec2) | ||
| 89 | /// @param[in] frequencyNumber Frequency number (-7 ... +13) (-7 ...+6 (ICD 5.1)) | ||
| 90 | /// @param[in] satPos_z Satellite position Z (km) | ||
| 91 | /// @param[in] satVel_z velocity Z dot (km/sec) | ||
| 92 | /// @param[in] satAccel_z Z acceleration (km/sec2) | ||
| 93 | /// @param[in] ageOfOperationInfo Age of oper. information (days) (E) | ||
| 94 | /// @param[in] statusFlags Status Flags | ||
| 95 | /// @param[in] L1L2groupDelayDifference L1/L2 group delay difference Δτ (seconds) | ||
| 96 | /// @param[in] URAI URAI; GLO-M/K only - raw accuracy index F_T. | ||
| 97 | /// @param[in] healthFlags Health Flags | ||
| 98 | /// @param[in] tau_c Coefficient of linear polynomial of time system difference [s] | ||
| 99 | GLONASSEphemeris(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t minute, double second, | ||
| 100 | double m_tau_n, double gamma_n, double messageFrameTime, | ||
| 101 | double satPos_x, double satVel_x, double satAccel_x, double health, | ||
| 102 | double satPos_y, double satVel_y, double satAccel_y, double frequencyNumber, | ||
| 103 | double satPos_z, double satVel_z, double satAccel_z, double ageOfOperationInfo, | ||
| 104 | double statusFlags = 0.0, double L1L2groupDelayDifference = 0.0, double URAI = 0.0, double healthFlags = 0.0, | ||
| 105 | double tau_c = 0.0); | ||
| 106 | #endif | ||
| 107 | |||
| 108 | /// @brief Destructor | ||
| 109 | 31454 | ~GLONASSEphemeris() final = default; | |
| 110 | /// @brief Copy constructor | ||
| 111 | GLONASSEphemeris(const GLONASSEphemeris&) = default; | ||
| 112 | /// @brief Move constructor | ||
| 113 | GLONASSEphemeris(GLONASSEphemeris&&) = default; | ||
| 114 | /// @brief Copy assignment operator | ||
| 115 | GLONASSEphemeris& operator=(const GLONASSEphemeris&) = delete; | ||
| 116 | /// @brief Move assignment operator | ||
| 117 | GLONASSEphemeris& operator=(GLONASSEphemeris&&) = delete; | ||
| 118 | |||
| 119 | /// @brief Calculates the Variance of the satellite position in [m^2] | ||
| 120 | [[nodiscard]] double calcSatellitePositionVariance() const final; | ||
| 121 | |||
| 122 | /// @brief Calculates clock bias and drift of the satellite | ||
| 123 | /// @param[in] recvTime Receive time of the signal | ||
| 124 | /// @param[in] dist Distance between receiver and satellite (normally the pseudorange) [m] | ||
| 125 | /// @param[in] freq Signal Frequency | ||
| 126 | /// @note See https://gssc.esa.int/navipedia/index.php/Clock_Modelling | ||
| 127 | [[nodiscard]] Corrections calcClockCorrections(const InsTime& recvTime, double dist, const Frequency& freq) const final; | ||
| 128 | |||
| 129 | /// @brief Checks whether the signal is healthy | ||
| 130 | [[nodiscard]] bool isHealthy() const final; | ||
| 131 | |||
| 132 | private: | ||
| 133 | /// Integration step size in [s] | ||
| 134 | static constexpr double _h = 60.0; | ||
| 135 | |||
| 136 | /// @brief Calculates position, velocity and acceleration of the satellite at transmission time | ||
| 137 | /// @param[in] transTime Transmit time of the signal | ||
| 138 | /// @param[in] calc Flags which determine what should be calculated and returned | ||
| 139 | /// @note See \cite GLO-ICD-CDMA-1.0 GLO-ICD-CDMA-1.0, J2, p. 53ff | ||
| 140 | [[nodiscard]] PosVelAccel calcSatelliteData(const InsTime& transTime, Orbit::Calc calc) const final; | ||
| 141 | }; | ||
| 142 | |||
| 143 | } // namespace NAV | ||
| 144 |