From 2bf9fce57724068abf7275ddc36d0428285258a5 Mon Sep 17 00:00:00 2001 From: Matthias Grob Date: Thu, 4 Sep 2025 14:56:34 +0200 Subject: [PATCH] Sticks: globalize MPC_HOLD_DZ to MAN_DEADZONE --- .../amovlabf410_drone_v1.15.4.params | 1 - docs/en/flight_modes_mc/position.md | 12 ++++++------ src/lib/sticks/Sticks.cpp | 8 ++++---- src/lib/sticks/Sticks.hpp | 2 +- .../manual_control/manual_control_params.c | 17 +++++++++++++++++ src/modules/mc_att_control/mc_att_control.hpp | 2 +- .../mc_att_control/mc_att_control_main.cpp | 2 +- .../multicopter_position_mode_params.c | 13 ------------- 8 files changed, 30 insertions(+), 27 deletions(-) diff --git a/docs/assets/airframes/multicopter/amovlab_f410/amovlabf410_drone_v1.15.4.params b/docs/assets/airframes/multicopter/amovlab_f410/amovlabf410_drone_v1.15.4.params index 0d16ea9f01..d742b0fc3e 100644 --- a/docs/assets/airframes/multicopter/amovlab_f410/amovlabf410_drone_v1.15.4.params +++ b/docs/assets/airframes/multicopter/amovlab_f410/amovlabf410_drone_v1.15.4.params @@ -645,7 +645,6 @@ 1 1 MPC_ACC_HOR_MAX 5.000000000000000000 9 1 1 MPC_ACC_UP_MAX 4.000000000000000000 9 1 1 MPC_ALT_MODE 2 6 -1 1 MPC_HOLD_DZ 0.100000001490116119 9 1 1 MPC_HOLD_MAX_XY 0.800000011920928955 9 1 1 MPC_HOLD_MAX_Z 0.600000023841857910 9 1 1 MPC_JERK_AUTO 4.000000000000000000 9 diff --git a/docs/en/flight_modes_mc/position.md b/docs/en/flight_modes_mc/position.md index cb85fc53ac..746a1baaac 100644 --- a/docs/en/flight_modes_mc/position.md +++ b/docs/en/flight_modes_mc/position.md @@ -43,7 +43,7 @@ While very rare on a well calibrated vehicle, sometimes there may be problems wi RC mode where roll, pitch, throttle (RPT) sticks control movement in corresponding axes/directions. Centered sticks level vehicle and hold it to fixed altitude and position against wind. -- Centered roll, pitch, throttle sticks (within RC deadzone [MPC_HOLD_DZ](../advanced_config/parameter_reference.md#MPC_HOLD_DZ)) hold x, y, z position steady against any disturbance like wind. +- Centered roll, pitch, throttle sticks (within RC deadzone [MAN_DEADZONE](../advanced_config/parameter_reference.md#MAN_DEADZONE)) hold x, y, z position steady against any disturbance like wind. - Outside center: - Roll/Pitch sticks control horizontal acceleration over ground in the vehicle's left-right and forward-back directions (respectively). - Throttle stick controls speed of ascent-descent. @@ -51,10 +51,10 @@ Centered sticks level vehicle and hold it to fixed altitude and position against - Takeoff: - When landed, the vehicle will take off if the throttle stick is raised above 62.5% percent (of the full range from bottom). - Global position estimate is required. -- Manual control input is required (such as RC control, joystick). - - Roll, Pitch, Throttle: Assistance from autopilot to hold position against wind. - - Yaw: Assistance from autopilot to stabilize the attitude rate. - Position of RC stick maps to the rate of rotation of vehicle in that orientation. +- Manual control input is required (such as RC control, joystick). + - Roll, Pitch, Throttle: Assistance from autopilot to hold position against wind. + - Yaw: Assistance from autopilot to stabilize the attitude rate. + Position of RC stick maps to the rate of rotation of vehicle in that orientation. ### Parameters @@ -62,7 +62,7 @@ All the parameters in the [Multicopter Position Control](../advanced_config/para | Parameter | Description | | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [MPC_HOLD_DZ](../advanced_config/parameter_reference.md#MPC_HOLD_DZ) | Deadzone of sticks where position hold is enabled. Default: 0.1 (10% of full stick range). | +| [MAN_DEADZONE](../advanced_config/parameter_reference.md#MAN_DEADZONE) | Deadzone of sticks where position hold is enabled. Default: 0.1 (10% of full stick range). | | [MPC_Z_VEL_MAX_UP](../advanced_config/parameter_reference.md#MPC_Z_VEL_MAX_UP) | Maximum vertical ascent velocity. Default: 3 m/s. | | [MPC_Z_VEL_MAX_DN](../advanced_config/parameter_reference.md#MPC_Z_VEL_MAX_DN) | Maximum vertical descent velocity. Default: 1 m/s. | | [MPC_LAND_ALT1](../advanced_config/parameter_reference.md#MPC_LAND_ALT1) | Altitude for triggering first phase of slow landing. Below this altitude descending velocity gets limited to a value between [MPC_Z_VEL_MAX_DN](#MPC_Z_VEL_MAX_DN) (or `MPC_Z_V_AUTO_DN`) and [MPC_LAND_SPEED](#MPC_LAND_SPEED). Value needs to be higher than [MPC_LAND_ALT2](#MPC_LAND_ALT2). Default 10m. | diff --git a/src/lib/sticks/Sticks.cpp b/src/lib/sticks/Sticks.cpp index fb5bc40673..0150e4af2f 100644 --- a/src/lib/sticks/Sticks.cpp +++ b/src/lib/sticks/Sticks.cpp @@ -57,10 +57,10 @@ bool Sticks::checkAndUpdateStickInputs() _positions(3) = manual_control_setpoint.yaw; // Exponential scale - _positions_expo(0) = math::expo_deadzone(_positions(0), _param_mpc_xy_man_expo.get(), _param_mpc_hold_dz.get()); - _positions_expo(1) = math::expo_deadzone(_positions(1), _param_mpc_xy_man_expo.get(), _param_mpc_hold_dz.get()); - _positions_expo(2) = math::expo_deadzone(_positions(2), _param_mpc_z_man_expo.get(), _param_mpc_hold_dz.get()); - _positions_expo(3) = math::expo_deadzone(_positions(3), _param_mpc_yaw_expo.get(), _param_mpc_hold_dz.get()); + _positions_expo(0) = math::expo_deadzone(_positions(0), _param_mpc_xy_man_expo.get(), _param_man_deadzone.get()); + _positions_expo(1) = math::expo_deadzone(_positions(1), _param_mpc_xy_man_expo.get(), _param_man_deadzone.get()); + _positions_expo(2) = math::expo_deadzone(_positions(2), _param_mpc_z_man_expo.get(), _param_man_deadzone.get()); + _positions_expo(3) = math::expo_deadzone(_positions(3), _param_mpc_yaw_expo.get(), _param_man_deadzone.get()); _aux_positions(0) = manual_control_setpoint.aux1; _aux_positions(1) = manual_control_setpoint.aux2; diff --git a/src/lib/sticks/Sticks.hpp b/src/lib/sticks/Sticks.hpp index 3ab13368e8..a169549b01 100644 --- a/src/lib/sticks/Sticks.hpp +++ b/src/lib/sticks/Sticks.hpp @@ -101,7 +101,7 @@ private: uORB::Subscription _failsafe_flags_sub{ORB_ID(failsafe_flags)}; DEFINE_PARAMETERS( - (ParamFloat) _param_mpc_hold_dz, + (ParamFloat) _param_man_deadzone, (ParamFloat) _param_mpc_xy_man_expo, (ParamFloat) _param_mpc_z_man_expo, (ParamFloat) _param_mpc_yaw_expo diff --git a/src/modules/manual_control/manual_control_params.c b/src/modules/manual_control/manual_control_params.c index 7fde0d6dd3..30bfa35b4c 100644 --- a/src/modules/manual_control/manual_control_params.c +++ b/src/modules/manual_control/manual_control_params.c @@ -58,3 +58,20 @@ PARAM_DEFINE_INT32(MAN_ARM_GESTURE, 1); * @max 15 */ PARAM_DEFINE_FLOAT(MAN_KILL_GEST_T, -1.f); + +/** + * Deadzone for sticks (only specific use cases) + * + * Range around stick center ignored to prevent + * vehicle drift from stick hardware inaccuracy. + * + * Does not apply to any precise constant input like + * throttle and attitude or rate piloting. + * + * @min 0 + * @max 1 + * @decimal 2 + * @increment 0.01 + * @group Manual Control + */ +PARAM_DEFINE_FLOAT(MAN_DEADZONE, 0.1f); diff --git a/src/modules/mc_att_control/mc_att_control.hpp b/src/modules/mc_att_control/mc_att_control.hpp index 4743d1936d..c3b67bc47d 100644 --- a/src/modules/mc_att_control/mc_att_control.hpp +++ b/src/modules/mc_att_control/mc_att_control.hpp @@ -161,7 +161,7 @@ private: (ParamFloat) _param_mc_yawrate_max, /* Stabilized mode params */ - (ParamFloat) _param_mpc_hold_dz, + (ParamFloat) _param_man_deadzone, (ParamFloat) _param_mpc_man_tilt_max, (ParamFloat) _param_mpc_manthr_min, (ParamFloat) _param_mpc_thr_max, diff --git a/src/modules/mc_att_control/mc_att_control_main.cpp b/src/modules/mc_att_control/mc_att_control_main.cpp index f79e8ff911..6e7b8ee44a 100644 --- a/src/modules/mc_att_control/mc_att_control_main.cpp +++ b/src/modules/mc_att_control/mc_att_control_main.cpp @@ -147,7 +147,7 @@ MulticopterAttitudeControl::generate_attitude_setpoint(const Quatf &q, float dt) const float yaw = Eulerf(q).psi(); const float yaw_stick_input = math::expo_deadzone(_manual_control_setpoint.yaw, _param_mpc_yaw_expo.get(), - _param_mpc_hold_dz.get()); + _param_man_deadzone.get()); _stick_yaw.generateYawSetpoint(attitude_setpoint.yaw_sp_move_rate, _yaw_setpoint_stabilized, yaw_stick_input, yaw, dt, _unaided_heading); diff --git a/src/modules/mc_pos_control/multicopter_position_mode_params.c b/src/modules/mc_pos_control/multicopter_position_mode_params.c index b70bb95a3e..0df673350e 100644 --- a/src/modules/mc_pos_control/multicopter_position_mode_params.c +++ b/src/modules/mc_pos_control/multicopter_position_mode_params.c @@ -130,19 +130,6 @@ PARAM_DEFINE_FLOAT(MPC_ACC_HOR_MAX, 5.f); */ PARAM_DEFINE_FLOAT(MPC_JERK_MAX, 8.f); -/** - * Deadzone for sticks in manual piloted modes - * - * Does not apply to manual throttle and direct attitude piloting by stick. - * - * @min 0 - * @max 1 - * @decimal 2 - * @increment 0.01 - * @group Multicopter Position Control - */ -PARAM_DEFINE_FLOAT(MPC_HOLD_DZ, 0.1f); - /** * Manual position control stick exponential curve sensitivity *