Hi there, can anyone explain me where the D terme and the I term were programmed in this function void AC_PosControl::rate_to_accel_z()
{
const Vector3f& curr_vel = _inav.get_velocity();
float p; // used to capture pid values for logging
// reset last velocity target to current target
if (_flags.reset_rate_to_accel_z) {
_vel_last.z = _vel_target.z;
}
// feed forward desired acceleration calculation
if (_dt > 0.0f) {
if (!_flags.freeze_ff_z) {
_accel_feedforward.z = (_vel_target.z - _vel_last.z) / _dt;
}
else {
// stop the feed forward being calculated during a known discontinuity
_flags.freeze_ff_z = false;
}
}
else {
_accel_feedforward.z = 0.0f;
}
// store this iteration’s velocities for the next iteration
_vel_last.z = _vel_target.z;
// reset velocity error and filter if this controller has just been engaged
if (_flags.reset_rate_to_accel_z) {
// Reset Filter
_vel_error.z = 0;
_vel_error_filter.reset(0);
_flags.reset_rate_to_accel_z = false;
}
else {
// calculate rate error and filter with cut off frequency of 2 Hz
_vel_error.z = _vel_error_filter.apply(_vel_target.z - curr_vel.z, _dt);
}
// calculate p
p = _p_vel_z.kP() * _vel_error.z;
// consolidate and constrain target acceleration
_accel_target.z = _accel_feedforward.z + p;
// set target for accel based throttle controller
accel_to_throttle(_accel_target.z);
}
the schema show there the P and the I and the D whiche it filtred.