|
|
|
@ -32,14 +32,14 @@
@@ -32,14 +32,14 @@
|
|
|
|
|
****************************************************************************/ |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @file baro_bias_estimator.cpp |
|
|
|
|
* @file bias_estimator.cpp |
|
|
|
|
* |
|
|
|
|
* @author Mathieu Bresciani <mathieu@auterion.com> |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "baro_bias_estimator.hpp" |
|
|
|
|
#include "bias_estimator.hpp" |
|
|
|
|
|
|
|
|
|
void BaroBiasEstimator::predict(const float dt) |
|
|
|
|
void BiasEstimator::predict(const float dt) |
|
|
|
|
{ |
|
|
|
|
// State is constant
|
|
|
|
|
// Predict state covariance only
|
|
|
|
@ -62,12 +62,12 @@ void BaroBiasEstimator::predict(const float dt)
@@ -62,12 +62,12 @@ void BaroBiasEstimator::predict(const float dt)
|
|
|
|
|
_status.bias_var = _state_var; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void BaroBiasEstimator::constrainStateVar() |
|
|
|
|
void BiasEstimator::constrainStateVar() |
|
|
|
|
{ |
|
|
|
|
_state_var = math::constrain(_state_var, 1e-8f, _state_var_max); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void BaroBiasEstimator::fuseBias(const float measurement, const float measurement_var) |
|
|
|
|
void BiasEstimator::fuseBias(const float measurement, const float measurement_var) |
|
|
|
|
{ |
|
|
|
|
const float innov_var = _state_var + measurement_var; |
|
|
|
|
const float innov = measurement - _state; |
|
|
|
@ -85,28 +85,28 @@ void BaroBiasEstimator::fuseBias(const float measurement, const float measuremen
@@ -85,28 +85,28 @@ void BaroBiasEstimator::fuseBias(const float measurement, const float measuremen
|
|
|
|
|
_status = packStatus(innov, innov_var, innov_test_ratio); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline float BaroBiasEstimator::computeInnovTestRatio(const float innov, const float innov_var) const |
|
|
|
|
inline float BiasEstimator::computeInnovTestRatio(const float innov, const float innov_var) const |
|
|
|
|
{ |
|
|
|
|
return innov * innov / (_gate_size * _gate_size * innov_var); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool BaroBiasEstimator::isTestRatioPassing(const float innov_test_ratio) const |
|
|
|
|
inline bool BiasEstimator::isTestRatioPassing(const float innov_test_ratio) const |
|
|
|
|
{ |
|
|
|
|
return innov_test_ratio < 1.f; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void BaroBiasEstimator::updateState(const float K, const float innov) |
|
|
|
|
inline void BiasEstimator::updateState(const float K, const float innov) |
|
|
|
|
{ |
|
|
|
|
_state = math::constrain(_state + K * innov, -_state_max, _state_max); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void BaroBiasEstimator::updateStateCovariance(const float K) |
|
|
|
|
inline void BiasEstimator::updateStateCovariance(const float K) |
|
|
|
|
{ |
|
|
|
|
_state_var -= K * _state_var; |
|
|
|
|
constrainStateVar(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void BaroBiasEstimator::updateOffsetDetection(const float innov, const float innov_test_ratio) |
|
|
|
|
inline void BiasEstimator::updateOffsetDetection(const float innov, const float innov_test_ratio) |
|
|
|
|
{ |
|
|
|
|
const float signed_innov_test_ratio = matrix::sign(innov) * innov_test_ratio; |
|
|
|
|
_signed_innov_test_ratio_lpf.update(math::constrain(signed_innov_test_ratio, -1.f, 1.f)); |
|
|
|
@ -121,7 +121,7 @@ inline void BaroBiasEstimator::updateOffsetDetection(const float innov, const fl
@@ -121,7 +121,7 @@ inline void BaroBiasEstimator::updateOffsetDetection(const float innov, const fl
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool BaroBiasEstimator::isOffsetDetected() const |
|
|
|
|
inline bool BiasEstimator::isOffsetDetected() const |
|
|
|
|
{ |
|
|
|
|
// There is an offset in the estimate if the average of innovation is statistically too large
|
|
|
|
|
// or if the sign of the innovation is constantly the same
|
|
|
|
@ -130,7 +130,7 @@ inline bool BaroBiasEstimator::isOffsetDetected() const
@@ -130,7 +130,7 @@ inline bool BaroBiasEstimator::isOffsetDetected() const
|
|
|
|
|
|| (_time_since_last_negative_innov > _innov_sequence_monitnoring_time_constant); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline BaroBiasEstimator::status BaroBiasEstimator::packStatus(const float innov, const float innov_var, |
|
|
|
|
inline BiasEstimator::status BiasEstimator::packStatus(const float innov, const float innov_var, |
|
|
|
|
const float innov_test_ratio) const |
|
|
|
|
{ |
|
|
|
|
// Send back status for logging
|