From a398dc09c76c2f280ab3a50d69c34d022586e3aa Mon Sep 17 00:00:00 2001
From: Dennis Mannhart <dennis.mannhart@gmail.com>
Date: Mon, 4 Sep 2017 11:14:53 +0200
Subject: [PATCH] mc_pos_control: set curr_pos_sp(0:1) to pos(0:1) if
 non-finite

---
 .../mc_pos_control/mc_pos_control_main.cpp       | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/modules/mc_pos_control/mc_pos_control_main.cpp b/src/modules/mc_pos_control/mc_pos_control_main.cpp
index cae36d5de7..ec80ca1479 100644
--- a/src/modules/mc_pos_control/mc_pos_control_main.cpp
+++ b/src/modules/mc_pos_control/mc_pos_control_main.cpp
@@ -737,6 +737,9 @@ MulticopterPositionControl::poll_subscriptions()
 		    && PX4_ISFINITE(_pos_sp_triplet.current.alt) && _pos_sp_triplet.current.valid) {
 			_pos_sp_triplet.current.valid = true;
 
+		} else if (PX4_ISFINITE(_pos_sp_triplet.current.alt) && _pos_sp_triplet.current.valid) {
+			_pos_sp_triplet.current.valid = true;
+
 		} else {
 			_pos_sp_triplet.current.valid = false;
 		}
@@ -1402,7 +1405,7 @@ void MulticopterPositionControl::control_auto(float dt)
 
 	if (_pos_sp_triplet.current.valid) {
 
-		math::Vector<3> curr_pos_sp;
+		math::Vector<3> curr_pos_sp = _curr_pos_sp;
 
 		//only project setpoints if they are finite, else use current position
 		if (PX4_ISFINITE(_pos_sp_triplet.current.lat) &&
@@ -1438,9 +1441,16 @@ void MulticopterPositionControl::control_auto(float dt)
 
 		/* check if triplets have been updated
 		 * note: we only can look at xy since navigator applies slewrate to z */
-		matrix::Vector2f diff((_curr_pos_sp(0) - curr_pos_sp(0)), (_curr_pos_sp(1) - curr_pos_sp(1)));
+		float  diff;
+
+		if (_triplet_lat_lon_finite) {
+			diff = matrix::Vector2f((_curr_pos_sp(0) - curr_pos_sp(0)), (_curr_pos_sp(1) - curr_pos_sp(1))).length();
+
+		} else {
+			diff = fabsf(_curr_pos_sp(2) - curr_pos_sp(2));
+		}
 
-		if (diff.length() > FLT_EPSILON) {
+		if (diff > FLT_EPSILON) {
 			triplet_updated = true;
 		}
 
-- 
GitLab