Skip to content

Commit 613d680

Browse files
authored
Merge pull request #11640 from b14ckyy/fix/fw-wp-tracking-state-reset
Fixed wing nav: reset WP cross-track tracking state on re-engagement
2 parents 5fa50d4 + 9c40920 commit 613d680

1 file changed

Lines changed: 14 additions & 5 deletions

File tree

src/main/navigation/navigation_fixedwing.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)