From 20c02ae093909e83af2967d9dd83561396914ac2 Mon Sep 17 00:00:00 2001
From: Philipp Oettershagen <philipp.oettershagen@mavt.ethz.ch>
Date: Sun, 17 Jun 2018 01:27:02 +0200
Subject: [PATCH] Fixed-wing autoland: Adapt according to @dagar's and
 @antiheavy's comments.

---
 .../FixedwingPositionControl.cpp              |  2 +-
 src/modules/navigator/mission_block.cpp       | 19 ++++-------------
 src/modules/navigator/navigator.h             |  7 +++++++
 src/modules/navigator/navigator_main.cpp      | 21 ++++++++++++++++++-
 4 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp b/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp
index 2eac47741f..cd5cafcbf0 100644
--- a/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp
+++ b/src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp
@@ -847,7 +847,7 @@ FixedwingPositionControl::control_position(const Vector2f &curr_pos, const Vecto
 
 			float alt_sp = pos_sp_curr.alt;
 
-			if (pos_sp_next.type == position_setpoint_s::SETPOINT_TYPE_LAND && pos_sp_next.valid) {
+			if (pos_sp_next.type == position_setpoint_s::SETPOINT_TYPE_LAND && pos_sp_next.valid && _l1_control.circle_mode()) {
 				// We're in a loiter directly before a landing WP. Enable our landing configuration (flaps,
 				// landing airspeed and potentially tighter throttle control) already such that we don't
 				// have to do this switch (which can cause significant altitude errors) close to the ground.
diff --git a/src/modules/navigator/mission_block.cpp b/src/modules/navigator/mission_block.cpp
index b0860b9575..5a0d2fe16c 100644
--- a/src/modules/navigator/mission_block.cpp
+++ b/src/modules/navigator/mission_block.cpp
@@ -243,7 +243,7 @@ MissionBlock::is_mission_item_reached()
 						&dist_xy, &dist_z);
 
 				if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(fabsf(_mission_item.loiter_radius) * 1.2f)
-				    && dist_z <= _navigator->get_altitude_acceptance_radius()) {
+				    && dist_z <= _navigator->get_default_altitude_acceptance_radius()) {
 
 					// now set the loiter to the final altitude in the NAV_CMD_LOITER_TO_ALT mission item
 					curr_sp->alt = altitude_amsl;
@@ -251,26 +251,15 @@ MissionBlock::is_mission_item_reached()
 				}
 
 			} else {
-				// Determine altitude acceptance radius. By default, this is taken from the respective parameter.
-				// However, before a landing approach the acceptance radius needs to be tighter: Assume a 30% error
-				// w.r.t. the remaining descent altitude is OK, but enforce min/max values (e.g. min=3m to make
-				// sure that the waypoint can still be reached in case of wrong user input).
-				float alt_accept_rad = _navigator->get_altitude_acceptance_radius();
-				struct position_setpoint_s next_sp = _navigator->get_position_setpoint_triplet()->next;
-
-				if (next_sp.type == position_setpoint_s::SETPOINT_TYPE_LAND && next_sp.valid) {
-					alt_accept_rad = math::constrain(0.3f * (curr_sp->alt - next_sp.alt), 3.0f,
-									 _navigator->get_altitude_acceptance_radius());
-					PX4_INFO("Accept:%5.3f", double(alt_accept_rad));
-				}
-
 				if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(fabsf(_mission_item.loiter_radius) * 1.2f)
-				    && dist_z <= alt_accept_rad) {
+				    && dist_z <= _navigator->get_altitude_acceptance_radius()) {
 
 					_waypoint_position_reached = true;
 
 					// set required yaw from bearing to the next mission item
 					if (_mission_item.force_heading) {
+						const position_setpoint_s &next_sp = _navigator->get_position_setpoint_triplet()->next;
+
 						if (next_sp.valid) {
 							_mission_item.yaw = get_bearing_to_next_waypoint(_navigator->get_global_position()->lat,
 									    _navigator->get_global_position()->lon,
diff --git a/src/modules/navigator/navigator.h b/src/modules/navigator/navigator.h
index ceaeca4534..22dda8bede 100644
--- a/src/modules/navigator/navigator.h
+++ b/src/modules/navigator/navigator.h
@@ -181,6 +181,13 @@ public:
 	 */
 	float		get_acceptance_radius();
 
+	/**
+	 * Get the default altitude acceptance radius (i.e. from parameters)
+	 *
+	 * @return the distance from the target altitude before considering the waypoint reached
+	 */
+	float		get_default_altitude_acceptance_radius();
+
 	/**
 	 * Get the altitude acceptance radius
 	 *
diff --git a/src/modules/navigator/navigator_main.cpp b/src/modules/navigator/navigator_main.cpp
index 57971bc320..3bfec7f0d9 100644
--- a/src/modules/navigator/navigator_main.cpp
+++ b/src/modules/navigator/navigator_main.cpp
@@ -854,7 +854,7 @@ Navigator::get_acceptance_radius()
 }
 
 float
-Navigator::get_altitude_acceptance_radius()
+Navigator::get_default_altitude_acceptance_radius()
 {
 	if (!get_vstatus()->is_rotary_wing) {
 		return _param_fw_alt_acceptance_radius.get();
@@ -864,6 +864,25 @@ Navigator::get_altitude_acceptance_radius()
 	}
 }
 
+float
+Navigator::get_altitude_acceptance_radius()
+{
+	if (!get_vstatus()->is_rotary_wing) {
+		// The fixed-wing altitude acceptance radius default is the respective parameter. However, before a landing
+		// approach it needs to be tighter: Assume a 30% error w.r.t. the remaining descent altitude is OK, but enforce
+		// min/max values (e.g. min=3m to make sure that the waypoint can still be reached in case of wrong user input).
+
+		const position_setpoint_s &next_sp = get_position_setpoint_triplet()->next;
+		const position_setpoint_s &curr_sp = get_position_setpoint_triplet()->current;
+
+		if (next_sp.type == position_setpoint_s::SETPOINT_TYPE_LAND && next_sp.valid) {
+			return math::constrain(0.3f * (curr_sp.alt - next_sp.alt), 3.0f, _param_fw_alt_acceptance_radius.get());
+		}
+	}
+
+	return get_default_altitude_acceptance_radius();
+}
+
 float
 Navigator::get_cruising_speed()
 {