From eec757915c0289dd02a963fb1475e34b27293c18 Mon Sep 17 00:00:00 2001 From: Matthias Grob <maetugr@gmail.com> Date: Mon, 20 Mar 2017 17:42:21 +0100 Subject: [PATCH] mc_pos_control: switch manual vertical/z velocity curve to expo with deadzone --- .../mc_pos_control/mc_pos_control_main.cpp | 30 +++---------------- .../mc_pos_control/mc_pos_control_params.c | 30 ++++++++++--------- 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/modules/mc_pos_control/mc_pos_control_main.cpp b/src/modules/mc_pos_control/mc_pos_control_main.cpp index dafd0da288..59a869af45 100644 --- a/src/modules/mc_pos_control/mc_pos_control_main.cpp +++ b/src/modules/mc_pos_control/mc_pos_control_main.cpp @@ -164,6 +164,7 @@ private: control::BlockParamFloat _manual_thr_min; control::BlockParamFloat _manual_thr_max; control::BlockParamFloat _manual_land_alt; + control::BlockParamFloat _z_vel_man_expo; control::BlockDerivative _vel_x_deriv; control::BlockDerivative _vel_y_deriv; @@ -174,7 +175,6 @@ private: param_t thr_max; param_t thr_hover; param_t alt_ctl_dz; - param_t alt_ctl_dy; param_t z_p; param_t z_vel_p; param_t z_vel_i; @@ -215,7 +215,6 @@ private: float thr_max; float thr_hover; float alt_ctl_dz; - float alt_ctl_dy; float tilt_max_air; float land_speed; float tko_speed; @@ -315,7 +314,6 @@ private: */ void poll_subscriptions(); - static float scale_control(float ctl, float end, float dz, float dy); static float throttle_curve(float ctl, float ctr); /** @@ -434,6 +432,7 @@ MulticopterPositionControl::MulticopterPositionControl() : _manual_thr_min(this, "MANTHR_MIN"), _manual_thr_max(this, "MANTHR_MAX"), _manual_land_alt(this, "MIS_LTRMIN_ALT", false), + _z_vel_man_expo(this, "Z_MAN_EXPO"), _vel_x_deriv(this, "VELD"), _vel_y_deriv(this, "VELD"), _vel_z_deriv(this, "VELD"), @@ -492,7 +491,6 @@ MulticopterPositionControl::MulticopterPositionControl() : _params_handles.thr_max = param_find("MPC_THR_MAX"); _params_handles.thr_hover = param_find("MPC_THR_HOVER"); _params_handles.alt_ctl_dz = param_find("MPC_ALTCTL_DZ"); - _params_handles.alt_ctl_dy = param_find("MPC_ALTCTL_DY"); _params_handles.z_p = param_find("MPC_Z_P"); _params_handles.z_vel_p = param_find("MPC_Z_VEL_P"); _params_handles.z_vel_i = param_find("MPC_Z_VEL_I"); @@ -578,7 +576,6 @@ MulticopterPositionControl::parameters_update(bool force) param_get(_params_handles.thr_hover, &_params.thr_hover); _params.thr_hover = math::constrain(_params.thr_hover, _params.thr_min, _params.thr_max); param_get(_params_handles.alt_ctl_dz, &_params.alt_ctl_dz); - param_get(_params_handles.alt_ctl_dy, &_params.alt_ctl_dy); param_get(_params_handles.tilt_max_air, &_params.tilt_max_air); _params.tilt_max_air = math::radians(_params.tilt_max_air); param_get(_params_handles.land_speed, &_params.land_speed); @@ -816,25 +813,6 @@ MulticopterPositionControl::poll_subscriptions() } } -float -MulticopterPositionControl::scale_control(float ctl, float end, float dz, float dy) -{ - if (ctl > dz) { - return dy + (ctl - dz) * (1.0f - dy) / (end - dz); - - } else if (ctl < -dz) { - return -dy + (ctl + dz) * (1.0f - dy) / (end - dz); - - } else { - if (dz < FLT_EPSILON) { - return 0; - - } else { - return ctl * (dy / dz); - } - } -} - float MulticopterPositionControl::throttle_curve(float ctl, float ctr) { @@ -965,7 +943,7 @@ MulticopterPositionControl::control_manual(float dt) if (_control_mode.flag_control_altitude_enabled) { /* set vertical velocity setpoint with throttle stick */ - req_vel_sp_z = -scale_control(_manual.z - 0.5f, 0.5f, _params.alt_ctl_dz, _params.alt_ctl_dy); // D + req_vel_sp_z = -math::expo_deadzone((_manual.z - 0.5f) * 2.f, _z_vel_man_expo.get(), _params.alt_ctl_dz); /* reset alt setpoint to current altitude if needed */ reset_alt_sp(); @@ -1015,7 +993,7 @@ MulticopterPositionControl::control_manual(float dt) if (_alt_hold_engaged) { /* only switch back to velocity control if user moves stick */ - _alt_hold_engaged = _control_mode.flag_control_altitude_enabled && (fabsf(req_vel_sp_z) < _params.hold_z_dz); + _alt_hold_engaged = _control_mode.flag_control_altitude_enabled && (fabsf(req_vel_sp_z) < FLT_EPSILON); } else { diff --git a/src/modules/mc_pos_control/mc_pos_control_params.c b/src/modules/mc_pos_control/mc_pos_control_params.c index da20465677..e36398dadd 100644 --- a/src/modules/mc_pos_control/mc_pos_control_params.c +++ b/src/modules/mc_pos_control/mc_pos_control_params.c @@ -87,20 +87,6 @@ PARAM_DEFINE_FLOAT(MPC_THR_HOVER, 0.5f); */ PARAM_DEFINE_FLOAT(MPC_ALTCTL_DZ, 0.1f); -/** - * ALTCTL throttle curve breakpoint height - * - * Controls the slope of the reduced sensitivity region. - * This is the height of the ALTCTL throttle - * curve at center-dz and center+dz. - * - * @min 0.0 - * @max 0.2 - * @decimal 2 - * @group Multicopter Position Control - */ -PARAM_DEFINE_FLOAT(MPC_ALTCTL_DY, 0.0f); - /** * Maximum thrust in auto thrust control * @@ -509,3 +495,19 @@ PARAM_DEFINE_INT32(MPC_ALT_MODE, 0); * @group Multicopter Position Control */ PARAM_DEFINE_FLOAT(MPC_XY_MAN_EXPO, 0.0f); + +/** + * Manual control stick vertical exponential curve + * + * The higher the value the less sensitivity the stick has around zero + * while still reaching the maximum value with full stick deflection. + * + * 0 Purely linear input curve (default) + * 1 Purely cubic input curve + * + * @min 0 + * @max 1 + * @decimal 2 + * @group Multicopter Position Control + */ +PARAM_DEFINE_FLOAT(MPC_Z_MAN_EXPO, 0.0f); -- GitLab