From deed462e621bb8a338e142b99befdb78f0c0d214 Mon Sep 17 00:00:00 2001
From: Roman <bapstroman@gmail.com>
Date: Tue, 6 Nov 2018 17:27:22 +0100
Subject: [PATCH] tiltrotor back-transition improvements: - do not set zero
 throttle during the entire back-transition because otherwise we need to make
 the back-transition really short - added ramping up of throttle setpoint
 during backtransition to avoid step inputs - back-transition ends after
 back-transition time and not when motors are fully rotated updwards.
 previously the vehicle would enter hover mode at high speed which was not
 handled well by the mc position controller

Signed-off-by: Roman <bapstroman@gmail.com>
---
 src/modules/vtol_att_control/tiltrotor.cpp | 26 ++++++++++++++++------
 src/modules/vtol_att_control/vtol_type.cpp |  1 +
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/modules/vtol_att_control/tiltrotor.cpp b/src/modules/vtol_att_control/tiltrotor.cpp
index bc9238892e..c6424ed4e4 100644
--- a/src/modules/vtol_att_control/tiltrotor.cpp
+++ b/src/modules/vtol_att_control/tiltrotor.cpp
@@ -124,7 +124,9 @@ void Tiltrotor::update_vtol_state()
 			break;
 
 		case TRANSITION_BACK:
-			if (_tilt_control <= _params_tiltrotor.tilt_mc) {
+			float time_since_trans_start = (float)(hrt_absolute_time() - _vtol_schedule.transition_start) * 1e-6f;
+
+			if (_tilt_control <= _params_tiltrotor.tilt_mc && time_since_trans_start > _params->back_trans_duration) {
 				_vtol_schedule.flight_mode = MC_MODE;
 			}
 
@@ -303,18 +305,28 @@ void Tiltrotor::update_transition_state()
 		// tilt rotors back
 		if (_tilt_control > _params_tiltrotor.tilt_mc) {
 			_tilt_control = _params_tiltrotor.tilt_fw -
-					fabsf(_params_tiltrotor.tilt_fw - _params_tiltrotor.tilt_mc) * time_since_trans_start / _params->back_trans_duration;
+					fabsf(_params_tiltrotor.tilt_fw - _params_tiltrotor.tilt_mc) * time_since_trans_start / 1.0f;
 		}
 
-		// set zero throttle for backtransition otherwise unwanted moments will be created
-		_actuators_mc_in->control[actuator_controls_s::INDEX_THROTTLE] = 0.0f;
-
-		_mc_roll_weight = 0.0f;
+		_mc_yaw_weight = 1.0f;
 
+		// while we quickly rotate back the motors keep throttle at idle
+		if (time_since_trans_start < 1.0f) {
+			_mc_throttle_weight = 0.0f;
+			_mc_roll_weight = 0.0f;
+			_mc_pitch_weight = 0.0f;
+
+		} else {
+			_mc_roll_weight = 1.0f;
+			_mc_pitch_weight = 1.0f;
+			// slowly ramp up throttle to avoid step inputs
+			_mc_throttle_weight = (time_since_trans_start - 1.0f) / 1.0f;
+		}
 	}
 
 	_mc_roll_weight = math::constrain(_mc_roll_weight, 0.0f, 1.0f);
 	_mc_yaw_weight = math::constrain(_mc_yaw_weight, 0.0f, 1.0f);
+	_mc_throttle_weight = math::constrain(_mc_throttle_weight, 0.0f, 1.0f);
 
 	// copy virtual attitude setpoint to real attitude setpoint (we use multicopter att sp)
 	memcpy(_v_att_sp, _mc_virtual_att_sp, sizeof(vehicle_attitude_setpoint_s));
@@ -353,7 +365,7 @@ void Tiltrotor::fill_actuator_outputs()
 
 	} else {
 		_actuators_out_0->control[actuator_controls_s::INDEX_THROTTLE] =
-			_actuators_mc_in->control[actuator_controls_s::INDEX_THROTTLE];
+			_actuators_mc_in->control[actuator_controls_s::INDEX_THROTTLE] * _mc_throttle_weight;
 	}
 
 	_actuators_out_1->timestamp = hrt_absolute_time();
diff --git a/src/modules/vtol_att_control/vtol_type.cpp b/src/modules/vtol_att_control/vtol_type.cpp
index 2700dc4df0..c52d018de9 100644
--- a/src/modules/vtol_att_control/vtol_type.cpp
+++ b/src/modules/vtol_att_control/vtol_type.cpp
@@ -124,6 +124,7 @@ void VtolType::update_mc_state()
 	_mc_roll_weight = 1.0f;
 	_mc_pitch_weight = 1.0f;
 	_mc_yaw_weight = 1.0f;
+	_mc_throttle_weight = 1.0f;
 }
 
 void VtolType::update_fw_state()
-- 
GitLab