|
|
|
@ -144,7 +144,7 @@ AP_PitchController::AP_PitchController(AP_AHRS &ahrs, const AP_Vehicle::FixedWin
@@ -144,7 +144,7 @@ AP_PitchController::AP_PitchController(AP_AHRS &ahrs, const AP_Vehicle::FixedWin
|
|
|
|
|
/*
|
|
|
|
|
AC_PID based rate controller |
|
|
|
|
*/ |
|
|
|
|
int32_t AP_PitchController::_get_rate_out(float desired_rate, float scaler, bool disable_integrator, float aspeed) |
|
|
|
|
int32_t AP_PitchController::_get_rate_out(float desired_rate, float scaler, bool disable_integrator, float aspeed, bool ground_mode) |
|
|
|
|
{ |
|
|
|
|
const float dt = AP::scheduler().get_loop_period_s(); |
|
|
|
|
const float eas2tas = _ahrs.get_EAS2TAS(); |
|
|
|
@ -196,6 +196,10 @@ int32_t AP_PitchController::_get_rate_out(float desired_rate, float scaler, bool
@@ -196,6 +196,10 @@ int32_t AP_PitchController::_get_rate_out(float desired_rate, float scaler, bool
|
|
|
|
|
|
|
|
|
|
// sum components
|
|
|
|
|
float out = pinfo.FF + pinfo.P + pinfo.I + pinfo.D; |
|
|
|
|
if (ground_mode) { |
|
|
|
|
// when on ground suppress D and half P term to prevent oscillations
|
|
|
|
|
out -= pinfo.D + 0.5*pinfo.P; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// remember the last output to trigger the I limit
|
|
|
|
|
_last_out = out; |
|
|
|
@ -226,7 +230,7 @@ int32_t AP_PitchController::get_rate_out(float desired_rate, float scaler)
@@ -226,7 +230,7 @@ int32_t AP_PitchController::get_rate_out(float desired_rate, float scaler)
|
|
|
|
|
// If no airspeed available use average of min and max
|
|
|
|
|
aspeed = 0.5f*(float(aparm.airspeed_min) + float(aparm.airspeed_max)); |
|
|
|
|
} |
|
|
|
|
return _get_rate_out(desired_rate, scaler, false, aspeed); |
|
|
|
|
return _get_rate_out(desired_rate, scaler, false, aspeed, false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -278,7 +282,7 @@ float AP_PitchController::_get_coordination_rate_offset(float &aspeed, bool &inv
@@ -278,7 +282,7 @@ float AP_PitchController::_get_coordination_rate_offset(float &aspeed, bool &inv
|
|
|
|
|
// 4) minimum FBW airspeed (metres/sec)
|
|
|
|
|
// 5) maximum FBW airspeed (metres/sec)
|
|
|
|
|
//
|
|
|
|
|
int32_t AP_PitchController::get_servo_out(int32_t angle_err, float scaler, bool disable_integrator) |
|
|
|
|
int32_t AP_PitchController::get_servo_out(int32_t angle_err, float scaler, bool disable_integrator, bool ground_mode) |
|
|
|
|
{ |
|
|
|
|
// Calculate offset to pitch rate demand required to maintain pitch angle whilst banking
|
|
|
|
|
// Calculate ideal turn rate from bank angle and airspeed assuming a level coordinated turn
|
|
|
|
@ -331,7 +335,7 @@ int32_t AP_PitchController::get_servo_out(int32_t angle_err, float scaler, bool
@@ -331,7 +335,7 @@ int32_t AP_PitchController::get_servo_out(int32_t angle_err, float scaler, bool
|
|
|
|
|
desired_rate *= (1 - roll_prop); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return _get_rate_out(desired_rate, scaler, disable_integrator, aspeed); |
|
|
|
|
return _get_rate_out(desired_rate, scaler, disable_integrator, aspeed, ground_mode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_PitchController::reset_I() |
|
|
|
|