INSTINCT Code Coverage Report


Directory: src/
File: Navigation/GNSS/Positioning/SPP/KalmanFilter.hpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 0 1 0.0%
Functions: 0 1 0.0%
Branches: 0 0 -%

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 KalmanFilter.hpp
10 /// @brief
11 /// @author T. Topp (topp@ins.uni-stuttgart.de)
12 /// @author P. Peitschat (paula.peitschat@ins.uni-stuttgart.de)
13 /// @date 2023-12-22
14
15 #pragma once
16
17 #include <array>
18 #include <set>
19
20 #include "Navigation/Constants.hpp"
21 #include "Navigation/GNSS/Core/SatelliteIdentifier.hpp"
22 #include "Navigation/GNSS/Core/SatelliteSystem.hpp"
23 #include "Navigation/GNSS/Positioning/SPP/Keys.hpp"
24 #include "Navigation/GNSS/SystemModel/MotionModel.hpp"
25 #include "Navigation/GNSS/SystemModel/ReceiverClockModel.hpp"
26 #include "Navigation/GNSS/SystemModel/InterFrequencyBiasModel.hpp"
27 #include "Navigation/GNSS/SystemModel/SystemModel.hpp"
28 #include "Navigation/Math/KeyedKalmanFilter.hpp"
29 #include "Navigation/Time/InsTime.hpp"
30
31 #include "util/Eigen.hpp"
32
33 namespace NAV::SPP
34 {
35
36 /// @brief The Spp Kalman Filter related options
37 class KalmanFilter // NOLINT(clang-analyzer-optin.performance.Padding)
38 {
39 public:
40 /// @brief Resets the filter
41 /// @param satelliteSystems Satellite systems to consider
42 void reset(const std::vector<SatelliteSystem>& satelliteSystems);
43
44 /// @brief Initialize the filter
45 /// @param states States to initialize with
46 /// @param variance Variance of the state
47 void initialize(const KeyedVectorXd<States::StateKeyType>& states, const KeyedMatrixXd<States::StateKeyType, States::StateKeyType>& variance);
48
49 /// @brief Deinitialize the KF (can be used to reinitialize the Filter when results seem strange)
50 void deinitialize();
51
52 /// @brief Checks wether the Kalman filter is initialized
53 [[nodiscard]] bool isInitialized() const { return _initialized; }
54
55 /// @brief Does the Kalman Filter prediction
56 /// @param[in] dt Time step [s]
57 /// @param[in] lla_pos Position in Latitude, Longitude, Altitude [rad, rad, m]
58 /// @param[in] nameId Name and id of the node calling this (only used for logging purposes)
59 void predict(const double& dt, const Eigen::Vector3d& lla_pos, const std::string& nameId);
60
61 /// @brief Does the Kalman Filter update
62 /// @param[in] measKeys Measurement keys
63 /// @param[in] H Measurement sensitivity matrix 𝐇
64 /// @param[in] R Measurement noise covariance matrix 𝐑
65 /// @param[in] dz Measurement innovation 𝜹𝐳
66 /// @param[in] nameId Name and id of the node calling this (only used for logging purposes)
67 void update(const std::vector<Meas::MeasKeyTypes>& measKeys,
68 const KeyedMatrixXd<Meas::MeasKeyTypes, States::StateKeyType>& H,
69 const KeyedMatrixXd<Meas::MeasKeyTypes, Meas::MeasKeyTypes>& R,
70 const KeyedVectorXd<Meas::MeasKeyTypes>& dz,
71 const std::string& nameId);
72
73 /// @brief Adds the frequency as inter-frequency bias state
74 /// @param[in] freq Frequency to estimate the inter-frequency bias for
75 void addInterFrequencyBias(const Frequency& freq);
76
77 /// @brief Shows the GUI input to select the options
78 /// @param[in] id Unique id for ImGui.
79 /// @param[in] useDoppler Whether to use doppler measurements
80 /// @param[in] multiConstellation Whether to use multiple constellations
81 /// @param[in] estimateInterFrequencyBiases Whether to use estimate inter frequency biases
82 /// @param[in] itemWidth Width of the widgets
83 /// @param[in] unitWidth Width on unit inputs
84 /// @return True when something was changed
85 bool ShowGuiWidgets(const char* id, bool useDoppler, bool multiConstellation, bool estimateInterFrequencyBiases, float itemWidth, float unitWidth);
86
87 /// @brief Set the P matrix entry for the covariance of the clock phase drift
88 /// @param clkPhaseDrift Clock phase drift variance in [m^2 / s]
89 void setClockBiasErrorCovariance(double clkPhaseDrift);
90
91 /// @brief Get the States in the Kalman Filter
92 [[nodiscard]] const std::vector<SPP::States::StateKeyType>& getStateKeys() const;
93
94 /// @brief Returns the State vector x̂
95 [[nodiscard]] const KeyedVectorXd<States::StateKeyType>& getState() const;
96
97 /// @brief Returns the Error covariance matrix 𝐏
98 [[nodiscard]] const KeyedMatrixXd<States::StateKeyType, States::StateKeyType>& getErrorCovarianceMatrix() const;
99
100 private:
101 // /// @brief All position keys
102 // const std::vector<SPP::States::StateKeyType>& PosKey = Keys::Pos<SPP::States::StateKeyType>;
103
104 /// @brief All velocity keys
105 const std::vector<SPP::States::StateKeyType>& VelKey = Keys::Vel<SPP::States::StateKeyType>;
106 /// @brief All position and velocity keys
107 const std::vector<SPP::States::StateKeyType>& PosVelKey = Keys::PosVel<SPP::States::StateKeyType>;
108
109 /// Kalman Filter representation
110 KeyedKalmanFilterD<SPP::States::StateKeyType, SPP::Meas::MeasKeyTypes> _kalmanFilter{ PosVelKey, {} };
111
112 /// Boolean that determines, if Kalman Filter is initialized (from weighted LSE solution)
113 bool _initialized = false;
114
115 SystemModelCalcAlgorithm _systemModelCalcAlgorithm = SystemModelCalcAlgorithm::Taylor1; ///< Algorithm to calculate the system models with
116 MotionModel<SPP::States::StateKeyType> _motionModel; ///< Motion Model
117 ReceiverClockModel<SPP::States::StateKeyType> _receiverClockModel; ///< Receiver clock Model
118 InterFrequencyBiasModel<SPP::States::StateKeyType> _interFrequencyBiasModel; ///< Inter-frequency bias Model
119
120 // ###########################################################################################################
121
122 /// Possible Units for the P matrix initialization velocity uncertainty
123 enum class InitCovarianceVelocityUnits : uint8_t
124 {
125 m_s, ///< [ m / s ]
126 m2_s2, ///< [ m^2 / s^2 ]
127 };
128 /// Gui selection for the Unit of the P matrix initialization velocity uncertainty
129 InitCovarianceVelocityUnits _gui_initCovarianceVelocityUnit = InitCovarianceVelocityUnits::m_s;
130
131 /// @brief GUI selection for the P matrix initialization velocity uncertainty
132 double _gui_initCovarianceVelocity = 10 /* [ m / s ] */;
133 /// @brief Covariance of the P matrix initialization velocity uncertainty [m²/s²]
134 double _initCovarianceVelocity = 100;
135
136 // ###########################################################################################################
137
138 /// Possible Units for the P matrix initialization clock drift uncertainty
139 enum class InitCovarianceClockDriftUnits : uint8_t
140 {
141 m_s, ///< [ m / s ]
142 s_s, ///< [ s / s ]
143 m2_s2, ///< [ m^2 / s^2 ]
144 s2_s2, ///< [ s^2 / s^2 ]
145 };
146 /// Gui selection for the Unit of the P matrix initialization clock drift uncertainty
147 InitCovarianceClockDriftUnits _gui_initCovarianceClockDriftUnit = InitCovarianceClockDriftUnits::s_s;
148
149 /// @brief GUI selection for the P matrix initialization clock drift uncertainty
150 double _gui_initCovarianceClockDrift = 1e-6 /* [ s / s ] */;
151 /// @brief Covariance of the P matrix initialization clock drift uncertainty [m²/s²]
152 double _initCovarianceClockDrift = std::pow(1e-6 * InsConst::C, 2);
153
154 // ###########################################################################################################
155
156 /// Gui selection for the Unit of the P matrix initialization inter system clock drift uncertainty
157 InitCovarianceClockDriftUnits _gui_initCovarianceInterSysClockDriftUnit = InitCovarianceClockDriftUnits::s_s;
158
159 /// @brief GUI selection for the P matrix initialization inter system clock drift uncertainty
160 double _gui_initCovarianceInterSysClockDrift = 1e-6 /* [ s / s ] */;
161 /// @brief Covariance of the P matrix initialization inter system clock drift uncertainty [m²/s²]
162 double _initCovarianceInterSysClockDrift = std::pow(1e-6 * InsConst::C, 2);
163
164 // ###########################################################################################################
165 // ###########################################################################################################
166
167 friend void to_json(json& j, const KalmanFilter& data);
168 friend void from_json(const json& j, KalmanFilter& data);
169 };
170
171 /// @brief Converts the provided data into a json object
172 /// @param[out] j Json object which gets filled with the info
173 /// @param[in] data Data to convert into json
174 void to_json(json& j, const KalmanFilter& data);
175 /// @brief Converts the provided json object into the data object
176 /// @param[in] j Json object with the needed values
177 /// @param[out] data Object to fill from the json
178 void from_json(const json& j, KalmanFilter& data);
179
180 } // namespace NAV::SPP
181