|
|
|
@ -147,6 +147,19 @@ void AP_AutoTune::stop(void)
@@ -147,6 +147,19 @@ void AP_AutoTune::stop(void)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char *AP_AutoTune::axis_string(void) const |
|
|
|
|
{ |
|
|
|
|
switch (type) { |
|
|
|
|
case AUTOTUNE_ROLL: |
|
|
|
|
return "Roll"; |
|
|
|
|
case AUTOTUNE_PITCH: |
|
|
|
|
return "Pitch"; |
|
|
|
|
case AUTOTUNE_YAW: |
|
|
|
|
return "Yaw"; |
|
|
|
|
} |
|
|
|
|
return ""; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
one update cycle of the autotuner |
|
|
|
|
*/ |
|
|
|
@ -189,13 +202,21 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
@@ -189,13 +202,21 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
|
|
|
|
|
max_SRate_P = MAX(max_SRate_P, slew_limiter_P.get_slew_rate()); |
|
|
|
|
max_SRate_D = MAX(max_SRate_D, slew_limiter_D.get_slew_rate()); |
|
|
|
|
|
|
|
|
|
float att_limit_deg; |
|
|
|
|
if (type == AUTOTUNE_ROLL) { |
|
|
|
|
float att_limit_deg = 0; |
|
|
|
|
switch (type) { |
|
|
|
|
case AUTOTUNE_ROLL: |
|
|
|
|
att_limit_deg = aparm.roll_limit_cd * 0.01; |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
case AUTOTUNE_PITCH: |
|
|
|
|
att_limit_deg = MIN(abs(aparm.pitch_limit_max_cd),abs(aparm.pitch_limit_min_cd))*0.01; |
|
|
|
|
break; |
|
|
|
|
case AUTOTUNE_YAW: |
|
|
|
|
// arbitrary value for yaw angle
|
|
|
|
|
att_limit_deg = 20; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// thresholds for when we consider an event to start and end
|
|
|
|
|
const float rate_threshold1 = 0.4 * MIN(att_limit_deg / current.tau.get(), current.rmax_pos); |
|
|
|
|
const float rate_threshold2 = 0.25 * rate_threshold1; |
|
|
|
@ -337,7 +358,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
@@ -337,7 +358,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
|
|
|
|
|
D_limit = D; |
|
|
|
|
D_set_ms = now; |
|
|
|
|
action = Action::LOWER_D; |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sD: %.4f", type==AUTOTUNE_ROLL?"Roll":"Pitch", D_limit); |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sD: %.4f", axis_string(), D_limit); |
|
|
|
|
} |
|
|
|
|
} else if (min_Dmod < 1.0) { |
|
|
|
|
// oscillation, with D_limit set
|
|
|
|
@ -349,7 +370,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
@@ -349,7 +370,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
|
|
|
|
|
D_limit = D; |
|
|
|
|
D_set_ms = now; |
|
|
|
|
action = Action::LOWER_D; |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sD: %.4f", type==AUTOTUNE_ROLL?"Roll":"Pitch", D_limit); |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sD: %.4f", axis_string(), D_limit); |
|
|
|
|
done_count = 0; |
|
|
|
|
} else if (now - P_set_ms > 2500) { |
|
|
|
|
if (is_positive(P_limit)) { |
|
|
|
@ -365,7 +386,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
@@ -365,7 +386,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
|
|
|
|
|
P_set_ms = now; |
|
|
|
|
action = Action::LOWER_P; |
|
|
|
|
done_count = 0; |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sP: %.4f", type==AUTOTUNE_ROLL?"Roll":"Pitch", P_limit); |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%sP: %.4f", axis_string(), P_limit); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (ff_count < 4) { |
|
|
|
@ -384,7 +405,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
@@ -384,7 +405,7 @@ void AP_AutoTune::update(AP_Logger::PID_Info &pinfo, float scaler, float angle_e
|
|
|
|
|
// have done 3 cycles without reducing P
|
|
|
|
|
if (done_count < 3) { |
|
|
|
|
if (++done_count == 3) { |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%s: Finished", type==AUTOTUNE_ROLL?"Roll":"Pitch"); |
|
|
|
|
GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%s: Finished", axis_string()); |
|
|
|
|
save_gains(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|