diff --git a/src/modules/vtol_att_control/tailsitter.cpp b/src/modules/vtol_att_control/tailsitter.cpp index ba4b373182..2a7cda3f57 100644 --- a/src/modules/vtol_att_control/tailsitter.cpp +++ b/src/modules/vtol_att_control/tailsitter.cpp @@ -225,8 +225,11 @@ void Tailsitter::update_transition_state() _q_trans_sp.normalize(); // tilt angle (zero if vehicle nose points up (hover)) - const float tilt = acosf(_q_trans_sp(0) * _q_trans_sp(0) - _q_trans_sp(1) * _q_trans_sp(1) - _q_trans_sp(2) * - _q_trans_sp(2) + _q_trans_sp(3) * _q_trans_sp(3)); + float cos_tilt = _q_trans_sp(0) * _q_trans_sp(0) - _q_trans_sp(1) * _q_trans_sp(1) - _q_trans_sp(2) * + _q_trans_sp(2) + _q_trans_sp(3) * _q_trans_sp(3); + cos_tilt = cos_tilt > 1.0f ? 1.0f : cos_tilt; + cos_tilt = cos_tilt < -1.0f ? -1.0f : cos_tilt; + const float tilt = acosf(cos_tilt); if (_vtol_schedule.flight_mode == vtol_mode::TRANSITION_FRONT_P1) { diff --git a/src/modules/vtol_att_control/vtol_att_control_main.cpp b/src/modules/vtol_att_control/vtol_att_control_main.cpp index dd4d8cb6e2..0cf205742f 100644 --- a/src/modules/vtol_att_control/vtol_att_control_main.cpp +++ b/src/modules/vtol_att_control/vtol_att_control_main.cpp @@ -424,7 +424,7 @@ VtolAttitudeControl::Run() _fw_virtual_att_sp_sub.update(&_fw_virtual_att_sp); - if (mc_att_sp_updated || fw_att_sp_updated) { + if (!_vtol_type->was_in_trans_mode() || mc_att_sp_updated || fw_att_sp_updated) { _vtol_type->update_transition_state(); _v_att_sp_pub.publish(_v_att_sp); } diff --git a/src/modules/vtol_att_control/vtol_type.h b/src/modules/vtol_att_control/vtol_type.h index 68c5a89cb6..0230efc5c1 100644 --- a/src/modules/vtol_att_control/vtol_type.h +++ b/src/modules/vtol_att_control/vtol_type.h @@ -190,6 +190,8 @@ public: mode get_mode() {return _vtol_mode;} + bool was_in_trans_mode() {return _flag_was_in_trans_mode;} + virtual void parameters_update() = 0; protected: