From a10a74d4984392c2604f25b8a5a005189c6e1492 Mon Sep 17 00:00:00 2001 From: Randy Mackay Date: Sun, 23 Aug 2015 14:44:45 +0900 Subject: [PATCH] Copter: AUTOTUNE_MIN_D param to allow controlling minimum D --- ArduCopter/Parameters.cpp | 7 +++++++ ArduCopter/Parameters.h | 4 +++- ArduCopter/control_autotune.cpp | 17 ++++++++--------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/ArduCopter/Parameters.cpp b/ArduCopter/Parameters.cpp index 3dd1debade..e63ce6d69f 100644 --- a/ArduCopter/Parameters.cpp +++ b/ArduCopter/Parameters.cpp @@ -1065,6 +1065,13 @@ const AP_Param::Info Copter::var_info[] PROGMEM = { // @User: Standard GSCALAR(autotune_aggressiveness, "AUTOTUNE_AGGR", 0.1f), + // @Param: AUTOTUNE_MIN_D + // @DisplayName: AutoTune minimum D + // @Description: Defines the minimum D gain + // @Range: 0.001 0.006 + // @User: Standard + GSCALAR(autotune_min_d, "AUTOTUNE_MIN_D", 0.004f), + AP_VAREND }; diff --git a/ArduCopter/Parameters.h b/ArduCopter/Parameters.h index 08cf3ab382..672c1a923d 100644 --- a/ArduCopter/Parameters.h +++ b/ArduCopter/Parameters.h @@ -336,8 +336,9 @@ public: k_param_autotune_aggressiveness, k_param_pi_vel_xy, k_param_fs_ekf_action, - k_param_rtl_climb_min, // 249 + k_param_rtl_climb_min, k_param_rpm_sensor, + k_param_autotune_min_d, // 251 // 254,255: reserved }; @@ -498,6 +499,7 @@ public: // Autotune AP_Int8 autotune_axis_bitmask; AP_Float autotune_aggressiveness; + AP_Float autotune_min_d; // Note: keep initializers here in the same order as they are declared // above. diff --git a/ArduCopter/control_autotune.cpp b/ArduCopter/control_autotune.cpp index 37abf986ce..7fe8555d99 100644 --- a/ArduCopter/control_autotune.cpp +++ b/ArduCopter/control_autotune.cpp @@ -57,7 +57,6 @@ #define AUTOTUNE_PI_RATIO_FOR_TESTING 0.1f // I is set 10x smaller than P during testing #define AUTOTUNE_PI_RATIO_FINAL 1.0f // I is set 1x P after testing #define AUTOTUNE_YAW_PI_RATIO_FINAL 0.1f // I is set 1x P after testing -#define AUTOTUNE_RD_MIN 0.004f // minimum Rate D value #define AUTOTUNE_RD_MAX 0.050f // maximum Rate D value #define AUTOTUNE_RLPF_MIN 1.0f // minimum Rate Yaw filter value #define AUTOTUNE_RLPF_MAX 5.0f // maximum Rate Yaw filter value @@ -552,10 +551,10 @@ void Copter::autotune_attitude_control() case AUTOTUNE_TYPE_RD_UP: switch (autotune_state.axis) { case AUTOTUNE_AXIS_ROLL: - autotune_updating_d_up(tune_roll_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_d_up(tune_roll_rd, g.autotune_min_d, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_PITCH: - autotune_updating_d_up(tune_pitch_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_d_up(tune_pitch_rd, g.autotune_min_d, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_YAW: autotune_updating_d_up(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RLPF_MAX, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); @@ -566,10 +565,10 @@ void Copter::autotune_attitude_control() case AUTOTUNE_TYPE_RD_DOWN: switch (autotune_state.axis) { case AUTOTUNE_AXIS_ROLL: - autotune_updating_d_down(tune_roll_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_d_down(tune_roll_rd, g.autotune_min_d, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_PITCH: - autotune_updating_d_down(tune_pitch_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_d_down(tune_pitch_rd, g.autotune_min_d, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_YAW: autotune_updating_d_down(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); @@ -580,10 +579,10 @@ void Copter::autotune_attitude_control() case AUTOTUNE_TYPE_RP_UP: switch (autotune_state.axis) { case AUTOTUNE_AXIS_ROLL: - autotune_updating_p_up_d_down(tune_roll_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_p_up_d_down(tune_roll_rd, g.autotune_min_d, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_PITCH: - autotune_updating_p_up_d_down(tune_pitch_rd, AUTOTUNE_RD_MIN, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); + autotune_updating_p_up_d_down(tune_pitch_rd, g.autotune_min_d, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); break; case AUTOTUNE_AXIS_YAW: autotune_updating_p_up_d_down(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, autotune_target_rate, autotune_test_min, autotune_test_max); @@ -635,11 +634,11 @@ void Copter::autotune_attitude_control() autotune_state.tune_type = AutoTuneTuneType(autotune_state.tune_type + 1); switch (autotune_state.axis) { case AUTOTUNE_AXIS_ROLL: - tune_roll_rd = max(AUTOTUNE_RD_MIN, tune_roll_rd * AUTOTUNE_RD_BACKOFF); + tune_roll_rd = max(g.autotune_min_d, tune_roll_rd * AUTOTUNE_RD_BACKOFF); tune_roll_rp = max(AUTOTUNE_RP_MIN, tune_roll_rp * AUTOTUNE_RD_BACKOFF); break; case AUTOTUNE_AXIS_PITCH: - tune_pitch_rd = max(AUTOTUNE_RD_MIN, tune_pitch_rd * AUTOTUNE_RD_BACKOFF); + tune_pitch_rd = max(g.autotune_min_d, tune_pitch_rd * AUTOTUNE_RD_BACKOFF); tune_pitch_rp = max(AUTOTUNE_RP_MIN, tune_pitch_rp * AUTOTUNE_RD_BACKOFF); break; case AUTOTUNE_AXIS_YAW: