/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) demanded pitch rate in degrees/second 2) control gain scaler = scaling_speed / aspeed 3) boolean which is true when stabilise mode is active 4) minimum FBW airspeed (metres/sec) 5) maximum FBW airspeed (metres/sec) */ int32_t AP_PitchController::get_rate_out(float desired_rate, float scaler) { float aspeed; if (!_ahrs.airspeed_estimate(&aspeed)) { // 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); }
/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) demanded bank angle in centi-degrees 2) control gain scaler = scaling_speed / aspeed 3) boolean which is true when stabilise mode is active 4) minimum FBW airspeed (metres/sec) */ int32_t AP_RollController::get_servo_out(int32_t angle_err, float scaler, bool stabilize) { if (_tau < 0.1) { _tau = 0.1; } // Calculate the desired roll rate (deg/sec) from the angle error float desired_rate = angle_err * 0.01f / _tau; return _get_rate_out(desired_rate, scaler, stabilize); }
/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) demanded bank angle in centi-degrees 2) control gain scaler = scaling_speed / aspeed 3) boolean which is true when stabilise mode is active 4) minimum FBW airspeed (metres/sec) */ int32_t AP_RollController::get_servo_out(int32_t angle_err, float scaler, bool disable_integrator) { if (gains.tau < 0.1f) { gains.tau.set(0.1f); } // Calculate the desired roll rate (deg/sec) from the angle error float desired_rate = angle_err * 0.01f / gains.tau; return _get_rate_out(desired_rate, scaler, disable_integrator); }
/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) demanded bank angle in centi-degrees 2) control gain scaler = scaling_speed / aspeed 3) boolean which is true when stabilise mode is active 4) minimum FBW airspeed (metres/sec) */ int32_t AP_RollController::get_servo_out(int32_t angle, float scaler, bool stabilize, int16_t aspd_min) { // Calculate bank angle error in centi-degrees int32_t angle_err = angle - _ahrs->roll_sensor; if (_tau < 0.1) { _tau = 0.1; } // Calculate the desired roll rate (deg/sec) from the angle error float desired_rate = angle_err * 0.01f / _tau; return _get_rate_out(desired_rate, scaler, stabilize, aspd_min); }
// Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 // A positive demand is up // Inputs are: // 1) demanded pitch angle in centi-degrees // 2) control gain scaler = scaling_speed / aspeed // 3) boolean which is true when stabilise mode is active // 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) { // 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 // Pitch rate offset is the component of turn rate about the pitch axis float aspeed; float rate_offset; bool inverted; if (gains.tau < 0.1f) { gains.tau.set(0.1f); } rate_offset = _get_coordination_rate_offset(aspeed, inverted); // Calculate the desired pitch rate (deg/sec) from the angle error float desired_rate = angle_err * 0.01f / gains.tau; // limit the maximum pitch rate demand. Don't apply when inverted // as the rates will be tuned when upright, and it is common that // much higher rates are needed inverted if (!inverted) { if (_max_rate_neg && desired_rate < -_max_rate_neg) { desired_rate = -_max_rate_neg; } else if (gains.rmax && desired_rate > gains.rmax) { desired_rate = gains.rmax; } } if (inverted) { desired_rate = -desired_rate; } // Apply the turn correction offset desired_rate = desired_rate + rate_offset; return _get_rate_out(desired_rate, scaler, disable_integrator, aspeed); }
/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) desired roll rate in degrees/sec 2) control gain scaler = scaling_speed / aspeed */ int32_t AP_RollController::get_rate_out(float desired_rate, float scaler) { return _get_rate_out(desired_rate, scaler, true); }
/* Function returns an equivalent elevator deflection in centi-degrees in the range from -4500 to 4500 A positive demand is up Inputs are: 1) demanded pitch rate in degrees/second 2) control gain scaler = scaling_speed / aspeed 3) boolean which is true when stabilise mode is active 4) minimum FBW airspeed (metres/sec) 5) maximum FBW airspeed (metres/sec) */ int32_t AP_PitchController::get_rate_out(float desired_rate, float scaler) { return _get_rate_out(desired_rate, scaler, false, 0); }