mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-25 17:25:18 +03:00
Make gyro LULU independent from the gyro LPF
This commit is contained in:
parent
f8cc253b4c
commit
6f40120a24
4 changed files with 33 additions and 10 deletions
|
@ -76,6 +76,7 @@ typedef enum {
|
||||||
DEBUG_POS_EST,
|
DEBUG_POS_EST,
|
||||||
DEBUG_ADAPTIVE_FILTER,
|
DEBUG_ADAPTIVE_FILTER,
|
||||||
DEBUG_HEADTRACKING,
|
DEBUG_HEADTRACKING,
|
||||||
|
DEBUG_LULU,
|
||||||
DEBUG_COUNT
|
DEBUG_COUNT
|
||||||
} debugType_e;
|
} debugType_e;
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ tables:
|
||||||
values: ["NONE", "AGL", "FLOW_RAW", "FLOW", "ALWAYS", "SAG_COMP_VOLTAGE",
|
values: ["NONE", "AGL", "FLOW_RAW", "FLOW", "ALWAYS", "SAG_COMP_VOLTAGE",
|
||||||
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC",
|
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC",
|
||||||
"NAV_YAW", "PCF8574", "DYN_GYRO_LPF", "AUTOLEVEL", "ALTITUDE",
|
"NAV_YAW", "PCF8574", "DYN_GYRO_LPF", "AUTOLEVEL", "ALTITUDE",
|
||||||
"AUTOTRIM", "AUTOTUNE", "RATE_DYNAMICS", "LANDING", "POS_EST", "ADAPTIVE_FILTER", "HEADTRACKER" ]
|
"AUTOTRIM", "AUTOTUNE", "RATE_DYNAMICS", "LANDING", "POS_EST", "ADAPTIVE_FILTER", "HEADTRACKER", "LULU" ]
|
||||||
- name: aux_operator
|
- name: aux_operator
|
||||||
values: ["OR", "AND"]
|
values: ["OR", "AND"]
|
||||||
enum: modeActivationOperator_e
|
enum: modeActivationOperator_e
|
||||||
|
@ -226,10 +226,16 @@ groups:
|
||||||
default_value: 250
|
default_value: 250
|
||||||
field: gyro_anti_aliasing_lpf_hz
|
field: gyro_anti_aliasing_lpf_hz
|
||||||
max: 1000
|
max: 1000
|
||||||
|
- name: gyro_lulu_enabled
|
||||||
|
description: "Enable/disable gyro LULU filter"
|
||||||
|
default_value: OFF
|
||||||
|
field: gyroLuluEnabled
|
||||||
|
type: bool
|
||||||
- name: gyro_lulu_sample_count
|
- name: gyro_lulu_sample_count
|
||||||
description: "Gyro lulu sample count, in number of samples."
|
description: "Gyro lulu sample count, in number of samples."
|
||||||
default_value: 3
|
default_value: 3
|
||||||
field: gyroLuluSampleCount
|
field: gyroLuluSampleCount
|
||||||
|
min: 1
|
||||||
max: 15
|
max: 15
|
||||||
- name: gyro_main_lpf_hz
|
- name: gyro_main_lpf_hz
|
||||||
description: "Software based gyro main lowpass filter. Value is cutoff frequency (Hz)"
|
description: "Software based gyro main lowpass filter. Value is cutoff frequency (Hz)"
|
||||||
|
|
|
@ -135,7 +135,8 @@ PG_RESET_TEMPLATE(gyroConfig_t, gyroConfig,
|
||||||
.adaptiveFilterIntegratorThresholdLow = SETTING_GYRO_ADAPTIVE_FILTER_INTEGRATOR_THRESHOLD_LOW_DEFAULT,
|
.adaptiveFilterIntegratorThresholdLow = SETTING_GYRO_ADAPTIVE_FILTER_INTEGRATOR_THRESHOLD_LOW_DEFAULT,
|
||||||
#endif
|
#endif
|
||||||
.gyroFilterMode = SETTING_GYRO_FILTER_MODE_DEFAULT,
|
.gyroFilterMode = SETTING_GYRO_FILTER_MODE_DEFAULT,
|
||||||
.gyroLuluSampleCount = SETTING_GYRO_LULU_SAMPLE_COUNT_DEFAULT
|
.gyroLuluSampleCount = SETTING_GYRO_LULU_SAMPLE_COUNT_DEFAULT,
|
||||||
|
.gyroLuluEnabled = SETTING_GYRO_LULU_ENABLED_DEFAULT
|
||||||
);
|
);
|
||||||
|
|
||||||
STATIC_UNIT_TESTED gyroSensor_e gyroDetect(gyroDev_t *dev, gyroSensor_e gyroHardware)
|
STATIC_UNIT_TESTED gyroSensor_e gyroDetect(gyroDev_t *dev, gyroSensor_e gyroHardware)
|
||||||
|
@ -248,9 +249,9 @@ static void initGyroFilter(filterApplyFnPtr *applyFn, filter_t state[], uint16_t
|
||||||
{
|
{
|
||||||
*applyFn = nullFilterApply;
|
*applyFn = nullFilterApply;
|
||||||
if (cutoff > 0) {
|
if (cutoff > 0) {
|
||||||
|
*applyFn = (filterApplyFnPtr)pt1FilterApply;
|
||||||
for (int axis = 0; axis < 3; axis++) {
|
for (int axis = 0; axis < 3; axis++) {
|
||||||
pt1FilterInit(&state[axis].pt1, cutoff, US2S(looptime));
|
pt1FilterInit(&state[axis].pt1, cutoff, US2S(looptime));
|
||||||
*applyFn = (filterApplyFnPtr)pt1FilterApply;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,14 +261,17 @@ static void gyroInitFilters(void)
|
||||||
//First gyro LPF running at full gyro frequency 8kHz
|
//First gyro LPF running at full gyro frequency 8kHz
|
||||||
initGyroFilter(&gyroLpfApplyFn, gyroLpfState, gyroConfig()->gyro_anti_aliasing_lpf_hz, getGyroLooptime());
|
initGyroFilter(&gyroLpfApplyFn, gyroLpfState, gyroConfig()->gyro_anti_aliasing_lpf_hz, getGyroLooptime());
|
||||||
|
|
||||||
/*
|
if (gyroConfig()->gyroLuluEnabled && gyroConfig()->gyroLuluSampleCount > 0) {
|
||||||
luluFilterInit(&state[axis].lulu, cutoff);
|
gyroLuluApplyFn = (filterApplyFnPtr)luluFilterApply;
|
||||||
*applyFn = (filterApplyFnPtr)luluFilterApply;
|
|
||||||
|
|
||||||
initGyroFilter(&gyroLpf2ApplyFn, gyroLpf2State, gyroConfig()->gyroLuluSampleCount, getLooptime(), FILTER_LULU);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(gyroConfig()->gyroFilterMode != GYRO_FILTER_MODE_OFF) {
|
for (int axis = 0; axis < 3; axis++) {
|
||||||
|
luluFilterInit(&gyroLuluState[axis].lulu, gyroConfig()->gyroLuluSampleCount);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gyroLuluApplyFn = nullFilterApply;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gyroConfig()->gyroFilterMode != GYRO_FILTER_MODE_OFF) {
|
||||||
initGyroFilter(&gyroLpf2ApplyFn, gyroLpf2State, gyroConfig()->gyro_main_lpf_hz, getLooptime());
|
initGyroFilter(&gyroLpf2ApplyFn, gyroLpf2State, gyroConfig()->gyro_main_lpf_hz, getLooptime());
|
||||||
} else {
|
} else {
|
||||||
gyroLpf2ApplyFn = nullFilterApply;
|
gyroLpf2ApplyFn = nullFilterApply;
|
||||||
|
@ -467,6 +471,17 @@ void FAST_CODE NOINLINE gyroFilter(void)
|
||||||
gyroADCf = rpmFilterGyroApply(axis, gyroADCf);
|
gyroADCf = rpmFilterGyroApply(axis, gyroADCf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// LULU gyro filter
|
||||||
|
DEBUG_SET(DEBUG_LULU, axis, gyroADCf); //Pre LULU debug
|
||||||
|
float preLulu = gyroADCf;
|
||||||
|
gyroADCf = gyroLuluApplyFn((filter_t *) &gyroLuluState[axis], gyroADCf);
|
||||||
|
DEBUG_SET(DEBUG_LULU, axis + 3, gyroADCf); //Post LULU debug
|
||||||
|
|
||||||
|
if (axis == ROLL) {
|
||||||
|
DEBUG_SET(DEBUG_LULU, 6, gyroADCf - preLulu); //LULU delta debug
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gyro Main LPF
|
||||||
gyroADCf = gyroLpf2ApplyFn((filter_t *) &gyroLpf2State[axis], gyroADCf);
|
gyroADCf = gyroLpf2ApplyFn((filter_t *) &gyroLpf2State[axis], gyroADCf);
|
||||||
|
|
||||||
#ifdef USE_ADAPTIVE_FILTER
|
#ifdef USE_ADAPTIVE_FILTER
|
||||||
|
|
|
@ -105,6 +105,7 @@ typedef struct gyroConfig_s {
|
||||||
uint8_t gyroFilterMode;
|
uint8_t gyroFilterMode;
|
||||||
|
|
||||||
uint8_t gyroLuluSampleCount;
|
uint8_t gyroLuluSampleCount;
|
||||||
|
bool gyroLuluEnabled;
|
||||||
} gyroConfig_t;
|
} gyroConfig_t;
|
||||||
|
|
||||||
PG_DECLARE(gyroConfig_t, gyroConfig);
|
PG_DECLARE(gyroConfig_t, gyroConfig);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue