diff --git a/EKF/ekf.h b/EKF/ekf.h index c75f6e4d23..272f85e29e 100644 --- a/EKF/ekf.h +++ b/EKF/ekf.h @@ -596,9 +596,13 @@ private: // zero the specified range of columns in the state covariance matrix void zeroCols(float (&cov_mat)[_k_num_states][_k_num_states], uint8_t first, uint8_t last); - // zero the specified range of off diagonals the state covariance matrix + // zero the specified range of off diagonals in the state covariance matrix void zeroOffDiag(float (&cov_mat)[_k_num_states][_k_num_states], uint8_t first, uint8_t last); + // zero the specified range of off diagonals in the state covariance matrix + // set the diagonals to the supplied value + void setDiag(float (&cov_mat)[_k_num_states][_k_num_states], uint8_t first, uint8_t last, float variance); + // calculate the measurement variance for the optical flow sensor float calcOptFlowMeasVar(); diff --git a/EKF/ekf_helper.cpp b/EKF/ekf_helper.cpp index 6e4b372694..6b36b4fed6 100644 --- a/EKF/ekf_helper.cpp +++ b/EKF/ekf_helper.cpp @@ -1227,6 +1227,20 @@ void Ekf::zeroOffDiag(float (&cov_mat)[_k_num_states][_k_num_states], uint8_t fi } +void Ekf::setDiag(float (&cov_mat)[_k_num_states][_k_num_states], uint8_t first, uint8_t last, float variance) +{ + // zero rows and columns + zeroRows(cov_mat, first, last); + zeroCols(cov_mat, first, last); + + // set diagonals + uint8_t row; + for (row = first; row <= last; row++) { + cov_mat[row][row] = variance; + } + +} + bool Ekf::global_position_is_valid() { // return true if we are not doing unconstrained free inertial navigation and the origin is set