119 if (_last_t == 0 || dt > 1000) {
124 float delta_time = (float)dt * 0.001
f;
130 float achieved_rate =
ToDeg(omega_y);
131 float rate_error = (desired_rate - achieved_rate) * scaler;
137 if (!disable_integrator &&
gains.
I > 0) {
150 k_I =
MAX(k_I, 0.15
f);
155 float integrator_delta = rate_error * ki_rate * delta_time * scaler;
158 integrator_delta =
MAX(integrator_delta , 0);
161 integrator_delta =
MIN(integrator_delta , 0);
179 float k_ff =
gains.
FF / eas2tas;
215 if (roll_wrapped > 9000) {
216 roll_wrapped = 18000 - roll_wrapped;
261 if (fabsf(bank_angle) <
radians(90)) {
266 if (bank_angle > 0.0
f) {
283 rate_offset = -rate_offset;
313 float desired_rate = angle_err * 0.01f /
gains.
tau;
327 desired_rate = -desired_rate;
331 desired_rate = desired_rate + rate_offset;
333 return _get_rate_out(desired_rate, scaler, disable_integrator, aspeed);
float _get_coordination_rate_offset(float &aspeed, bool &inverted) const
int32_t get_rate_out(float desired_rate, float scaler)
virtual const Vector3f & get_gyro(void) const =0
static const struct AP_Param::GroupInfo var_info[]
void update(float desired_rate, float achieved_rate, float servo_out)
#define AP_GROUPINFO(name, idx, clazz, element, def)
virtual bool airspeed_estimate(float *airspeed_ret) const
static auto MAX(const A &one, const B &two) -> decltype(one > two ? one :two)
DataFlash_Class::PID_Info _pid_info
AP_AutoTune::ATGains gains
bool is_zero(const T fVal1)
const AP_HAL::HAL & hal
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
float constrain_float(const float amt, const float low, const float high)
static constexpr float radians(float deg)
const AP_Vehicle::FixedWing & aparm
int32_t get_servo_out(int32_t angle_err, float scaler, bool disable_integrator)
float get_EAS2TAS(void) const
int32_t _get_rate_out(float desired_rate, float scaler, bool disable_integrator, float aspeed)