forked from Archive/PX4-Autopilot
ekf2: push fuse beta config into backend
This commit is contained in:
parent
0996e5319f
commit
298cc61e07
|
@ -336,6 +336,7 @@ struct parameters {
|
||||||
float arsp_thr{2.0f}; ///< Airspeed fusion threshold. A value of zero will deactivate airspeed fusion
|
float arsp_thr{2.0f}; ///< Airspeed fusion threshold. A value of zero will deactivate airspeed fusion
|
||||||
|
|
||||||
// synthetic sideslip fusion
|
// synthetic sideslip fusion
|
||||||
|
int32_t beta_fusion_enabled{0};
|
||||||
float beta_innov_gate{5.0f}; ///< synthetic sideslip innovation consistency gate size in standard deviation (STD)
|
float beta_innov_gate{5.0f}; ///< synthetic sideslip innovation consistency gate size in standard deviation (STD)
|
||||||
float beta_noise{0.3f}; ///< synthetic sideslip noise (rad)
|
float beta_noise{0.3f}; ///< synthetic sideslip noise (rad)
|
||||||
const float beta_avg_ft_us{150000.0f}; ///< The average time between synthetic sideslip measurements (uSec)
|
const float beta_avg_ft_us{150000.0f}; ///< The average time between synthetic sideslip measurements (uSec)
|
||||||
|
|
|
@ -570,30 +570,31 @@ void Ekf::controlAirDataFusion()
|
||||||
|
|
||||||
void Ekf::controlBetaFusion()
|
void Ekf::controlBetaFusion()
|
||||||
{
|
{
|
||||||
if (_control_status.flags.fake_pos) {
|
_control_status.flags.fuse_beta = _params.beta_fusion_enabled && _control_status.flags.fixed_wing
|
||||||
return;
|
&& _control_status.flags.in_air && !_control_status.flags.fake_pos;
|
||||||
}
|
|
||||||
|
|
||||||
// Perform synthetic sideslip fusion at regular intervals when in-air and sideslip fuson had been enabled externally:
|
if (_control_status.flags.fuse_beta) {
|
||||||
const bool beta_fusion_time_triggered = isTimedOut(_aid_src_sideslip.time_last_fuse, _params.beta_avg_ft_us);
|
|
||||||
|
|
||||||
if (beta_fusion_time_triggered &&
|
// Perform synthetic sideslip fusion at regular intervals when in-air and sideslip fusion had been enabled externally:
|
||||||
_control_status.flags.fuse_beta &&
|
const bool beta_fusion_time_triggered = isTimedOut(_aid_src_sideslip.time_last_fuse, _params.beta_avg_ft_us);
|
||||||
_control_status.flags.in_air) {
|
|
||||||
updateSideslip(_aid_src_sideslip);
|
|
||||||
_innov_check_fail_status.flags.reject_sideslip = _aid_src_sideslip.innovation_rejected;
|
|
||||||
|
|
||||||
// If starting wind state estimation, reset the wind states and covariances before fusing any data
|
if (beta_fusion_time_triggered) {
|
||||||
if (!_control_status.flags.wind) {
|
|
||||||
// activate the wind states
|
|
||||||
_control_status.flags.wind = true;
|
|
||||||
// reset the timeout timers to prevent repeated resets
|
|
||||||
_aid_src_sideslip.time_last_fuse = _imu_sample_delayed.time_us;
|
|
||||||
resetWind();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Vector2f(Vector2f(_state.vel) - _state.wind_vel).longerThan(7.f)) {
|
updateSideslip(_aid_src_sideslip);
|
||||||
fuseSideslip(_aid_src_sideslip);
|
_innov_check_fail_status.flags.reject_sideslip = _aid_src_sideslip.innovation_rejected;
|
||||||
|
|
||||||
|
// If starting wind state estimation, reset the wind states and covariances before fusing any data
|
||||||
|
if (!_control_status.flags.wind) {
|
||||||
|
// activate the wind states
|
||||||
|
_control_status.flags.wind = true;
|
||||||
|
// reset the timeout timers to prevent repeated resets
|
||||||
|
_aid_src_sideslip.time_last_fuse = _imu_sample_delayed.time_us;
|
||||||
|
resetWind();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Vector2f(Vector2f(_state.vel) - _state.wind_vel).longerThan(7.f)) {
|
||||||
|
fuseSideslip(_aid_src_sideslip);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,9 +132,6 @@ public:
|
||||||
// set vehicle is fixed wing status
|
// set vehicle is fixed wing status
|
||||||
void set_is_fixed_wing(bool is_fixed_wing) { _control_status.flags.fixed_wing = is_fixed_wing; }
|
void set_is_fixed_wing(bool is_fixed_wing) { _control_status.flags.fixed_wing = is_fixed_wing; }
|
||||||
|
|
||||||
// set flag if synthetic sideslip measurement should be fused
|
|
||||||
void set_fuse_beta_flag(bool fuse_beta) { _control_status.flags.fuse_beta = (fuse_beta && _control_status.flags.in_air); }
|
|
||||||
|
|
||||||
// set flag if static pressure rise due to ground effect is expected
|
// set flag if static pressure rise due to ground effect is expected
|
||||||
// use _params.gnd_effect_deadzone to adjust for expected rise in static pressure
|
// use _params.gnd_effect_deadzone to adjust for expected rise in static pressure
|
||||||
// flag will clear after GNDEFFECT_TIMEOUT uSec
|
// flag will clear after GNDEFFECT_TIMEOUT uSec
|
||||||
|
|
|
@ -145,6 +145,7 @@ EKF2::EKF2(bool multi_mode, const px4::wq_config_t &config, bool replay_mode):
|
||||||
_param_ekf2_ev_pos_y(_params->ev_pos_body(1)),
|
_param_ekf2_ev_pos_y(_params->ev_pos_body(1)),
|
||||||
_param_ekf2_ev_pos_z(_params->ev_pos_body(2)),
|
_param_ekf2_ev_pos_z(_params->ev_pos_body(2)),
|
||||||
_param_ekf2_arsp_thr(_params->arsp_thr),
|
_param_ekf2_arsp_thr(_params->arsp_thr),
|
||||||
|
_param_ekf2_fuse_beta(_params->beta_fusion_enabled),
|
||||||
_param_ekf2_tau_vel(_params->vel_Tau),
|
_param_ekf2_tau_vel(_params->vel_Tau),
|
||||||
_param_ekf2_tau_pos(_params->pos_Tau),
|
_param_ekf2_tau_pos(_params->pos_Tau),
|
||||||
_param_ekf2_gbias_init(_params->switch_on_gyro_bias),
|
_param_ekf2_gbias_init(_params->switch_on_gyro_bias),
|
||||||
|
@ -532,9 +533,6 @@ void EKF2::Run()
|
||||||
if (_status_sub.copy(&vehicle_status)) {
|
if (_status_sub.copy(&vehicle_status)) {
|
||||||
const bool is_fixed_wing = (vehicle_status.vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING);
|
const bool is_fixed_wing = (vehicle_status.vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING);
|
||||||
|
|
||||||
// only fuse synthetic sideslip measurements if conditions are met
|
|
||||||
_ekf.set_fuse_beta_flag(is_fixed_wing && (_param_ekf2_fuse_beta.get() == 1));
|
|
||||||
|
|
||||||
// let the EKF know if the vehicle motion is that of a fixed wing (forward flight only relative to wind)
|
// let the EKF know if the vehicle motion is that of a fixed wing (forward flight only relative to wind)
|
||||||
_ekf.set_is_fixed_wing(is_fixed_wing);
|
_ekf.set_is_fixed_wing(is_fixed_wing);
|
||||||
|
|
||||||
|
|
|
@ -569,7 +569,7 @@ private:
|
||||||
// control of airspeed and sideslip fusion
|
// control of airspeed and sideslip fusion
|
||||||
(ParamExtFloat<px4::params::EKF2_ARSP_THR>)
|
(ParamExtFloat<px4::params::EKF2_ARSP_THR>)
|
||||||
_param_ekf2_arsp_thr, ///< A value of zero will disabled airspeed fusion. Any positive value sets the minimum airspeed which will be used (m/sec)
|
_param_ekf2_arsp_thr, ///< A value of zero will disabled airspeed fusion. Any positive value sets the minimum airspeed which will be used (m/sec)
|
||||||
(ParamInt<px4::params::EKF2_FUSE_BETA>)
|
(ParamExtInt<px4::params::EKF2_FUSE_BETA>)
|
||||||
_param_ekf2_fuse_beta, ///< Controls synthetic sideslip fusion, 0 disables, 1 enables
|
_param_ekf2_fuse_beta, ///< Controls synthetic sideslip fusion, 0 disables, 1 enables
|
||||||
|
|
||||||
// output predictor filter time constants
|
// output predictor filter time constants
|
||||||
|
|
Loading…
Reference in New Issue