@ -240,12 +240,13 @@ static float get_throttle_surface_tracking(int16_t target_rate, float current_al
@@ -240,12 +240,13 @@ static float get_throttle_surface_tracking(int16_t target_rate, float current_al
static uint32_t last_call_ms = 0;
float distance_error;
float velocity_correction;
float current_alt = inertial_nav.get_altitude();
uint32_t now = millis();
// reset target altitude if this controller has just been engaged
if (now - last_call_ms > SONAR_TIMEOUT_MS) {
target_sonar_alt = sonar_alt + current_alt_target - current_loc. alt;
target_sonar_alt = sonar_alt + current_alt_target - current_alt;
}
last_call_ms = now;
@ -259,7 +260,7 @@ static float get_throttle_surface_tracking(int16_t target_rate, float current_al
@@ -259,7 +260,7 @@ static float get_throttle_surface_tracking(int16_t target_rate, float current_al
target_sonar_alt = constrain_float(target_sonar_alt,sonar_alt-pos_control.get_leash_down_z(),sonar_alt+pos_control.get_leash_up_z());
// calc desired velocity correction from target sonar alt vs actual sonar alt (remove the error already passed to Altitude controller to avoid oscillations)
distance_error = (target_sonar_alt - sonar_alt) - (current_alt_target - current_loc. alt);
distance_error = (target_sonar_alt - sonar_alt) - (current_alt_target - current_alt);
velocity_correction = distance_error * g.sonar_gain;
velocity_correction = constrain_float(velocity_correction, -THR_SURFACE_TRACKING_VELZ_MAX, THR_SURFACE_TRACKING_VELZ_MAX);