From 16ca0be4e56864ae92e5b05b9d06deb40a795a9a Mon Sep 17 00:00:00 2001 From: Dennis Mannhart <dennis.mannhart@gmail.com> Date: Mon, 13 Aug 2018 09:24:21 +0200 Subject: [PATCH] FlightTaskAuto: set reference to 0 if auto is requested but no global position available --- .../FlightTasks/tasks/Auto/FlightTaskAuto.cpp | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/lib/FlightTasks/tasks/Auto/FlightTaskAuto.cpp b/src/lib/FlightTasks/tasks/Auto/FlightTaskAuto.cpp index 6e9b24e91b..aed3312b6c 100644 --- a/src/lib/FlightTasks/tasks/Auto/FlightTaskAuto.cpp +++ b/src/lib/FlightTasks/tasks/Auto/FlightTaskAuto.cpp @@ -311,22 +311,41 @@ bool FlightTaskAuto::_evaluateGlobalReference() // Only update if reference timestamp has changed AND no valid reference altitude // is available. // TODO: this needs to be revisited and needs a more clear implementation - if (_sub_vehicle_local_position->get().ref_timestamp != _time_stamp_reference && - (_sub_vehicle_local_position->get().z_global && !PX4_ISFINITE(_reference_altitude))) { - - map_projection_init(&_reference_position, - _sub_vehicle_local_position->get().ref_lat, - _sub_vehicle_local_position->get().ref_lon); - _reference_altitude = _sub_vehicle_local_position->get().ref_alt; - _time_stamp_reference = _sub_vehicle_local_position->get().ref_timestamp; + if (_sub_vehicle_local_position->get().ref_timestamp == _time_stamp_reference && PX4_ISFINITE(_reference_altitude)) { + // don't need to update anything + return true; + } + + double ref_lat = _sub_vehicle_local_position->get().ref_lat; + double ref_lon = _sub_vehicle_local_position->get().ref_lon; + _reference_altitude = _sub_vehicle_local_position->get().ref_alt; + + if (!_sub_vehicle_local_position->get().z_global) { + // we have no valid global altitude + // set global reference to local reference + _reference_altitude = 0.0f; } + if (!_sub_vehicle_local_position->get().xy_global) { + // we have no valid global alt/lat + // set global reference to local reference + ref_lat = 0.0; + ref_lon = 0.0; + } + + // init projection + map_projection_init(&_reference_position, + ref_lat, + ref_lon); + + // check if everything is still finite if (PX4_ISFINITE(_reference_altitude) && PX4_ISFINITE(_sub_vehicle_local_position->get().ref_lat) - && PX4_ISFINITE(_sub_vehicle_local_position->get().ref_lat)) { + && PX4_ISFINITE(_sub_vehicle_local_position->get().ref_lon)) { return true; } else { + // no valid reference return false; } } -- GitLab