diff --git a/src/modules/vtol_att_control/tiltrotor.cpp b/src/modules/vtol_att_control/tiltrotor.cpp index 1cc1e19088b..d0832138e43 100644 --- a/src/modules/vtol_att_control/tiltrotor.cpp +++ b/src/modules/vtol_att_control/tiltrotor.cpp @@ -251,17 +251,23 @@ void Tiltrotor::update_transition_state() _mc_roll_weight = 1.0f; _mc_yaw_weight = 1.0f; - if (PX4_ISFINITE(_attc->get_calibrated_airspeed()) && + const float airspeed_trans_blend_margin = getTransitionAirspeed() - getBlendAirspeed(); + + if (airspeed_trans_blend_margin > FLT_EPSILON && + PX4_ISFINITE(_attc->get_calibrated_airspeed()) && _attc->get_calibrated_airspeed() >= getBlendAirspeed()) { _mc_roll_weight = 1.0f - (_attc->get_calibrated_airspeed() - getBlendAirspeed()) / - (getTransitionAirspeed() - getBlendAirspeed()); + airspeed_trans_blend_margin; } // without airspeed do timed weight changes + const float time_trans_open_loop_margin = getOpenLoopFrontTransitionTime() - getMinimumFrontTransitionTime(); + if ((!PX4_ISFINITE(_attc->get_calibrated_airspeed())) && + time_trans_open_loop_margin > FLT_EPSILON && _time_since_trans_start > getMinimumFrontTransitionTime()) { _mc_roll_weight = 1.0f - (_time_since_trans_start - getMinimumFrontTransitionTime()) / - (getOpenLoopFrontTransitionTime() - getMinimumFrontTransitionTime()); + time_trans_open_loop_margin; } // add minimum throttle for front transition