diff --git a/src/main/navigation/navigation_fixedwing.c b/src/main/navigation/navigation_fixedwing.c index 981cd537a6..840d80448d 100755 --- a/src/main/navigation/navigation_fixedwing.c +++ b/src/main/navigation/navigation_fixedwing.c @@ -396,34 +396,33 @@ static void updatePositionHeadingController_FW(timeUs_t currentTimeUs, timeDelta /* If waypoint tracking enabled quickly force craft toward waypoint course line and closely track along it */ if (navConfig()->fw.wp_tracking_accuracy && isWaypointNavTrackingActive() && !needToCalculateCircularLoiter) { - // apply course tracking correction if target bearing error < 90 degs or when close to waypoint (within 10m) - if (ABS(wrap_18000(virtualTargetBearing - posControl.actualState.yaw)) < 9000 || posControl.wpDistance < 1000.0f) { - // courseVirtualCorrection initially used to determine current position relative to course line for later use - int32_t courseVirtualCorrection = wrap_18000(posControl.activeWaypoint.yaw - virtualTargetBearing); - float distToCourseLine = ABS(posControl.wpDistance * sin_approx(CENTIDEGREES_TO_RADIANS(courseVirtualCorrection))); + // courseVirtualCorrection initially used to determine current position relative to course line for later use + int32_t courseVirtualCorrection = wrap_18000(posControl.activeWaypoint.yaw - virtualTargetBearing); + float distToCourseLine = ABS(posControl.wpDistance * sin_approx(CENTIDEGREES_TO_RADIANS(courseVirtualCorrection))); + + // tracking only active when target bearing error < 90 degs, close to waypoint (within 10m) and > 2m from course line + if ((ABS(wrap_18000(virtualTargetBearing - posControl.actualState.yaw)) < 9000 || posControl.wpDistance < 1000.0f) && distToCourseLine > 200) { int32_t courseHeadingError = wrap_18000(posControl.activeWaypoint.yaw - posControl.actualState.yaw); - // only apply tracking correction when > 2m from waypoint course line - if (distToCourseLine > 200) { - // captureFactor adjusts distance/heading sensitivity balance when approaching course line. - // approach distance threashold based on speed and an assumed 1 second response time. - float captureFactor = distToCourseLine < posControl.actualState.velXY ? constrainf(2.0f - ABS(courseHeadingError) / 500.0f, 0.0f, 2.0f) : 1.0f; - // bias between reducing distance to course line and aligning with course heading adjusted by waypoint_tracking_accuracy - // initial courseCorrectionFactor based on distance to course line - float courseCorrectionFactor = constrainf(captureFactor * distToCourseLine / (1000.0f * navConfig()->fw.wp_tracking_accuracy), 0.0f, 1.0f); - courseCorrectionFactor = courseVirtualCorrection < 0 ? -courseCorrectionFactor : courseCorrectionFactor; + // captureFactor adjusts distance/heading sensitivity balance when approaching course line. + // Approach distance threashold based on speed and an assumed 1 second response time. + float captureFactor = distToCourseLine < posControl.actualState.velXY ? constrainf(2.0f - ABS(courseHeadingError) / 500.0f, 0.0f, 2.0f) : 1.0f; - // course heading alignment factor - float courseHeadingFactor = constrainf(courseHeadingError / 18000.0f, 0.0f, 1.0f); - courseHeadingFactor = courseHeadingError < 0 ? -courseHeadingFactor : courseHeadingFactor; + // bias between reducing distance to course line and aligning with course heading adjusted by waypoint_tracking_accuracy + // initial courseCorrectionFactor based on distance to course line + float courseCorrectionFactor = constrainf(captureFactor * distToCourseLine / (1000.0f * navConfig()->fw.wp_tracking_accuracy), 0.0f, 1.0f); + courseCorrectionFactor = courseVirtualCorrection < 0 ? -courseCorrectionFactor : courseCorrectionFactor; - // final courseCorrectionFactor combining distance and heading factors - courseCorrectionFactor = constrainf(courseCorrectionFactor - courseHeadingFactor, -1.0f, 1.0f); + // course heading alignment factor + float courseHeadingFactor = constrainf(courseHeadingError / 18000.0f, 0.0f, 1.0f); + courseHeadingFactor = courseHeadingError < 0 ? -courseHeadingFactor : courseHeadingFactor; - // final courseVirtualCorrection using max 80 deg heading adjustment toward course line - courseVirtualCorrection = DEGREES_TO_CENTIDEGREES(navConfig()->fw.wp_tracking_max_angle) * courseCorrectionFactor; - virtualTargetBearing = wrap_36000(posControl.activeWaypoint.yaw - courseVirtualCorrection); - } + // final courseCorrectionFactor combining distance and heading factors + courseCorrectionFactor = constrainf(courseCorrectionFactor - courseHeadingFactor, -1.0f, 1.0f); + + // final courseVirtualCorrection value + courseVirtualCorrection = DEGREES_TO_CENTIDEGREES(navConfig()->fw.wp_tracking_max_angle) * courseCorrectionFactor; + virtualTargetBearing = wrap_36000(posControl.activeWaypoint.yaw - courseVirtualCorrection); } }