Skip to content

Commit 17fc349

Browse files
authored
Merge pull request #10541 from breadoven/abo_fw_alt_control_fixes
Fixed wing altitude control fixes
2 parents cb5f399 + 92e9315 commit 17fc349

File tree

10 files changed

+57
-24
lines changed

10 files changed

+57
-24
lines changed

docs/Settings.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3118,7 +3118,7 @@ Adjusts the deceleration response of fixed wing altitude control as the target a
31183118

31193119
| Default | Min | Max |
31203120
| --- | --- | --- |
3121-
| 20 | 5 | 100 |
3121+
| 40 | 5 | 100 |
31223122

31233123
---
31243124

@@ -3602,6 +3602,16 @@ D gain of altitude PID controller (Fixedwing)
36023602

36033603
---
36043604

3605+
### nav_fw_pos_z_ff
3606+
3607+
FF gain of altitude PID controller (Fixedwing)
3608+
3609+
| Default | Min | Max |
3610+
| --- | --- | --- |
3611+
| 10 | 0 | 255 |
3612+
3613+
---
3614+
36053615
### nav_fw_pos_z_i
36063616

36073617
I gain of altitude PID controller (Fixedwing)
@@ -3618,7 +3628,7 @@ P gain of altitude PID controller (Fixedwing)
36183628

36193629
| Default | Min | Max |
36203630
| --- | --- | --- |
3621-
| 40 | 0 | 255 |
3631+
| 30 | 0 | 255 |
36223632

36233633
---
36243634

src/main/cms/cms_menu_imu.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ static const OSD_Entry cmsx_menuPidAltMagEntries[] =
227227
OTHER_PIDFF_ENTRY("ALT P", &cmsx_pidPosZ.P),
228228
OTHER_PIDFF_ENTRY("ALT I", &cmsx_pidPosZ.I),
229229
OTHER_PIDFF_ENTRY("ALT D", &cmsx_pidPosZ.D),
230+
OTHER_PIDFF_ENTRY("ALT FF", &cmsx_pidPosZ.FF),
230231

231232
OTHER_PIDFF_ENTRY("VEL P", &cmsx_pidVelZ.P),
232233
OTHER_PIDFF_ENTRY("VEL I", &cmsx_pidVelZ.I),

src/main/fc/rc_adjustments.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ static const adjustmentConfig_t defaultAdjustmentConfigs[ADJUSTMENT_FUNCTION_COU
302302
.adjustmentFunction = ADJUSTMENT_NAV_WP_MULTI_MISSION_INDEX,
303303
.mode = ADJUSTMENT_MODE_STEP,
304304
.data = { .stepConfig = { .step = 1 }}
305+
}, {
306+
.adjustmentFunction = ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE,
307+
.mode = ADJUSTMENT_MODE_STEP,
308+
.data = { .stepConfig = { .step = 1 }}
305309
}
306310
};
307311

