diff --git a/src/main/flight/gps_rescue.c b/src/main/flight/gps_rescue.c index 73d810df9e..39dc07e866 100644 --- a/src/main/flight/gps_rescue.c +++ b/src/main/flight/gps_rescue.c @@ -194,17 +194,19 @@ static void setReturnAltitude(void) // Intended descent distance for rescues that start outside the minStartDistM distance // Set this to the user's intended descent distance, but not more than half the distance to home to ensure some fly home time rescueState.intent.descentDistanceM = fminf(0.5f * rescueState.sensor.distanceToHomeM, gpsRescueConfig()->descentDistanceM); - + + const float initialClimbCm = gpsRescueConfig()->initialClimbM * 100.0f; switch (gpsRescueConfig()->altitudeMode) { case GPS_RESCUE_ALT_MODE_FIXED: rescueState.intent.returnAltitudeCm = gpsRescueConfig()->returnAltitudeM * 100.0f; break; case GPS_RESCUE_ALT_MODE_CURRENT: - rescueState.intent.returnAltitudeCm = rescueState.sensor.currentAltitudeCm + gpsRescueConfig()->initialClimbM * 100.0f; + // climb above current altitude, but always return at least initial height above takeoff point, in case current altitude was negative + rescueState.intent.returnAltitudeCm = fmaxf(initialClimbCm, rescueState.sensor.currentAltitudeCm + initialClimbCm); break; case GPS_RESCUE_ALT_MODE_MAX: default: - rescueState.intent.returnAltitudeCm = rescueState.intent.maxAltitudeCm + gpsRescueConfig()->initialClimbM * 100.0f; + rescueState.intent.returnAltitudeCm = rescueState.intent.maxAltitudeCm + initialClimbCm; break; } }