21 #ifndef KALMAN_FILTER__ESRCF_HPP_ 22 #define KALMAN_FILTER__ESRCF_HPP_ 37 namespace kalman_filter
47 template<
int32_t NumStates,
int32_t ProcessNoiseDim>
58 const Eigen::Matrix<float32_t, NumStates, ProcessNoiseDim> & GQ_chol_prod)
59 : m_model_ptr{&model},
60 m_is_mat1_covariance{
false},
61 m_B_mat{GQ_chol_prod},
62 m_GQ_factor{GQ_chol_prod} {}
71 const Eigen::Matrix<float32_t, NumStates, ProcessNoiseDim> & GQ_chol_prod,
74 :
Esrcf{model, GQ_chol_prod}
83 m_model_ptr->reset(x0);
93 m_square_mat2 = P0_chol;
94 m_is_mat1_covariance =
false;
101 return m_is_mat1_covariance ? m_square_mat1 : m_square_mat2;
107 return m_model_ptr->get_state();
115 const square_mat_t & cov_mat = m_is_mat1_covariance ? m_square_mat1 : m_square_mat2;
116 square_mat_t & jac_mat = m_is_mat1_covariance ? m_square_mat2 : m_square_mat1;
118 m_model_ptr->compute_jacobian_and_predict(jac_mat, dt);
121 jac_mat = jac_mat * cov_mat;
123 m_srcf_core.right_lower_triangularize_matrices(jac_mat, m_B_mat);
124 m_is_mat1_covariance = !m_is_mat1_covariance;
125 m_B_mat = m_GQ_factor;
133 template<
int32_t NumObs>
135 const Eigen::Matrix<float32_t, NumObs, 1U> & z,
136 const Eigen::Matrix<float32_t, NumObs, NumStates> & H,
137 const Eigen::Matrix<float32_t, NumObs, 1U> & R_diag)
139 square_mat_t & cov_mat = m_is_mat1_covariance ? m_square_mat1 : m_square_mat2;
141 m_state_tmp = m_model_ptr->get_state();
145 likelihood += m_srcf_core.scalar_update(
153 m_model_ptr->reset(m_state_tmp);
166 m_state_tmp = m_model_ptr->get_state();
167 m_state_tmp -= x_mix;
168 const float32_t sq_prob = sqrtf(self_transition_prob);
169 square_mat_t & cov = m_is_mat1_covariance ? m_square_mat1 : m_square_mat2;
171 m_state_tmp *= sq_prob;
172 m_srcf_core.right_lower_triangularize_matrices(cov, m_state_tmp);
173 m_model_ptr->reset(x_mix);
191 const index_t rank_other = NumStates)
194 m_state_tmp = x_other;
195 m_state_tmp -= m_model_ptr->get_state();
197 const float32_t sq_prob = sqrtf(other_transition_prob);
198 m_state_tmp *= sq_prob;
199 cov_other *= sq_prob;
200 square_mat_t & cov = m_is_mat1_covariance ? m_square_mat1 : m_square_mat2;
204 m_srcf_core.zero_row(cov, m_state_tmp, i,
index_t(), 1U);
205 m_srcf_core.zero_row(cov, cov_other, i,
index_t(), rank_other);
207 m_srcf_core.zero_row(cov, cov, i, i + 1, NumStates);
218 Eigen::Matrix<float32_t, NumStates, ProcessNoiseDim> m_B_mat;
219 Eigen::Matrix<float32_t, NumStates, ProcessNoiseDim> m_GQ_factor;
220 static_assert(NumStates > 0U,
"must have positive number of states");
221 static_assert(ProcessNoiseDim > 0U,
"must have positive number of process noise dimensions");
227 #endif // KALMAN_FILTER__ESRCF_HPP_ Eigen::Index index_t
Type for matrix indexing.
Definition: srcf_core.hpp:40
Esrcf(motion::motion_model::MotionModel< NumStates > &model, const Eigen::Matrix< float32_t, NumStates, ProcessNoiseDim > &GQ_chol_prod, const state_vec_t &x0, const square_mat_t &P0_chol)
constructor, equivalent of construct(model, GQ, DIAG); reset(x, P);
Definition: esrcf.hpp:69
void temporal_update(const std::chrono::nanoseconds &dt)
Do temporal update: update state estimate, compute jacobian, update covariance.
Definition: esrcf.hpp:112
float float32_t
Definition: types.hpp:36
This class is an implementation of the carlson-schmidt temporal and observation update for the square...
Definition: srcf_core.hpp:47
void reset(const state_vec_t &x0, const square_mat_t &P0_chol)
Initialize state and covariance.
Definition: esrcf.hpp:90
bool bool8_t
Definition: types.hpp:33
void imm_self_mix(const float32_t self_transition_prob, const state_vec_t &x_mix)
Compute first component of mixed covariance for this model: P_i' = u_i * (P_i + (x_i - x) * (x_i - x)...
Definition: esrcf.hpp:164
This file includes common type definition.
void imm_other_mix(const float32_t other_transition_prob, const state_vec_t &x_other, square_mat_t &cov_other, const index_t rank_other=NumStates)
Adds covariance components from another model to this model, computes P0' = P0 + u_other * (P_other +...
Definition: esrcf.hpp:187
float32_t observation_update(const Eigen::Matrix< float32_t, NumObs, 1U > &z, const Eigen::Matrix< float32_t, NumObs, NumStates > &H, const Eigen::Matrix< float32_t, NumObs, 1U > &R_diag)
Do observation update: update state estimate and covariance. temporal_update() is assumed to have bee...
Definition: esrcf.hpp:134
Eigen::Matrix< float32_t, NumStates, NumStates > square_mat_t
Definition: srcf_core.hpp:51
This file defines the core algorithms for square root covariance filtering.
Eigen::Matrix< float32_t, NumStates, 1 > state_vec_t
Definition: srcf_core.hpp:50
const state_vec_t & get_state() const
Get state as a passthrough to the motion model.
Definition: esrcf.hpp:105
typename SrcfCore< NumStates, ProcessNoiseDim >::state_vec_t state_vec_t
Definition: esrcf.hpp:51
void reset(const state_vec_t &x0)
Update state externally.
Definition: esrcf.hpp:81
This file defines the motion model interface used by kalman filters.
Esrcf(motion::motion_model::MotionModel< NumStates > &model, const Eigen::Matrix< float32_t, NumStates, ProcessNoiseDim > &GQ_chol_prod)
constructor
Definition: esrcf.hpp:56
Virtual interface for all motion models for use with prediction.
Definition: motion_model.hpp:46
typename SrcfCore< NumStates, ProcessNoiseDim >::square_mat_t square_mat_t
Definition: esrcf.hpp:52
This class wraps the carlson-schmidt square root covariance filter with some vector-valued motion mod...
Definition: esrcf.hpp:48
const square_mat_t & get_covariance() const
Get covariance.
Definition: esrcf.hpp:99
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24