@@ -545,6 +549,9 @@ static void applyStepAdjustment(controlRateConfig_t *controlRateConfig, uint8_t
545549
applyAdjustmentPID(ADJUSTMENT_POS_Z_D, &pidBankMutable()->pid[PID_POS_Z].D, delta);
546550
navigationUsePIDs();
547551
break;
552+
case ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE:
553+
applyAdjustmentU8(ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE, &pidProfileMutable()->fwAltControlResponseFactor, delta, SETTING_NAV_FW_ALT_CONTROL_RESPONSE_MIN, SETTING_NAV_FW_ALT_CONTROL_RESPONSE_MAX);
554+
break;
548555
case ADJUSTMENT_HEADING_P:
549556
applyAdjustmentPID(ADJUSTMENT_HEADING_P, &pidBankMutable()->pid[PID_HEADING].P, delta);
550557
// TODO: navigationUsePIDs()?

src/main/fc/rc_adjustments.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ typedef enum {
8585
ADJUSTMENT_FW_TPA_TIME_CONSTANT = 57,
8686
ADJUSTMENT_FW_LEVEL_TRIM = 58,
8787
ADJUSTMENT_NAV_WP_MULTI_MISSION_INDEX = 59,
88+
ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE = 60,
8889
ADJUSTMENT_FUNCTION_COUNT // must be last
8990
} adjustmentFunction_e;
9091

src/main/fc/settings.yaml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2131,7 +2131,7 @@ groups:
21312131
max: 100
21322132
- name: nav_fw_pos_z_p
21332133
description: "P gain of altitude PID controller (Fixedwing)"
2134-
default_value: 40
2134+
default_value: 30
21352135
field: bank_fw.pid[PID_POS_Z].P
21362136
min: 0
21372137
max: 255
@@ -2147,9 +2147,15 @@ groups:
21472147
field: bank_fw.pid[PID_POS_Z].D
21482148
min: 0
21492149
max: 255
2150+
- name: nav_fw_pos_z_ff
2151+
description: "FF gain of altitude PID controller (Fixedwing)"
2152+
default_value: 10
2153+
field: bank_fw.pid[PID_POS_Z].FF
2154+
min: 0
2155+
max: 255
21502156
- name: nav_fw_alt_control_response
21512157
description: "Adjusts the deceleration response of fixed wing altitude control as the target altitude is approached. Decrease value to help avoid overshooting the target altitude."
2152-
default_value: 20
2158+
default_value: 40
21532159
field: fwAltControlResponseFactor
21542160
min: 5
21552161
max: 100
@@ -4390,15 +4396,15 @@ groups:
43904396
field: safeAltitudeDistance
43914397
min: 0
43924398
max: 10000
4393-
- name: geozone_safehome_as_inclusive
4399+
- name: geozone_safehome_as_inclusive
43944400
description: "Treat nearest safehome as inclusive geozone"
43954401
type: bool
43964402
field: nearestSafeHomeAsInclusivZone
43974403
default_value: OFF
43984404
- name: geozone_safehome_zone_action
43994405
description: "Fence action for safehome zone"
44004406
default_value: "NONE"
4401-
field: safeHomeFenceAction
4407+
field: safeHomeFenceAction
44024408
table: fence_action
44034409
type: uint8_t
44044410
- name: geozone_mr_stop_distance
@@ -4412,4 +4418,4 @@ groups:
44124418
default_value: RTH
44134419
field: noWayHomeAction
44144420
table: geozone_rth_no_way_home
4415-
type: uint8_t
4421+
type: uint8_t

src/main/flight/pid.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ static EXTENDED_FASTRAM bool angleHoldIsLevel = false;
179179
static EXTENDED_FASTRAM float fixedWingLevelTrim;
180180
static EXTENDED_FASTRAM pidController_t fixedWingLevelTrimController;
181181

182-
PG_REGISTER_PROFILE_WITH_RESET_TEMPLATE(pidProfile_t, pidProfile, PG_PID_PROFILE, 9);
182+
PG_REGISTER_PROFILE_WITH_RESET_TEMPLATE(pidProfile_t, pidProfile, PG_PID_PROFILE, 10);
183183

184184
PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
185185
.bank_mc = {
@@ -242,8 +242,8 @@ PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
242242
[PID_POS_Z] = {
243243
.P = SETTING_NAV_FW_POS_Z_P_DEFAULT, // FW_POS_Z_P * 100
244244
.I = SETTING_NAV_FW_POS_Z_I_DEFAULT, // FW_POS_Z_I * 100
245-
.D = SETTING_NAV_FW_POS_Z_D_DEFAULT, // FW_POS_Z_D * 100
246-
.FF = 0,
245+
.D = SETTING_NAV_FW_POS_Z_D_DEFAULT, // FW_POS_Z_D * 200
246+
.FF = SETTING_NAV_FW_POS_Z_FF_DEFAULT, // FW_POS_Z_FF * 100
247247
},
248248
[PID_POS_XY] = {
249249
.P = SETTING_NAV_FW_POS_XY_P_DEFAULT, // FW_POS_XY_P * 100
@@ -1206,7 +1206,7 @@ void FAST_CODE pidController(float dT)
12061206

12071207
// Limit desired rate to something gyro can measure reliably
12081208
pidState[axis].rateTarget = constrainf(rateTarget, -GYRO_SATURATION_LIMIT, +GYRO_SATURATION_LIMIT);
1209-
1209+
12101210
#ifdef USE_ADAPTIVE_FILTER
12111211
adaptiveFilterPushRate(axis, pidState[axis].rateTarget, currentControlRateProfile->stabilized.rates[axis]);
12121212
#endif

src/main/io/osd.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,7 +1726,7 @@ static bool osdDrawSingleElement(uint8_t item)
17261726
tfp_sprintf(buff + 1, "%2d", osdRssi);
17271727
else
17281728
tfp_sprintf(buff + 1, "%c ", SYM_MAX);
1729-
1729+
17301730
if (osdRssi < osdConfig()->rssi_alarm) {
17311731
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
17321732
}
@@ -2393,7 +2393,7 @@ static bool osdDrawSingleElement(uint8_t item)
23932393
#ifdef USE_GEOZONE
23942394
if (FLIGHT_MODE(NAV_SEND_TO))
23952395
p = "AUTO";
2396-
else
2396+
else
23972397
#endif
23982398
if (FLIGHT_MODE(FAILSAFE_MODE))
23992399
p = "!FS!";
@@ -2546,7 +2546,7 @@ static bool osdDrawSingleElement(uint8_t item)
25462546
} else {
25472547
tfp_sprintf(buff+1, "%3d%c", rxLinkStatistics.downlinkLQ, SYM_AH_DECORATION_DOWN);
25482548
}
2549-
2549+
25502550
if (!failsafeIsReceivingRxData()) {
25512551
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
25522552
} else if (rxLinkStatistics.downlinkLQ < osdConfig()->link_quality_alarm) {
@@ -2608,7 +2608,7 @@ static bool osdDrawSingleElement(uint8_t item)
26082608
buff[i] = ' ';
26092609
buff[4] = '\0';
26102610
break;
2611-
2611+
26122612
case OSD_RX_MODE:
26132613
displayWriteChar(osdDisplayPort, elemPosX++, elemPosY, SYM_RX_MODE);
26142614
strcat(buff, rxLinkStatistics.mode);
@@ -3083,6 +3083,10 @@ static bool osdDrawSingleElement(uint8_t item)
30833083
osdDisplayNavPIDValues(elemPosX, elemPosY, "VZ", PID_VEL_Z, ADJUSTMENT_VEL_Z_P, ADJUSTMENT_VEL_Z_I, ADJUSTMENT_VEL_Z_D);
30843084
return true;
30853085

3086+
case OSD_NAV_FW_ALT_CONTROL_RESPONSE:
3087+
osdDisplayAdjustableDecimalValue(elemPosX, elemPosY, "ACR", 0, pidProfile()->fwAltControlResponseFactor, 3, 0, ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE);
3088+
return true;
3089+
30863090
case OSD_HEADING_P:
30873091
osdDisplayAdjustableDecimalValue(elemPosX, elemPosY, "HP", 0, pidBank()->pid[PID_HEADING].P, 3, 0, ADJUSTMENT_HEADING_P);
30883092
return true;
@@ -3912,16 +3916,16 @@ static bool osdDrawSingleElement(uint8_t item)
39123916
}
39133917
int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
39143918
int direction = CENTIDEGREES_TO_DEGREES(geozone.directionToNearestZone) - flightDirection + panHomeDirOffset;
3915-
osdDrawDirArrow(osdDisplayPort, osdGetDisplayPortCanvas(), OSD_DRAW_POINT_GRID(elemPosX, elemPosY), direction);
3919+
osdDrawDirArrow(osdDisplayPort, osdGetDisplayPortCanvas(), OSD_DRAW_POINT_GRID(elemPosX, elemPosY), direction);
39163920
} else {
39173921
if (isGeozoneActive()) {
39183922
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
39193923
}
39203924
displayWriteCharWithAttr(osdDisplayPort, elemPosX, elemPosY, '-', elemAttr);
39213925
}
39223926
break;
3923-
}
3924-
3927+
}
3928+
39253929
case OSD_H_DIST_TO_FENCE:
39263930
{
39273931
if (navigationPositionEstimateIsHealthy() && isGeozoneActive()) {
@@ -5480,7 +5484,7 @@ static void osdShowSDArmScreen(void)
54805484
displayWrite(osdDisplayPort, (osdDisplayPort->cols - strlen(buf)) / 2, armScreenRow++, buf);
54815485
memset(buf, '\0', sizeof(buf));
54825486
#if defined(USE_GPS)
5483-
#if defined (USE_SAFE_HOME)
5487+
#if defined (USE_SAFE_HOME)
54845488
if (posControl.safehomeState.distance) {
54855489
safehomeRow = armScreenRow;
54865490
armScreenRow += 2;
@@ -6045,15 +6049,15 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
60456049
case GEOZONE_MESSAGE_STATE_NFZ:
60466050
messages[messageCount++] = OSD_MSG_NFZ;
60476051
break;
6048-
case GEOZONE_MESSAGE_STATE_LEAVING_FZ:
6052+
case GEOZONE_MESSAGE_STATE_LEAVING_FZ:
60496053
osdFormatDistanceSymbol(buf, geozone.distanceToZoneBorder3d, 0, 3);
60506054
tfp_sprintf(messageBuf, OSD_MSG_LEAVING_FZ, buf);
60516055
messages[messageCount++] = messageBuf;
60526056
break;
60536057
case GEOZONE_MESSAGE_STATE_OUTSIDE_FZ:
60546058
messages[messageCount++] = OSD_MSG_OUTSIDE_FZ;
60556059
break;
6056-
case GEOZONE_MESSAGE_STATE_ENTERING_NFZ:
6060+
case GEOZONE_MESSAGE_STATE_ENTERING_NFZ:
60576061
osdFormatDistanceSymbol(buf, geozone.distanceToZoneBorder3d, 0, 3);
60586062
if (geozone.zoneInfo == INT32_MAX) {
60596063
tfp_sprintf(buf1, "%s%c", "INF", SYM_ALT_M);
@@ -6092,7 +6096,7 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
60926096
if (!geozone.sticksLocked) {
60936097
messages[messageCount++] = OSD_MSG_MOVE_STICKS;
60946098
}
6095-
break;
6099+
break;
60966100
case GEOZONE_MESSAGE_STATE_NONE:
60976101
break;
60986102
}

src/main/io/osd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ typedef enum {
312312
OSD_COURSE_TO_FENCE,
313313
OSD_H_DIST_TO_FENCE,
314314
OSD_V_DIST_TO_FENCE,
315+
OSD_NAV_FW_ALT_CONTROL_RESPONSE,
315316
OSD_ITEM_COUNT // MUST BE LAST
316317
} osd_items_e;
317318

src/main/io/osd_dji_hd.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,9 @@ static void osdDJIAdjustmentMessage(char *buff, uint8_t adjustmentFunction)
958958
case ADJUSTMENT_VEL_Z_D:
959959
tfp_sprintf(buff, "VZD %3d", pidBankMutable()->pid[PID_VEL_Z].D);
960960
break;
961+
case ADJUSTMENT_NAV_FW_ALT_CONTROL_RESPONSE:
962+
tfp_sprintf(buff, "ACR %3d", pidProfileMutable()->fwAltControlResponseFactor);
963+
break;
961964
case ADJUSTMENT_FW_MIN_THROTTLE_DOWN_PITCH_ANGLE:
962965
tfp_sprintf(buff, "MTDPA %4d", navConfigMutable()->fw.minThrottleDownPitchAngle);
963966
break;

src/main/navigation/navigation.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4960,8 +4960,8 @@ void navigationUsePIDs(void)
49604960

49614961
navPidInit(&posControl.pids.fw_alt, (float)pidProfile()->bank_fw.pid[PID_POS_Z].P / 100.0f,
49624962
(float)pidProfile()->bank_fw.pid[PID_POS_Z].I / 100.0f,
4963-
(float)pidProfile()->bank_fw.pid[PID_POS_Z].D / 100.0f,
4964-
0.0f,
4963+
(float)pidProfile()->bank_fw.pid[PID_POS_Z].D / 300.0f,
4964+
(float)pidProfile()->bank_fw.pid[PID_POS_Z].FF / 100.0f,
49654965
NAV_DTERM_CUT_HZ,
49664966
0.0f
49674967
);

0 commit comments

Comments
 (0)