mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-20 23:05:17 +03:00
Improvements
This commit is contained in:
parent
42322663f6
commit
b3da693c5a
1 changed files with 16 additions and 8 deletions
|
@ -401,14 +401,21 @@ 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 waypoint tracking enabled quickly force craft toward waypoint course line and closely track along it */
|
||||||
if (navConfig()->fw.wp_tracking_accuracy && isWaypointNavTrackingActive() && !needToCalculateCircularLoiter) {
|
if (navConfig()->fw.wp_tracking_accuracy && isWaypointNavTrackingActive() && !needToCalculateCircularLoiter) {
|
||||||
int32_t courseVirtualCorrection = wrap_18000(posControl.activeWaypoint.bearing - virtualTargetBearing);
|
fpVector3_t virtualCoursePoint;
|
||||||
navCrossTrackError = ABS(posControl.wpDistance * sin_approx(CENTIDEGREES_TO_RADIANS(courseVirtualCorrection)));
|
virtualCoursePoint.x = posControl.activeWaypoint.pos.x -
|
||||||
|
posControl.wpDistance * cos_approx(CENTIDEGREES_TO_RADIANS(posControl.activeWaypoint.bearing));
|
||||||
|
virtualCoursePoint.y = posControl.activeWaypoint.pos.y -
|
||||||
|
posControl.wpDistance * sin_approx(CENTIDEGREES_TO_RADIANS(posControl.activeWaypoint.bearing));
|
||||||
|
navCrossTrackError = calculateDistanceToDestination(&virtualCoursePoint);
|
||||||
|
|
||||||
if ((ABS(wrap_18000(virtualTargetBearing - posControl.actualState.cog)) < 9000 || posControl.wpDistance < 1000.0f) && navCrossTrackError > 200.0f) {
|
if ((ABS(wrap_18000(virtualTargetBearing - posControl.actualState.cog)) < 9000 || posControl.wpDistance < 1000.0f) && navCrossTrackError > 200) {
|
||||||
static float crossTrackErrorRate;
|
static float crossTrackErrorRate;
|
||||||
if ((currentTimeUs - previousTimeMonitoringUpdate) >= HZ2US(NAV_FW_CONTROL_MONITORING_RATE)) {
|
static timeUs_t previousCrossTrackErrorUpdateTime;
|
||||||
|
|
||||||
|
if ((currentTimeUs - previousCrossTrackErrorUpdateTime) >= HZ2US(10)) {
|
||||||
static float previousCrossTrackError = 0.0f;
|
static float previousCrossTrackError = 0.0f;
|
||||||
crossTrackErrorRate = 0.5f * (crossTrackErrorRate + (previousCrossTrackError - navCrossTrackError) / US2S(currentTimeUs - previousTimeMonitoringUpdate));
|
crossTrackErrorRate = (previousCrossTrackError - navCrossTrackError) / US2S(currentTimeUs - previousCrossTrackErrorUpdateTime);
|
||||||
|
previousCrossTrackErrorUpdateTime = currentTimeUs;
|
||||||
previousCrossTrackError = navCrossTrackError;
|
previousCrossTrackError = navCrossTrackError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,11 +423,12 @@ static void updatePositionHeadingController_FW(timeUs_t currentTimeUs, timeDelta
|
||||||
float adjustmentFactor = wrap_18000(posControl.activeWaypoint.bearing - virtualTargetBearing);
|
float adjustmentFactor = wrap_18000(posControl.activeWaypoint.bearing - virtualTargetBearing);
|
||||||
adjustmentFactor *= 1.0f + sq(navCrossTrackError / (navConfig()->fw.wp_tracking_accuracy * 500.0f));
|
adjustmentFactor *= 1.0f + sq(navCrossTrackError / (navConfig()->fw.wp_tracking_accuracy * 500.0f));
|
||||||
|
|
||||||
/* Apply additional fine adjustment based on speed of convergence to try and achieve arrival time of around 15s */
|
/* Apply additional fine adjustment based on speed of convergence to achieve a convergence speed of around 2 m/s */
|
||||||
float limit = constrainf(navCrossTrackError / 3.0f, 200.0f, 500.0f);
|
float limit = constrainf((crossTrackErrorRate > 0.0f ? crossTrackErrorRate : 0.0f) + navCrossTrackError / 3.0f, 200.0f, posControl.actualState.velXY / 4.0f);
|
||||||
float rateFactor = limit;
|
float rateFactor = limit;
|
||||||
if (crossTrackErrorRate > 0.0f) {
|
if (crossTrackErrorRate > 0.0f) {
|
||||||
rateFactor = constrainf(scaleRangef(navCrossTrackError / crossTrackErrorRate, 0, 30, -limit, limit), -limit, limit);
|
float timeFactor = constrainf(navCrossTrackError / 100.0f, 10.0f, 30.0f);
|
||||||
|
rateFactor = constrainf(scaleRangef(navCrossTrackError / crossTrackErrorRate, 0.0f, timeFactor, -limit, limit), -limit, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine final adjusted virtualTargetBearing */
|
/* Determine final adjusted virtualTargetBearing */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue