mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-02 11:59:17 +08:00
ekf2: block process noise increment without constraining the variance
The wind variance can be reset to a value larger than the wind init variance (e.g.: when the reset occurs when flying close to the N or E axis). Constraining the variance after a covariance initialization would artificially increase the correlation and could destabilize the filter.
This commit is contained in:
committed by
Mathieu Bresciani
parent
39abd87949
commit
79e0e00d8c
@@ -201,14 +201,15 @@ void Ekf::predictCovariance(const imuSample &imu_delayed)
|
|||||||
#if defined(CONFIG_EKF2_WIND)
|
#if defined(CONFIG_EKF2_WIND)
|
||||||
|
|
||||||
// wind vel: add process noise
|
// wind vel: add process noise
|
||||||
if (!_external_wind_init) {
|
float wind_vel_nsd_scaled = math::constrain(_params.wind_vel_nsd, 0.f, 1.f)
|
||||||
float wind_vel_nsd_scaled = math::constrain(_params.wind_vel_nsd, 0.f, 1.f)
|
* (1.f + _params.wind_vel_nsd_scaler * fabsf(_height_rate_lpf));
|
||||||
* (1.f + _params.wind_vel_nsd_scaler * fabsf(_height_rate_lpf));
|
float wind_vel_process_noise = sq(wind_vel_nsd_scaled) * dt;
|
||||||
float wind_vel_process_noise = sq(wind_vel_nsd_scaled) * dt;
|
|
||||||
|
|
||||||
for (unsigned index = 0; index < State::wind_vel.dof; index++) {
|
for (unsigned index = 0; index < State::wind_vel.dof; index++) {
|
||||||
const unsigned i = State::wind_vel.idx + index;
|
const unsigned i = State::wind_vel.idx + index;
|
||||||
P(i, i) = fminf(P(i, i) + wind_vel_process_noise, sq(_params.initial_wind_uncertainty));
|
|
||||||
|
if (P(i, i) < sq(_params.initial_wind_uncertainty)) {
|
||||||
|
P(i, i) += wind_vel_process_noise;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user