From 69aebe650be10c330c21668749d49a174c778b7b Mon Sep 17 00:00:00 2001 From: Matthias Grob Date: Mon, 12 Jun 2023 12:17:39 +0200 Subject: [PATCH] FixedwingRateControl: rework VTOL differential thrust saturation Co-authored-by: Silvan Fuhrer --- .../fw_rate_control/FixedwingRateControl.cpp | 45 ++++++++++++------- .../fw_rate_control/FixedwingRateControl.hpp | 10 ++++- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/modules/fw_rate_control/FixedwingRateControl.cpp b/src/modules/fw_rate_control/FixedwingRateControl.cpp index 7948e6eb11..80810205be 100644 --- a/src/modules/fw_rate_control/FixedwingRateControl.cpp +++ b/src/modules/fw_rate_control/FixedwingRateControl.cpp @@ -278,26 +278,41 @@ void FixedwingRateControl::Run() _rate_control.resetIntegral(); } - // update saturation status from control allocation feedback + // Update saturation status from control allocation feedback + // TODO: send the unallocated value directly for better anti-windup + Vector3 diffthr_enabled( + _param_vt_fw_difthr_en.get() & static_cast(VTOLFixedWingDifferentialThrustEnabledBit::ROLL_BIT), + _param_vt_fw_difthr_en.get() & static_cast(VTOLFixedWingDifferentialThrustEnabledBit::PITCH_BIT), + _param_vt_fw_difthr_en.get() & static_cast(VTOLFixedWingDifferentialThrustEnabledBit::YAW_BIT) + ); + + if (_vehicle_status.is_vtol_tailsitter) { + // Swap roll and yaw + diffthr_enabled.swapRows(0, 2); + } + + // saturation handling for axis controlled by differential thrust (VTOL only) control_allocator_status_s control_allocator_status; - if (_control_allocator_status_subs[_vehicle_status.is_vtol ? 1 : 0].update(&control_allocator_status)) { - Vector saturation_positive; - Vector saturation_negative; - - if (!control_allocator_status.torque_setpoint_achieved) { - for (size_t i = 0; i < 3; i++) { - if (control_allocator_status.unallocated_torque[i] > FLT_EPSILON) { - saturation_positive(i) = true; - - } else if (control_allocator_status.unallocated_torque[i] < -FLT_EPSILON) { - saturation_negative(i) = true; - } + // Set saturation flags for VTOL differential thrust feature + // If differential thrust is enabled in an axis, assume it's the only torque authority and only update saturation using matrix 0 allocating the motors. + if (_control_allocator_status_subs[0].update(&control_allocator_status)) { + for (size_t i = 0; i < 3; i++) { + if (diffthr_enabled(i)) { + _rate_control.setPositiveSaturationFlag(i, control_allocator_status.unallocated_torque[i] > FLT_EPSILON); + _rate_control.setNegativeSaturationFlag(i, control_allocator_status.unallocated_torque[i] < -FLT_EPSILON); } } + } - // TODO: send the unallocated value directly for better anti-windup - _rate_control.setSaturationStatus(saturation_positive, saturation_negative); + // Set saturation flags for control surface controlled axes + if (_control_allocator_status_subs[_vehicle_status.is_vtol ? 1 : 0].update(&control_allocator_status)) { + for (size_t i = 0; i < 3; i++) { + if (!diffthr_enabled(i)) { + _rate_control.setPositiveSaturationFlag(i, control_allocator_status.unallocated_torque[i] > FLT_EPSILON); + _rate_control.setNegativeSaturationFlag(i, control_allocator_status.unallocated_torque[i] < -FLT_EPSILON); + } + } } /* bi-linear interpolation over airspeed for actuator trim scheduling */ diff --git a/src/modules/fw_rate_control/FixedwingRateControl.hpp b/src/modules/fw_rate_control/FixedwingRateControl.hpp index 37c70a800a..45e97ab25c 100644 --- a/src/modules/fw_rate_control/FixedwingRateControl.hpp +++ b/src/modules/fw_rate_control/FixedwingRateControl.hpp @@ -144,6 +144,13 @@ private: bool _in_fw_or_transition_wo_tailsitter_transition{false}; // only run the FW attitude controller in these states + // enum for bitmask of VT_FW_DIFTHR_EN parameter options + enum class VTOLFixedWingDifferentialThrustEnabledBit : int32_t { + YAW_BIT = (1 << 0), + ROLL_BIT = (1 << 1), + PITCH_BIT = (1 << 2), + }; + DEFINE_PARAMETERS( (ParamFloat) _param_fw_acro_x_max, (ParamFloat) _param_fw_acro_y_max, @@ -194,7 +201,8 @@ private: (ParamFloat) _param_trim_roll, (ParamFloat) _param_trim_yaw, - (ParamInt) _param_fw_spoilers_man + (ParamInt) _param_fw_spoilers_man, + (ParamInt) _param_vt_fw_difthr_en ) RateControl _rate_control; ///< class for rate control calculations