From e8b11924f8defa1d43316662d9614a6c8a71d2fe Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 12 Feb 2017 20:58:00 +1100 Subject: [PATCH] Plane: split out the tailsitter transition complete code use both roll and pitch to trigger completion of transition. This copes with situations where the plane has managed to get itself rolled over far enough that it can't recover into hover --- ArduPlane/quadplane.cpp | 2 +- ArduPlane/quadplane.h | 3 +++ ArduPlane/tailsitter.cpp | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ArduPlane/quadplane.cpp b/ArduPlane/quadplane.cpp index b50150890f..6251422841 100644 --- a/ArduPlane/quadplane.cpp +++ b/ArduPlane/quadplane.cpp @@ -1043,7 +1043,7 @@ void QuadPlane::update_transition(void) if (is_tailsitter()) { if (transition_state == TRANSITION_ANGLE_WAIT && - (ahrs_view->pitch_sensor < -tailsitter.transition_angle*100 || plane.fly_inverted())) { + tailsitter_transition_complete()) { GCS_MAVLINK::send_statustext_all(MAV_SEVERITY_INFO, "Transition done"); transition_state = TRANSITION_DONE; } diff --git a/ArduPlane/quadplane.h b/ArduPlane/quadplane.h index bc86160746..7599853209 100644 --- a/ArduPlane/quadplane.h +++ b/ArduPlane/quadplane.h @@ -83,6 +83,9 @@ public: // create outputs for tailsitters void tailsitter_output(void); + + // check if we have completed transition + bool tailsitter_transition_complete(void); struct PACKED log_QControl_Tuning { LOG_PACKET_HEADER; diff --git a/ArduPlane/tailsitter.cpp b/ArduPlane/tailsitter.cpp index 0dc030930b..55e113f891 100644 --- a/ArduPlane/tailsitter.cpp +++ b/ArduPlane/tailsitter.cpp @@ -44,3 +44,20 @@ void QuadPlane::tailsitter_output(void) } } + +/* + return true when we have completed enough of a transition to switch to fixed wing control + */ +bool QuadPlane::tailsitter_transition_complete(void) +{ + if (plane.fly_inverted()) { + // transition immediately + return true; + } + if (ahrs_view->pitch_sensor < -tailsitter.transition_angle*100 || + ahrs_view->roll_sensor < -tailsitter.transition_angle*100) { + return true; + } + // still waiting + return false; +}