mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-25 01:05:21 +03:00
Initial cut on dBoost
This commit is contained in:
parent
43630a0230
commit
5de29a3f17
5 changed files with 81 additions and 3 deletions
|
@ -70,5 +70,6 @@ typedef enum {
|
||||||
DEBUG_ACC,
|
DEBUG_ACC,
|
||||||
DEBUG_GENERIC,
|
DEBUG_GENERIC,
|
||||||
DEBUG_ITERM_RELAX,
|
DEBUG_ITERM_RELAX,
|
||||||
|
DEBUG_D_BOOST,
|
||||||
DEBUG_COUNT
|
DEBUG_COUNT
|
||||||
} debugType_e;
|
} debugType_e;
|
||||||
|
|
|
@ -77,7 +77,7 @@ tables:
|
||||||
- name: debug_modes
|
- name: debug_modes
|
||||||
values: ["NONE", "GYRO", "NOTCH", "NAV_LANDING", "FW_ALTITUDE", "AGL", "FLOW_RAW",
|
values: ["NONE", "GYRO", "NOTCH", "NAV_LANDING", "FW_ALTITUDE", "AGL", "FLOW_RAW",
|
||||||
"FLOW", "SBUS", "FPORT", "ALWAYS", "STAGE2", "WIND_ESTIMATOR", "SAG_COMP_VOLTAGE",
|
"FLOW", "SBUS", "FPORT", "ALWAYS", "STAGE2", "WIND_ESTIMATOR", "SAG_COMP_VOLTAGE",
|
||||||
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC", "GENERIC", "ITERM_RELAX"]
|
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC", "GENERIC", "ITERM_RELAX", "D_BOOST"]
|
||||||
- name: async_mode
|
- name: async_mode
|
||||||
values: ["NONE", "GYRO", "ALL"]
|
values: ["NONE", "GYRO", "ALL"]
|
||||||
- name: aux_operator
|
- name: aux_operator
|
||||||
|
@ -1136,6 +1136,16 @@ groups:
|
||||||
field: iterm_relax_cutoff
|
field: iterm_relax_cutoff
|
||||||
min: 1
|
min: 1
|
||||||
max: 100
|
max: 100
|
||||||
|
- name: d_boost_factor
|
||||||
|
field: dBoostFactor
|
||||||
|
condition: USE_D_BOOST
|
||||||
|
min: 1
|
||||||
|
max: 3
|
||||||
|
- name: d_boost_max_at_acceleration
|
||||||
|
field: dBoostMaxAtAlleceleration
|
||||||
|
condition: USE_D_BOOST
|
||||||
|
min: 1000
|
||||||
|
max: 16000
|
||||||
|
|
||||||
- name: PG_PID_AUTOTUNE_CONFIG
|
- name: PG_PID_AUTOTUNE_CONFIG
|
||||||
type: pidAutotuneConfig_t
|
type: pidAutotuneConfig_t
|
||||||
|
|
|
@ -115,7 +115,20 @@ static EXTENDED_FASTRAM uint8_t itermRelax;
|
||||||
static EXTENDED_FASTRAM uint8_t itermRelaxType;
|
static EXTENDED_FASTRAM uint8_t itermRelaxType;
|
||||||
static EXTENDED_FASTRAM float itermRelaxSetpointThreshold;
|
static EXTENDED_FASTRAM float itermRelaxSetpointThreshold;
|
||||||
|
|
||||||
PG_REGISTER_PROFILE_WITH_RESET_TEMPLATE(pidProfile_t, pidProfile, PG_PID_PROFILE, 8);
|
#if defined(USE_D_BOOST)
|
||||||
|
#define D_BOOST_GYRO_LPF_HZ 80 // Biquad lowpass input cutoff to peak D around propwash frequencies
|
||||||
|
#define D_BOOST_LPF_HZ 10 // PT1 lowpass cutoff to smooth the boost effect
|
||||||
|
|
||||||
|
static EXTENDED_FASTRAM float dBoostFactor;
|
||||||
|
static EXTENDED_FASTRAM float dBoostMaxAtAlleceleration;
|
||||||
|
static EXTENDED_FASTRAM pt1Filter_t dBoostLpf[XYZ_AXIS_COUNT];
|
||||||
|
static EXTENDED_FASTRAM biquadFilter_t dBoostGyroLpf[XYZ_AXIS_COUNT];
|
||||||
|
|
||||||
|
static EXTENDED_FASTRAM float previousRateTarget[XYZ_AXIS_COUNT] = {0, 0, 0};
|
||||||
|
static EXTENDED_FASTRAM float previousRateGyro[XYZ_AXIS_COUNT] = {0, 0, 0};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PG_REGISTER_PROFILE_WITH_RESET_TEMPLATE(pidProfile_t, pidProfile, PG_PID_PROFILE, 9);
|
||||||
|
|
||||||
PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
|
PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
|
||||||
.bank_mc = {
|
.bank_mc = {
|
||||||
|
@ -214,6 +227,8 @@ PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
|
||||||
.iterm_relax_type = ITERM_RELAX_SETPOINT,
|
.iterm_relax_type = ITERM_RELAX_SETPOINT,
|
||||||
.iterm_relax_cutoff = MC_ITERM_RELAX_CUTOFF_DEFAULT,
|
.iterm_relax_cutoff = MC_ITERM_RELAX_CUTOFF_DEFAULT,
|
||||||
.iterm_relax = ITERM_RELAX_OFF,
|
.iterm_relax = ITERM_RELAX_OFF,
|
||||||
|
.dBoostFactor = 1.0f,
|
||||||
|
.dBoostMaxAtAlleceleration = 7500.0f,
|
||||||
);
|
);
|
||||||
|
|
||||||
void pidInit(void)
|
void pidInit(void)
|
||||||
|
@ -229,6 +244,16 @@ void pidInit(void)
|
||||||
itermRelax = pidProfile()->iterm_relax;
|
itermRelax = pidProfile()->iterm_relax;
|
||||||
itermRelaxType = pidProfile()->iterm_relax_type;
|
itermRelaxType = pidProfile()->iterm_relax_type;
|
||||||
itermRelaxSetpointThreshold = MC_ITERM_RELAX_SETPOINT_THRESHOLD * MC_ITERM_RELAX_CUTOFF_DEFAULT / pidProfile()->iterm_relax_cutoff;
|
itermRelaxSetpointThreshold = MC_ITERM_RELAX_SETPOINT_THRESHOLD * MC_ITERM_RELAX_CUTOFF_DEFAULT / pidProfile()->iterm_relax_cutoff;
|
||||||
|
|
||||||
|
#ifdef USE_D_BOOST
|
||||||
|
dBoostFactor = pidProfile()->dBoostFactor;
|
||||||
|
dBoostMaxAtAlleceleration = pidProfile()->dBoostMaxAtAlleceleration;
|
||||||
|
|
||||||
|
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
|
||||||
|
biquadFilterInitLPF(&dBoostGyroLpf[axis], D_BOOST_GYRO_LPF_HZ, getLooptime());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pidInitFilters(void)
|
bool pidInitFilters(void)
|
||||||
|
@ -594,6 +619,43 @@ static void FAST_CODE applyItermRelax(const int axis, const float gyroRate, floa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef USE_D_BOOST
|
||||||
|
static float FAST_CODE applyDBoost(float rateTarget, float gyroRate, flight_dynamics_index_t axis) {
|
||||||
|
|
||||||
|
float dBoost = 1.0f;
|
||||||
|
|
||||||
|
if (dBoostFactor > 1) {
|
||||||
|
const float dBoostGyroDelta = (gyroRate - previousRateGyro[axis]) / dT;
|
||||||
|
const float dBoostGyroAcceleration = fabsf(biquadFilterApply(&dBoostGyroLpf[axis], dBoostGyroDelta));
|
||||||
|
const float dBoostStickAcceleration = fabsf((rateTarget - previousRateTarget[axis]) / dT);
|
||||||
|
|
||||||
|
const float acceleration = MAX(dBoostGyroAcceleration, dBoostStickAcceleration);
|
||||||
|
dBoost = scaleRangef(acceleration, 0.0f, dBoostMaxAtAlleceleration, 1.0f, dBoostFactor);
|
||||||
|
dBoost = pt1FilterApply4(&dBoostLpf[axis], dBoost, D_BOOST_LPF_HZ, dT);
|
||||||
|
dBoost = constrainf(dBoost, 1.0f, dBoostFactor);
|
||||||
|
|
||||||
|
if (axis == FD_ROLL) {
|
||||||
|
DEBUG_SET(DEBUG_D_BOOST, 0, dBoostGyroAcceleration);
|
||||||
|
DEBUG_SET(DEBUG_D_BOOST, 1, dBoostStickAcceleration);
|
||||||
|
DEBUG_SET(DEBUG_D_BOOST, 2, dBoost * 100);
|
||||||
|
} else if (axis == FD_PITCH) {
|
||||||
|
DEBUG_SET(DEBUG_D_BOOST, 3, dBoost * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
previousRateTarget[axis] = rateTarget;
|
||||||
|
previousRateGyro[axis] = gyroRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dBoost;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static float applyDBoost(float rateTarget, float gyroRate, flight_dynamics_index_t axis) {
|
||||||
|
UNUSED(rateTarget);
|
||||||
|
UNUSED(gyroRate);
|
||||||
|
UNUSED(axis);
|
||||||
|
return 1.0f
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void FAST_CODE pidApplyMulticopterRateController(pidState_t *pidState, flight_dynamics_index_t axis)
|
static void FAST_CODE pidApplyMulticopterRateController(pidState_t *pidState, flight_dynamics_index_t axis)
|
||||||
{
|
{
|
||||||
|
@ -634,7 +696,7 @@ static void FAST_CODE pidApplyMulticopterRateController(pidState_t *pidState, fl
|
||||||
newDTerm = firFilterApply(&pidState->gyroRateFilter);
|
newDTerm = firFilterApply(&pidState->gyroRateFilter);
|
||||||
|
|
||||||
// Calculate derivative
|
// Calculate derivative
|
||||||
newDTerm = newDTerm * (pidState->kD / dT);
|
newDTerm = newDTerm * (pidState->kD / dT) * applyDBoost(pidState->rateTarget, pidState->gyroRate, axis);
|
||||||
|
|
||||||
// Additionally constrain D
|
// Additionally constrain D
|
||||||
newDTerm = constrainf(newDTerm, -300.0f, 300.0f);
|
newDTerm = constrainf(newDTerm, -300.0f, 300.0f);
|
||||||
|
|
|
@ -127,6 +127,9 @@ typedef struct pidProfile_s {
|
||||||
uint8_t iterm_relax_type; // Specifies type of relax algorithm
|
uint8_t iterm_relax_type; // Specifies type of relax algorithm
|
||||||
uint8_t iterm_relax_cutoff; // This cutoff frequency specifies a low pass filter which predicts average response of the quad to setpoint
|
uint8_t iterm_relax_cutoff; // This cutoff frequency specifies a low pass filter which predicts average response of the quad to setpoint
|
||||||
uint8_t iterm_relax; // Enable iterm suppression during stick input
|
uint8_t iterm_relax; // Enable iterm suppression during stick input
|
||||||
|
|
||||||
|
float dBoostFactor;
|
||||||
|
float dBoostMaxAtAlleceleration;
|
||||||
} pidProfile_t;
|
} pidProfile_t;
|
||||||
|
|
||||||
typedef struct pidAutotuneConfig_s {
|
typedef struct pidAutotuneConfig_s {
|
||||||
|
|
|
@ -103,6 +103,8 @@
|
||||||
#define BOOTLOG_DESCRIPTIONS
|
#define BOOTLOG_DESCRIPTIONS
|
||||||
|
|
||||||
#define NAV_NON_VOLATILE_WAYPOINT_CLI
|
#define NAV_NON_VOLATILE_WAYPOINT_CLI
|
||||||
|
#define USE_D_BOOST
|
||||||
|
|
||||||
#else // FLASH_SIZE < 256
|
#else // FLASH_SIZE < 256
|
||||||
#define LOG_LEVEL_MAXIMUM LOG_LEVEL_ERROR
|
#define LOG_LEVEL_MAXIMUM LOG_LEVEL_ERROR
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue