1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-24 08:45:31 +03:00

Make gyro LULU independent from the gyro LPF

This commit is contained in:
Pawel Spychalski (DzikuVx) 2024-06-29 21:16:26 +02:00
parent f8cc253b4c
commit 6f40120a24
4 changed files with 33 additions and 10 deletions

View file

@ -76,6 +76,7 @@ typedef enum {
DEBUG_POS_EST,
DEBUG_ADAPTIVE_FILTER,
DEBUG_HEADTRACKING,
DEBUG_LULU,
DEBUG_COUNT
} debugType_e;

View file

@ -83,7 +83,7 @@ tables:
values: ["NONE", "AGL", "FLOW_RAW", "FLOW", "ALWAYS", "SAG_COMP_VOLTAGE",
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC",
"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
values: ["OR", "AND"]
enum: modeActivationOperator_e
@ -226,10 +226,16 @@ groups:
default_value: 250
field: gyro_anti_aliasing_lpf_hz
max: 1000
- name: gyro_lulu_enabled
description: "Enable/disable gyro LULU filter"
default_value: OFF
field: gyroLuluEnabled
type: bool
- name: gyro_lulu_sample_count
description: "Gyro lulu sample count, in number of samples."
default_value: 3
field: gyroLuluSampleCount
min: 1
max: 15
- name: gyro_main_lpf_hz
description: "Software based gyro main lowpass filter. Value is cutoff frequency (Hz)"

View file

@ -135,7 +135,8 @@ PG_RESET_TEMPLATE(gyroConfig_t, gyroConfig,
.adaptiveFilterIntegratorThresholdLow = SETTING_GYRO_ADAPTIVE_FILTER_INTEGRATOR_THRESHOLD_LOW_DEFAULT,
#endif
.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)
@ -248,9 +249,9 @@ static void initGyroFilter(filterApplyFnPtr *applyFn, filter_t state[], uint16_t
{
*applyFn = nullFilterApply;
if (cutoff > 0) {
*applyFn = (filterApplyFnPtr)pt1FilterApply;
for (int axis = 0; axis < 3; axis++) {
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
initGyroFilter(&gyroLpfApplyFn, gyroLpfState, gyroConfig()->gyro_anti_aliasing_lpf_hz, getGyroLooptime());
/*
luluFilterInit(&state[axis].lulu, cutoff);
*applyFn = (filterApplyFnPtr)luluFilterApply;
initGyroFilter(&gyroLpf2ApplyFn, gyroLpf2State, gyroConfig()->gyroLuluSampleCount, getLooptime(), FILTER_LULU);
*/
if (gyroConfig()->gyroLuluEnabled && gyroConfig()->gyroLuluSampleCount > 0) {
gyroLuluApplyFn = (filterApplyFnPtr)luluFilterApply;
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());
} else {
gyroLpf2ApplyFn = nullFilterApply;
@ -467,6 +471,17 @@ void FAST_CODE NOINLINE gyroFilter(void)
gyroADCf = rpmFilterGyroApply(axis, gyroADCf);
#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);
#ifdef USE_ADAPTIVE_FILTER

View file

@ -105,6 +105,7 @@ typedef struct gyroConfig_s {
uint8_t gyroFilterMode;
uint8_t gyroLuluSampleCount;
bool gyroLuluEnabled;
} gyroConfig_t;
PG_DECLARE(gyroConfig_t, gyroConfig);