mirror of https://github.com/ArduPilot/ardupilot
AC_PID: add support to smoothly reset the integrator
This commit is contained in:
parent
ff6621f3b6
commit
31580d82ee
|
@ -249,6 +249,23 @@ void AC_PID::reset_I()
|
||||||
_integrator = 0;
|
_integrator = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AC_PID::reset_I_smoothly()
|
||||||
|
{
|
||||||
|
float reset_time = AC_PID_RESET_TC * 3.0f;
|
||||||
|
uint64_t now = AP_HAL::micros64();
|
||||||
|
|
||||||
|
if ((now - _reset_last_update) > 5e5 ) {
|
||||||
|
_reset_counter = 0;
|
||||||
|
}
|
||||||
|
if ((float)_reset_counter < (reset_time/_dt)) {
|
||||||
|
_integrator = _integrator - (_dt / (_dt + AC_PID_RESET_TC)) * _integrator;
|
||||||
|
_reset_counter++;
|
||||||
|
} else {
|
||||||
|
_integrator = 0;
|
||||||
|
}
|
||||||
|
_reset_last_update = now;
|
||||||
|
}
|
||||||
|
|
||||||
void AC_PID::load_gains()
|
void AC_PID::load_gains()
|
||||||
{
|
{
|
||||||
_kp.load();
|
_kp.load();
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#define AC_PID_TFILT_HZ_DEFAULT 0.0f // default input filter frequency
|
#define AC_PID_TFILT_HZ_DEFAULT 0.0f // default input filter frequency
|
||||||
#define AC_PID_EFILT_HZ_DEFAULT 0.0f // default input filter frequency
|
#define AC_PID_EFILT_HZ_DEFAULT 0.0f // default input filter frequency
|
||||||
#define AC_PID_DFILT_HZ_DEFAULT 20.0f // default input filter frequency
|
#define AC_PID_DFILT_HZ_DEFAULT 20.0f // default input filter frequency
|
||||||
|
#define AC_PID_RESET_TC 0.16f // Time constant for integrator reset decay to zero
|
||||||
|
|
||||||
/// @class AC_PID
|
/// @class AC_PID
|
||||||
/// @brief Copter PID control class
|
/// @brief Copter PID control class
|
||||||
|
@ -56,6 +57,9 @@ public:
|
||||||
// reset_I - reset the integrator
|
// reset_I - reset the integrator
|
||||||
void reset_I();
|
void reset_I();
|
||||||
|
|
||||||
|
// reset_I - reset the integrator smoothly to zero within 0.5 seconds
|
||||||
|
void reset_I_smoothly();
|
||||||
|
|
||||||
// reset_filter - input filter will be reset to the next value provided to set_input()
|
// reset_filter - input filter will be reset to the next value provided to set_input()
|
||||||
void reset_filter() {
|
void reset_filter() {
|
||||||
_flags._reset_filter = true;
|
_flags._reset_filter = true;
|
||||||
|
@ -131,6 +135,8 @@ protected:
|
||||||
float _target; // target value to enable filtering
|
float _target; // target value to enable filtering
|
||||||
float _error; // error value to enable filtering
|
float _error; // error value to enable filtering
|
||||||
float _derivative; // derivative value to enable filtering
|
float _derivative; // derivative value to enable filtering
|
||||||
|
uint16_t _reset_counter; // loop counter for reset decay
|
||||||
|
uint64_t _reset_last_update; //time in microseconds of last update to reset_I
|
||||||
|
|
||||||
AP_Logger::PID_Info _pid_info;
|
AP_Logger::PID_Info _pid_info;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue