Plane: allow for NAV_LOITER_UNLIM and NAV_LOITER_TIME in quadplane

This commit is contained in:
Andrew Tridgell 2016-05-11 15:57:41 +10:00
parent 3fc43b94f9
commit 12e0012b16
7 changed files with 33 additions and 12 deletions

View File

@ -563,7 +563,7 @@ void Plane::update_flight_mode(void)
break; break;
case GUIDED: case GUIDED:
if (auto_state.vtol_guided && quadplane.available()) { if (auto_state.vtol_loiter && quadplane.available()) {
quadplane.guided_update(); quadplane.guided_update();
break; break;
} }

View File

@ -505,8 +505,8 @@ private:
// are we in VTOL mode in AUTO? // are we in VTOL mode in AUTO?
bool vtol_mode:1; bool vtol_mode:1;
// are we doing GUIDED mode as a VTOL? // are we doing loiter mode as a VTOL?
bool vtol_guided:1; bool vtol_loiter:1;
} auto_state; } auto_state;
struct { struct {

View File

@ -97,7 +97,7 @@ void Plane::set_guided_WP(void)
loiter.start_time_ms = 0; loiter.start_time_ms = 0;
// start in non-VTOL mode // start in non-VTOL mode
auto_state.vtol_guided = false; auto_state.vtol_loiter = false;
loiter_angle_reset(); loiter_angle_reset();
} }

View File

@ -7,7 +7,10 @@
/********************************************************************************/ /********************************************************************************/
bool Plane::start_command(const AP_Mission::Mission_Command& cmd) bool Plane::start_command(const AP_Mission::Mission_Command& cmd)
{ {
// log when new commands start // default to non-VTOL loiter
auto_state.vtol_loiter = false;
// log when new commands start
if (should_log(MASK_LOG_CMD)) { if (should_log(MASK_LOG_CMD)) {
DataFlash.Log_Write_Mission_Cmd(mission, cmd); DataFlash.Log_Write_Mission_Cmd(mission, cmd);
} }
@ -636,6 +639,7 @@ bool Plane::verify_loiter_time()
if (result) { if (result) {
gcs_send_text(MAV_SEVERITY_WARNING,"Verify nav: LOITER time complete"); gcs_send_text(MAV_SEVERITY_WARNING,"Verify nav: LOITER time complete");
auto_state.vtol_loiter = false;
} }
return result; return result;
} }
@ -646,6 +650,9 @@ bool Plane::verify_loiter_turns()
uint16_t radius = HIGHBYTE(mission.get_current_nav_cmd().p1); uint16_t radius = HIGHBYTE(mission.get_current_nav_cmd().p1);
update_loiter(radius); update_loiter(radius);
// LOITER_TURNS makes no sense as VTOL
auto_state.vtol_loiter = false;
if (condition_value != 0) { if (condition_value != 0) {
// primary goal, loiter time // primary goal, loiter time
if (loiter.sum_cd > loiter.total_cd && loiter.sum_cd > 1) { if (loiter.sum_cd > loiter.total_cd && loiter.sum_cd > 1) {

View File

@ -175,7 +175,13 @@ void Plane::update_loiter(uint16_t radius)
if (loiter.start_time_ms != 0 && if (loiter.start_time_ms != 0 &&
quadplane.available() && quadplane.available() &&
quadplane.guided_mode != 0) { quadplane.guided_mode != 0) {
auto_state.vtol_guided = true; if (!auto_state.vtol_loiter) {
auto_state.vtol_loiter = true;
// reset loiter start time, so we don't consider the point
// reached till we get much closer
loiter.start_time_ms = 0;
quadplane.guided_start();
}
} else if (loiter.start_time_ms == 0 && } else if (loiter.start_time_ms == 0 &&
control_mode == AUTO && control_mode == AUTO &&
!auto_state.no_crosstrack && !auto_state.no_crosstrack &&

View File

@ -1082,6 +1082,9 @@ bool QuadPlane::in_vtol_auto(void)
case MAV_CMD_NAV_VTOL_LAND: case MAV_CMD_NAV_VTOL_LAND:
case MAV_CMD_NAV_VTOL_TAKEOFF: case MAV_CMD_NAV_VTOL_TAKEOFF:
return true; return true;
case MAV_CMD_NAV_LOITER_UNLIM:
case MAV_CMD_NAV_LOITER_TIME:
return plane.auto_state.vtol_loiter;
default: default:
return false; return false;
} }
@ -1100,7 +1103,7 @@ bool QuadPlane::in_vtol_mode(void)
plane.control_mode == QLOITER || plane.control_mode == QLOITER ||
plane.control_mode == QLAND || plane.control_mode == QLAND ||
plane.control_mode == QRTL || plane.control_mode == QRTL ||
(plane.control_mode == GUIDED && plane.auto_state.vtol_guided) || (plane.control_mode == GUIDED && plane.auto_state.vtol_loiter) ||
in_vtol_auto()); in_vtol_auto());
} }
@ -1399,14 +1402,19 @@ void QuadPlane::control_auto(const Location &loc)
motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED); motors->set_desired_spool_state(AP_Motors::DESIRED_THROTTLE_UNLIMITED);
if (plane.mission.get_current_nav_cmd().id == MAV_CMD_NAV_VTOL_TAKEOFF) { switch (plane.mission.get_current_nav_cmd().id) {
case MAV_CMD_NAV_VTOL_TAKEOFF:
takeoff_controller(); takeoff_controller();
} else if (plane.mission.get_current_nav_cmd().id == MAV_CMD_NAV_VTOL_LAND) { break;
case MAV_CMD_NAV_VTOL_LAND:
case MAV_CMD_NAV_LOITER_UNLIM:
case MAV_CMD_NAV_LOITER_TIME:
vtol_position_controller(); vtol_position_controller();
} else { break;
default:
waypoint_controller(); waypoint_controller();
break;
} }
} }
/* /*

View File

@ -382,7 +382,7 @@ void Plane::set_mode(enum FlightMode mode)
// assume non-VTOL mode // assume non-VTOL mode
auto_state.vtol_mode = false; auto_state.vtol_mode = false;
auto_state.vtol_guided = false; auto_state.vtol_loiter = false;
switch(control_mode) switch(control_mode)
{ {