From 2ff2d174c07bc954ef47292b10075a99858988dd Mon Sep 17 00:00:00 2001 From: Nathaniel-hl <127107404+Nathaniel-hl@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:39:34 +0800 Subject: [PATCH] fix(vtol): prevent divide-by-zero in tiltrotor transition weight (#27437) fix-divide-by-zero-in-mc_roll_weight Co-authored-by: Drone-Lab <151698793+drone-lab@users.noreply.github.com> --- src/modules/vtol_att_control/tiltrotor.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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