@@ -454,6 +454,13 @@ static void updatePositionHeadingController_FW(timeUs_t currentTimeUs, timeDelta
454454 }
455455
456456 if (isWaypointNavTrackingActive ()) {
457+ /* Cross-track controller state. Scoped here, not in the control branch, so the
458+ * else branch can re-seed it while the controller is disengaged. */
459+ static float crossTrackErrorRate ;
460+ static timeUs_t previousCrossTrackErrorUpdateTime ;
461+ static float previousCrossTrackError = 0.0f ;
462+ static pt1Filter_t fwCrossTrackErrorRateFilterState ;
463+
457464 /* Calculate cross track error */
458465 posControl .wpDistance = calculateDistanceToDestination (& posControl .activeWaypoint .pos );
459466
@@ -466,11 +473,6 @@ static void updatePositionHeadingController_FW(timeUs_t currentTimeUs, timeDelta
466473
467474 /* If waypoint tracking enabled force craft toward and closely track along waypoint course line */
468475 if (navConfig ()-> fw .wp_tracking_accuracy && !needToCalculateCircularLoiter ) {
469- static float crossTrackErrorRate ;
470- static timeUs_t previousCrossTrackErrorUpdateTime ;
471- static float previousCrossTrackError = 0.0f ;
472- static pt1Filter_t fwCrossTrackErrorRateFilterState ;
473-
474476 if ((currentTimeUs - previousCrossTrackErrorUpdateTime ) >= HZ2US (20 ) && fabsf (previousCrossTrackError - navCrossTrackError ) > 10.0f ) {
475477 const float crossTrackErrorDtSec = US2S (currentTimeUs - previousCrossTrackErrorUpdateTime );
476478 if (fabsf (previousCrossTrackError - navCrossTrackError ) < 500.0f ) {
@@ -497,6 +499,13 @@ static void updatePositionHeadingController_FW(timeUs_t currentTimeUs, timeDelta
497499 adjustmentFactor = constrainf (adjustmentFactor , - limit , limit );
498500 virtualTargetBearing = wrap_36000 (posControl .activeWaypoint .bearing - adjustmentFactor );
499501 }
502+ } else {
503+ /* Keep state synced to the current error while not steering, so the
504+ * controller re-engages cleanly on the next leg (no stale-data kick). */
505+ previousCrossTrackError = navCrossTrackError ;
506+ previousCrossTrackErrorUpdateTime = currentTimeUs ;
507+ crossTrackErrorRate = 0.0f ;
508+ pt1FilterReset (& fwCrossTrackErrorRateFilterState , 0.0f );
500509 }
501510 }
502511 /*
0 commit comments